오늘, Alsotang의 Crawler 튜토리얼과 Crawl Cnode를 배우겠습니다.
프로젝트 Craelr-Demo를 만듭니다
먼저 Express 프로젝트를 작성한 다음 App.js 파일의 모든 내용을 삭제합니다. 당분간 웹쪽에 컨텐츠를 표시 할 필요가 없기 때문입니다. 물론 npm install express 빈 폴더에서 직접 필요한 Express 기능을 사용할 수도 있습니다.
목표 웹 사이트 분석
그림과 같이, 이것은 Cnode 홈페이지의 DIV 태그의 일부입니다. 우리는이 일련의 ID와 클래스를 사용하여 필요한 정보를 찾습니다.
SuperAgent를 사용하여 소스 데이터를 얻으십시오
SuperAgent는 Ajax API에서 사용하는 HTTP 라이브러리입니다. jQuery와 유사하게 사용됩니다 , GET 요청을 시작하여 콜백 함수에서 결과를 출력합니다.
코드 사본은 다음과 같습니다.
var express = 요구 사항 ( 'Express');
var url = 요구 사항 ( 'url'); // 작동 URL을 구문 분석합니다
var superagent = require ( 'superagent'); // NPM 설치를 잊지 마십시오
var Cheeseio = 요구 사항 ( 'Cheerio');
var eventProxy = require ( 'eventProxy');
var targeturl = 'https://cnodejs.org/';
SuperAgent.get (TargetUrl)
.end (function (err, res) {
Console.log (Res);
});
결과는 대상 URL 정보를 포함하는 객체이며 웹 사이트 콘텐츠는 주로 텍스트 (문자열)에 있습니다.
cheatio를 사용하여 구문 분석하십시오
Cheerio는 서버 측 JQuery 함수 역할을합니다. 먼저 .load ()를 사용하여 HTML을로드 한 다음 CSS 선택기를 통해 요소를 필터링합니다.
코드 사본은 다음과 같습니다.
var $ = headeio.load (res.text);
// CSS 선택기를 통한 데이터 필터
$ ( '#topic_list .topic_title'). 각 (함수 (idx, element) {
Console.log (요소);
});
결과는 객체이며 .each(function(index, element)) 함수는 각 객체를 통해 반복하도록 호출되고 HTML dom 요소가 반환됩니다.
출력 console.log($element.attr('title'));广州2014年12月06日NodeParty 之UC 场입니다.
이와 같은 제목의 경우 output console.log($element.attr('href')); 결과는 /topic/545c395becbcb78265856eb2 와 같은 URL입니다. 그런 다음 nodejs1의 url.resolve () 함수를 사용하여 전체 URL을 완료하십시오.
코드 사본은 다음과 같습니다.
SuperAgent.get (TURL)
.end (function (err, res) {
if (err) {
return console.error (err);
}
var topicurls = [];
var $ = headeio.load (res.text);
// 홈페이지에서 모든 링크를 가져옵니다
$ ( '#topic_list .topic_title'). 각 (함수 (idx, element) {
var $ 요소 = $ (요소);
var href = url.resolve (turl, $ element.attr ( 'href'));
Console.log (HREF);
//topicurls.push(href);
});
});
EventProxy를 사용하여 각 주제에서 콘텐츠를 동시에 크롤링하십시오
자습서는 깊은 중첩 (직렬) 방법 및 카운터 메소드의 예를 보여줍니다. EventProxy는 이벤트 (병렬) 메소드를 사용 하여이 문제를 해결합니다. 모든 크롤링이 완료되면 EventProxy는 이벤트 메시지를 수신 할 때 처리 기능을 자동으로 호출합니다.
코드 사본은 다음과 같습니다.
// 1 단계 : EventProxy 인스턴스를 얻습니다
var ep = 새로운 eventProxy ();
// 2 단계 : 이벤트를 듣는 콜백 함수를 정의합니다.
// 방법이 반복 된 후 청취 한 후
// params : eventName (문자열) 이벤트 이름, 시간 (번호) 수술 번호, 콜백 콜백 함수
ep.after ( 'topic_html', topicurls.length, function (주제) {
// 주제는 ep.emit ( 'topic_html', 쌍)에 40 쌍이 포함 된 배열입니다.
//.지도
주제 = topics.map (function (topicpair) {
// Cheerio를 사용합니다
var topicurl = topicpair [0];
var topichtml = topicpair [1];
var $ = cheestio.load (topichtml);
반품 ({
제목 : $ ( '. Topic_full_title'). text (). trim (),
Href : Topicurl,
주석 1 : $ ( '. Reply_Content'). eq (0) .text (). trim ()
});
});
//결과
Console.log ( '결과 :');
Console.log (주제);
});
// 3 단계 : 이벤트 메시지 릴리스를 결정합니다
topicurls.foreach (function (topicurl) {
SuperAgent.get (topicurl)
.end (function (err, res) {
console.log ( 'fetch' + topicurl + 'success');
ep.emit ( 'topic_html', [topicurl, res.text]);
});
});
결과는 다음과 같습니다
연장 운동 (도전)
메시지 사용자 이름과 포인트를 가져옵니다
기사 페이지의 소스 코드에서 주석의 사용자 클래스 이름을 찾으면 Classname은 reply_author입니다. Console.log First Element $('.reply_author').get(0) 여기에서 모든 것을 가져와야한다는 것을 알 수 있습니다.
먼저 기사를 기어 다니고 한 번에 필요한 모든 것을 얻을 수 있습니다.
코드 사본은 다음과 같습니다.
var userhref = url.resolve (turl, $ ( '. reply_author'). get (0) .attribs.href);
Console.log (userhref);
console.log ($ ( '. reply_author'). get (0) .Children [0] .data);
https://cnodejs.org/user/username 통해 포인트 정보를 가져올 수 있습니다
코드 사본은 다음과 같습니다.
$ ( '. reply_author'). 각 (함수 (idx, element) {
var $ 요소 = $ (요소);
console.log ($ element.attr ( 'href'));
});
사용자 정보 페이지에서 $('.big').text().trim() 포인트 정보입니다.
첫 번째 요소를 얻으려면 Cheatio의 function.get (0)을 사용하십시오.
코드 사본은 다음과 같습니다.
var userhref = url.resolve (turl, $ ( '. reply_author'). get (0) .attribs.href);
Console.log (userhref);
이것은 단일 기사의 크롤링 일 뿐이며 여전히 40 개의 기사에 대해 수정해야 할 사항이 여전히 있습니다.