> 웹 프론트엔드 > JS 튜토리얼 > NodeJS로 크롤러를 만드는 전체 과정(계속)_node.js

NodeJS로 크롤러를 만드는 전체 과정(계속)_node.js

WBOY
풀어 주다: 2016-05-16 16:25:02
원래의
955명이 탐색했습니다.

이전 장에 이어 40페이지의 내용을 연속적으로 캡처하도록 프로그램을 수정해야 합니다. 즉, 각 기사의 제목, 링크, 첫 댓글, 댓글 사용자 및 포럼 포인트를 출력해야 합니다.

그림과 같이 $('.reply_author').eq(0).text().trim();에서 얻은 값이 첫 댓글을 단 사용자가 맞습니다.

{}

eventproxy가 댓글과 사용자 이름 콘텐츠를 얻은 후 사용자 포인트를 계속 확보하려면 사용자 이름을 통해 사용자 인터페이스로 점프해야 합니다

코드 복사 코드는 다음과 같습니다.

var $ =cherio.load(topicHtml);
//이 URL은 다음 단계의 대상 URL입니다
var userHref = 'https://cnodejs.org' $('.reply_author').eq(0).attr('href');
userHref = url.resolve(tUrl, userHref);
var title = $('.topic_full_title').text().trim().replace(/n/g,"");;
var href = topicUrl;
var comment1 = $('.reply_content').eq(0).text().trim();
var Author1 = $('.reply_author').eq(0).text().trim();
//다음 동시 크롤링에 매개변수 전달
ep.emit('user_html', [userHref, title, href, comment1, 작성자1]);

이번 eventproxy에서는 점수가 어디에 있는지(class="big") 찾아야 합니다.

{}

클래스 이름을 찾는 것은 쉽습니다. 먼저 결과를 출력해 보겠습니다

코드 복사 코드는 다음과 같습니다.

var 결과 = superagent.get(userUrl)
.end(함수(err, res) {
만약 (오류) {
                return console.error(err);
}
      var $ =cherio.load(res.text);
      var 점수 = $('.big').text().trim();
console.log(사용자[1]);
console.log(사용자[2]);
console.log(사용자[3]);
console.log(사용자[4]);
console.log($('.big').text().trim());
         반품({
              제목: 사용자[1],
             href: 사용자[2],
              댓글1: 사용자[3],
              작성자1: 사용자[4],
점수1: 점수
        });
});
});

프로그램을 실행하고 이 코드의 결과를 얻으세요.

{<3>}

그런데 여기서 문제가 발생합니다. .end()의 콜백 함수에서는 결과를 올바르게 출력할 수 있지만 결과를 올바르게 출력할 수는 없습니다. 잘 살펴보면 출력해야 할 결과는 Request 객체입니다. 이는 부주의한 실수입니다. .end() 함수는 반환 값을 Request 개체에 전달하지 않으며 결과는 이전 계층(사용자)에게 반환되어야 합니다.

코드 복사 코드는 다음과 같습니다.

//사용자 세부정보 찾기
ep.after('user_html', topicUrls.length, function(users){
    사용자 = users.map(함수(사용자){
        var userUrl = user[0];
        var 점수;
        superagent.get(userUrl)
            .end(함수(err, res) {
                if (err) {
                    return console.error(err);
                }
                //console.log(res.text);
                var $ =cherio.load(res.text);
                점수 = $('.big').text().trim();
            });
        반환 ({
            제목: 사용자[1],
            href: 사용자[2],
            댓글 1: 사용자[3],
            작성자1: 사용자[4],
            점수1: 점수
        });
    });

把users好好地输流发现除了score1其他是正确值。仔细调试发现,程序是先进行了console.log(),然后再进行.map()。更准确地说,在.map()函数内,.get()의 回调函数并没有执行完赋值score, return 返回值就进行了.待回调函数做完操 창작.

{<4>}

내가 만든 이벤트 프록시는 1개의 이벤트를 생성합니다.收完毕,再打印传递的参数(结果)。

复主代码 代码如下:

점수 = $('.big')text().trim();
//새로운 사업
ep.emit('got_score', [user[1], user[2], user[3], user[4], Score]);
.....
ep.after('got_score', 10, 함수(사용자){
console.log(사용자);
});

{}

这个问题解决了,但score1 의 数值好이미지 太大了点吧。再一看,原来class='big'有两个 , 用户的话题收藏也是属于这个class。我们得过cheerio的.slice( 시작, [끝] )来切取第一个元素,即将score 修改为 Score = $('.big').slice(0).eq(0).text().trim();。正确结果如图。

{}

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿