이전 장에 이어 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();。正确结果如图。
{}