1. 서문
크롤러에 대한 예비 탐색이라고 합니다. 실제로는 크롤러와 관련된 타사 라이브러리를 사용하지 않으며 주로 node.js 기본 모듈인 http와 웹페이지 분석 도구인 cherrio를 사용합니다. http를 이용하여 해당 URL 경로에 해당하는 웹페이지 리소스를 직접 얻은 후, cherrio를 이용하여 분석합니다. 여기에는 이해를 돕기 위해 내가 연구한 주요 사례를 입력했습니다. 코딩 과정에서 처음으로 jq로 얻은 객체를 forEach를 사용하여 직접 순회했는데, 이는 jq에 해당 메소드가 없고 js 배열만 호출할 수 있었기 때문입니다.
2. 지식 포인트
①: Superagent는 웹페이지를 캡처하는 도구입니다. 나는 아직 그것을 사용하지 않았습니다.
②: 체리오 웹 분석 도구는 문법이 동일하기 때문에 서버측에서는 jQuery로 이해하시면 됩니다.
렌더링
1. 웹페이지 전체 캡쳐
2. 분석된 데이터, 제공된 예시는 사례 구현 예시입니다.
크롤러 초기 소스코드 분석
var http=require('http'); var cheerio=require('cheerio'); var url='http://www.imooc.com/learn/348'; /**************************** 打印得到的数据结构 [{ chapterTitle:'', videos:[{ title:'', id:'' }] }] ********************************/ function printCourseInfo(courseData){ courseData.forEach(function(item){ var chapterTitle=item.chapterTitle; console.log(chapterTitle+'\n'); item.videos.forEach(function(video){ console.log(' 【'+video.id+'】'+video.title+'\n'); }) }); } /************* 分析从网页里抓取到的数据 **************/ function filterChapter(html){ var courseData=[]; var $=cheerio.load(html); var chapters=$('.chapter'); chapters.each(function(item){ var chapter=$(this); var chapterTitle=chapter.find('strong').text(); //找到章节标题 var videos=chapter.find('.video').children('li'); var chapterData={ chapterTitle:chapterTitle, videos:[] }; videos.each(function(item){ var video=$(this).find('.studyvideo'); var title=video.text(); var id=video.attr('href').split('/video')[1]; chapterData.videos.push({ title:title, id:id }) }) courseData.push(chapterData); }); return courseData; } http.get(url,function(res){ var html=''; res.on('data',function(data){ html+=data; }) res.on('end',function(){ var courseData=filterChapter(html); printCourseInfo(courseData); }) }).on('error',function(){ console.log('获取课程数据出错'); })
참고:
https://github.com/ alsotang/node-lessons/tree/master/lesson3