书接上回,我们需要修改程序以达到连续抓取40个页面的内容。也就是说我们需要输出每篇文章的标题、链接、第一条评论、评论用户和论坛积分。
如图所示,$('.reply_author').eq(0).text().trim();得到的值即为正确的第一条评论的用户。
{<1>}
在eventproxy获取评论及用户名内容后,我们需要通过用户名跳到用户界面继续抓取该用户积分
var $ = cheerio.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, author1]);
在eventproxy这一次中,我们要找到score是放在哪里(class="big")。
{<2>}
找到classname就好办了,我们先试着把结果输出一下
var outcome = superagent.get(userUrl) .end(function (err, res) { if (err) { return console.error(err); } var $ = cheerio.load(res.text); var score = $('.big').text().trim(); console.log(user[1]); console.log(user[2]); console.log(user[3]); console.log(user[4]); console.log($('.big').text().trim()); return ({ title: user[1], href: user[2], comment1: user[3], author1: user[4], score1: score }); }); });
运行程序,这段代码得到的结果。
{<3>}
但是问题来了,我们在.end()的回调函数中能正确输出结果,但是不能正确的输出outcome。仔细一看,需要输出的outcome是一个Request对象。这是因为粗心犯的错的,.end()函数并不会传递返回值给Request对象,需要将结果返回到上一层(users)。
//find userDetails ep.after('user_html', topicUrls.length, function(users){ users = users.map(function(user){ var userUrl = user[0]; var score; superagent.get(userUrl) .end(function (err, res) { if (err) { return console.error(err); } //console.log(res.text); var $ = cheerio.load(res.text); score = $('.big').text().trim(); }); return ({ title: user[1], href: user[2], comment1: user[3], author1: user[4], score1: score }); });
把users好好地输出发现除了score1其他是正确值。仔细调试发现,程序是先进行了console.log(),然后再进行.map()。更准确地说,在.map()函数内,.get()的回调函数并没有执行完赋值score,return 返回值就进行了。这就是回调函数的异步,而外层的同步操作是不会等待回调函数做完操作的。
{<4>}
我的做法就是eventproxy再emit一层消息,伴随着消息把需要的数据一起传递给接收消息操作.after(),只有当消息全部接收完毕,再打印出传递的参数(结果)。
score = $('.big')text().trim(); //新添加 ep.emit('got_score', [user[1], user[2], user[3], user[4], score]); ..... ep.after('got_score', 10, function(users){ console.log(users); });
{<6>}
这个问题解决了,但score1的数值好像太大了点吧。再一看,原来class='big'有两个,用户的话题收藏也是属于这个class。我们得通过cheerio的.slice( start, [end] )来切取第一个元素,即将score 修改为 score = $('.big').slice(0).eq(0).text().trim();。正确结果如图。
{<7>}
本文向大家介绍nodejs制作小爬虫功能示例,包括了nodejs制作小爬虫功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了nodejs制作小爬虫功能。分享给大家供大家参考,具体如下: 1 安装nodejs 2 安装需要模块 3 新建js文件 4 引入 5 利用request模块发送请求 一个小爬虫案例就完了 附上完整代码 下面的带数据库 希望本文所述对大家node.js程序设计有所
本文向大家介绍node+express制作爬虫教程,包括了node+express制作爬虫教程的使用技巧和注意事项,需要的朋友参考一下 最近开始重新学习node.js,之前学的都忘了。所以准备重新学一下,那么,先从一个简单的爬虫开始吧。 什么是爬虫 百度百科的解释: 爬虫即网络爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫而做出的优化。 通俗一
本文向大家介绍nodejs制作爬虫实现批量下载图片,包括了nodejs制作爬虫实现批量下载图片的使用技巧和注意事项,需要的朋友参考一下 今天想获取一大批猫的图片,然后就在360流浪器搜索框中输入 猫 ,然后点击图片。就看到了一大波猫的图片: http://image.so.com/i?q=%E7%8... ,我在想啊,要是审查元素,一张张手动下载,多麻烦,所以打算写程序来实现。不写不知道,一写发现
本文向大家介绍python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门),包括了python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)的使用技巧和注意事项,需要的朋友参考一下 【python爬虫基础入门】系列是对python爬虫的一个入门练习实践,旨在用最浅显易懂的语言,总结最明了,最适合自己的方法,本人一直坚信,总结才会使人提高 1
本文向大家介绍python制作爬虫爬取京东商品评论教程,包括了python制作爬虫爬取京东商品评论教程的使用技巧和注意事项,需要的朋友参考一下 本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化。下面是要抓取的商品信息,一款女士文胸。这个商品共有红色,黑色和肤色三种颜色, 70B到90D共18个尺寸,以及超过700条的购买评论。 京东商品评论
本文向大家介绍nodejs爬虫初试superagent和cheerio,包括了nodejs爬虫初试superagent和cheerio的使用技巧和注意事项,需要的朋友参考一下 前言 早就听过爬虫,这几天开始学习nodejs,写了个爬虫https://github.com/leichangchun/node-crawlers/tree/master/superagent_cheerio_demo