手机版

NodeJS制作爬虫的全过程(续)

时间:2021-10-16 来源:互联网 编辑:宝哥软件园 浏览:

上次需要修改程序连续抓取40页。也就是说,我们需要输出每篇文章的标题、链接、第一条评论、评论用户和论坛评分。

如图所示,$('。reply _ author’)。eq (0)。文本()。trim();获得的值是正确的第一个注释的用户。

{1}

eventproxy得到评论和用户名后,我们需要通过用户名跳转到用户界面,继续抓取用户点。

复制代码如下: var $=chef . load(topichtml);//此URL是下次爬网的目标URL:varuser href=' https://cnodejs . org ' $('。reply _ author’)。eq (0)。attr(' href ');userHref=url.resolve(tUrl,user href);var title=$('。topic _ full _ title’)。文本()。修剪()。替换(/\ n/g ' ');var href=topicUrlvar comment1=$('。reply _ content’)。eq(0)。文本()。trim();var author1=$('。reply _ author’)。eq(0)。文本()。trim();//将参数传递给下一个并发爬网ep.emit ('user _ html ',[user href,title,href,comment1,author 1]);

在这个eventproxy中,我们需要找出分数的位置(class='big ')。

{2}

很容易找到类名。让我们先试着输出结果。

复制代码如下: var Output=super agent . get(user URL)。END(函数(err,RES){ if(err){ return console . err(err);} var $=cheerio . load(RES . text);var score=$('。大’)。文本()。trim();console.log(用户[1]);console.log(用户[2]);console.log(用户[3]);console.log(用户[4]);console.log($(')。大’)。文本()。trim());return ({ title: user[1],href: user[2],comment1: user[3],author1: user[4],score 1: score });});});

运行这个程序,这个代码的结果。

{3}

但问题是。我们可以在的回调函数中正确输出结果。end(),但我们无法正确输出结果。仔细看,要输出的结果是一个请求对象。这是因为粗心的错误。那个。end()函数不将返回值传递给Request对象,需要将结果返回给上一级(用户)。

复制代码如下://查找用户详细信息ep.after ('user _ html ',topic URLs.length,function(users){ users=users . map(function(user){ var user URL=user[0];var分数;superagent.get(userUrl)。end(function (err,RES){ if(err){ return console . error(err);}//console . log(RES . text);var $=cheerio . load(RES . text);分数=$('。大’)。文本()。trim();});return ({ title: user[1],href: user[2],comment1: user[3],author1: user[4],score 1: score });});

很好地输出用户,发现除了score1之外,所有的值都是正确的。经过仔细调试,发现程序先执行console.log(),然后。地图()。更准确地说,在。map()函数,的回调函数。get()没有完成赋值得分,所以返回值完成了。这就是回调函数的异步性,外部同步操作不会等待回调函数完成操作。

{4}

我的方法是eventproxy发出一层消息,并与消息一起向消息接收操作传输所需的数据。在()之后。只有当接收到所有信息时,才能打印出传输的参数(结果)。

复制代码如下:score=$('。大')文本()。trim();//添加EP。emit ('got _ score ',[user [1],user [2],user [3],user [4],score]);EP . after(' get _ score ',10,function(users){ console . log(users);});

{6}

这个问题解决了,但是分数1好像有点太大了。再次证明,有两个类='大',用户的话题集合也属于这个类。我们必须切断第一个元素。切里欧的切片(开始,[结束]),也就是把分数改成score=$('。大’)。切片(0)。eq (0)。文本()。trim();正确的结果如图所示。

{7}

版权声明:NodeJS制作爬虫的全过程(续)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。