首页 >>  正文

如何使用nodejs做爬虫程序

来源:www.zuowenzhai.com    作者:编辑   日期:2024-05-19
如何使用nodejs做爬虫程序

《使用 superagent 与 cheerio 完成简单爬虫》
目标
建立一个 lesson3 项目,在其中编写代码。
当在浏览器中访问 http://localhost:3000/ 时,输出 CNode(https://cnodejs.org/ ) 社区首页的所有帖子标题和链接,以 json 的形式。
输出示例:
[
{
"title": "【公告】发招聘帖的同学留意一下这里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12"
},
{
"title": "发布一款 Sublime Text 下的 JavaScript 语法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f"
}
]


挑战
访问 http://localhost:3000/ 时,输出包括主题的作者,
示例:
[
{
"title": "【公告】发招聘帖的同学留意一下这里",
"href": "http://cnodejs.org/topic/541ed2d05e28155f24676a12",
"author": "alsotang"
},
{
"title": "发布一款 Sublime Text 下的 JavaScript 语法高亮插件",
"href": "http://cnodejs.org/topic/54207e2efffeb6de3d61f68f",
"author": "otheruser"
}
]

知识点
学习使用 superagent 抓取网页
学习使用 cheerio 分析网页
课程内容
Node.js 总是吹牛逼说自己异步特性多么多么厉害,但是对于初学者来说,要找一个能好好利用异步的场景不容易。我想来想去,爬虫的场景就比较适合,没事就异步并发地爬几个网站玩玩。
本来想教大家怎么爬 github 的 api 的,但是 github 有 rate limit 的限制,所以只好牺牲一下 CNode 社区(国内最专业的 Node.js 开源技术社区),教大家怎么去爬它了。
我们这回需要用到三个依赖,分别是 express,superagent 和 cheerio。
先介绍一下,
superagent(http://visionmedia.github.io/superagent/ ) 是个 http 方面的库,可以发起 get 或 post 请求。
cheerio(https://github.com/cheeriojs/cheerio ) 大家可以理解成一个 Node.js 版的 jquery,用来从网页中以 css selector 取数据,使用方式跟 jquery 一样一样的。
还记得我们怎么新建一个项目吗?
新建一个文件夹,进去之后 npm init
安装依赖 npm install --save PACKAGE_NAME
写应用逻辑
我们应用的核心逻辑长这样
app.get('/', function (req, res, next) {
// 用 superagent 去抓取 https://cnodejs.org/ 的内容
superagent.get('https://cnodejs.org/')
.end(function (err, sres) {
// 常规的错误处理
if (err) {
return next(err);
}
// sres.text 里面存储着网页的 html 内容,将它传给 cheerio.load 之后
// 就可以得到一个实现了 jquery 接口的变量,我们习惯性地将它命名为 `$`
// 剩下就都是 jquery 的内容了
var $ = cheerio.load(sres.text);
var items = [];
$('#topic_list .topic_title').each(function (idx, element) {
var $element = $(element);
items.push({
title: $element.attr('title'),
href: $element.attr('href')
});
});

res.send(items);
});
});

OK,一个简单的爬虫就是这么简单。这里我们还没有利用到 Node.js 的异步并发特性。不过下两章内容都是关于异步控制的。
记得好好看看 superagent 的 API,它把链式调用的风格玩到了极致。

解压到一个目录,在cmd命令控制台进入该目录,运行npm install安装依赖包。之后运行node 爬虫主程序.js。

1、如果是定向爬取几个页面,做一些简单的页面解析,爬取效率不是核心要求,那么用什么语言差异不大。
当然要是页面结构复杂,正则表达式写得巨复杂,尤其是用过那些支持xpath的类库/爬虫库后,就会发现此种方式虽然入门门槛低,但扩展性、可维护性等都奇差。因此此种情况下还是推荐采用一些现成的爬虫库,诸如xpath、多线程支持还是必须考虑的因素。

2、如果是定向爬取,且主要目标是解析js动态生成的内容
此时候,页面内容是有js/ajax动态生成的,用普通的请求页面->解析的方法就不管用了,需要借助一个类似firefox、chrome浏览器的js引擎来对页面的js代码做动态解析。
此种情况下,推荐考虑casperJS+phantomjs或slimerJS+phantomjs ,当然诸如selenium之类的也可以考虑。

3、如果爬虫是涉及大规模网站爬取,效率、扩展性、可维护性等是必须考虑的因素时候
大规模爬虫爬取涉及诸多问题:多线程并发、I/O机制、分布式爬取、消息通讯、判重机制、任务调度等等,此时候语言和所用框架的选取就具有极大意义了。
PHP对多线程、异步支持较差,不建议采用。
NodeJS:对一些垂直网站爬取倒可以,但由于分布式爬取、消息通讯等支持较弱,根据自己情况判断。
Python:强烈建议,对以上问题都有较好支持。尤其是Scrapy框架值得作为第一选择。优点诸多:支持xpath;基于twisted,性能不错;有较好的调试工具;
此种情况下,如果还需要做js动态内容的解析,casperjs就不适合了,只有基于诸如chrome V8引擎之类自己做js引擎。
至于C、C++虽然性能不错,但不推荐,尤其是考虑到成本等诸多因素;对于大部分公司还是建议基于一些开源的框架来做,不要自己发明轮子,做一个简单的爬虫容易,但要做一个完备的爬虫挺难的。

像我搭建的微信公众号内容聚合的网站 就是基于Scrapy做的,当然还涉及消息队列等。可以参考下图:

具体内容可以参考 一个任务调度分发服务的架构


19748344086如何使用nodejs做爬虫程序
袁哑翔答:此时候,页面内容是有js/ajax动态生成的,用普通的请求页面->解析的方法就不管用了,需要借助一个类似firefox、chrome浏览器的js引擎来对页面的js代码做动态解析。此种情况下,推荐考虑casperJS+phantomjs或slimerJS+phantomjs ,当然诸如selenium之类的也可以考虑。3、如果爬虫是涉及大规模网站爬取,效率、...

19748344086node实现爬虫的几种简易方式
袁哑翔答:第一种方式,采用node,js中的 superagent+request + cheerio。cheerio是必须的,它相当于node版的jQuery,用过jQuery的同学会非常容易上手。它主要是用来获取抓取到的页面元素和其中的数据信息。superagent是node里一个非常方便的、轻量的、渐进式的第三方客户端请求代理模块,用他来请求目标页面。node中,...

19748344086如何使用Node.js爬取任意网页资源并输出PDF文件到本地
袁哑翔答:可以通过Puppeteer的提供的api直接控制Chrome模拟大部分用户操作来进行UI Test或者作为爬虫访问页面来收集数据。 环境和安装 Puppeteer本身依赖6.4以上的Node,但是为了异步超级好用的async/await,推荐使用7.6版本以上的Node。另外headless Chrome本身对服务器依赖的库的版本要求比较高,centos服务器依赖偏稳定,...

19748344086nodejs读取pdf并翻转内容保存pdf
袁哑翔答:1、启动windows命令行工具(windows下启动系统搜索功能,输入cmd回车就出来了)。2、查看环境变量是否已经自动配置,在命令行工具中输入node-v,如果出现v10字段,则说明成功安装Node.js。3、在第三步发现输入node-v还是没有出现对应的字段,那么重启电脑即可。4、打开本项目文件夹,打开命令行工具(windows...

19748344086nodejs可以用来做什么
袁哑翔答:1、nodejs 搭配 MongoDB 作后端;2、nodejs 搭配 “终端” 作前端的编译工具使用;3、编辑一些小工具,例如 “网络爬虫” 啥的;4、在不使用浏览器的控制台功能时,可用 nodejs 达到同样的目的,如下面两张图所示:

19748344086Python,Node.js 哪个比较适合写爬虫
袁哑翔答:简单的定向爬取:Python + urlib2 + RegExp + bs4 或者 Node.js + co,任一一款dom框架或者html parser + Request + RegExp 撸起来也是很顺手。对我来说上面两个选择差不多是等价的,但主要我JS比较熟,现在选择Node平台会多一些。上规模的整站爬取:Python + Scrapy 如果说上面两个方案里...

19748344086Python,Node.js 哪个比较适合写爬虫
袁哑翔答:最后说Python。如果你对效率没有极端的要求,那么推荐用Python!首先,Python的语法很简洁,同样的语句,可以少敲很多次键盘。然后,Python非常适合做数据的处理,比如函数参数的打包解包,列表解析,矩阵处理,非常方便。Python更加实用1、在日常做爬虫的时候,我更加倾向于Python,使用Python做爬虫有以下几个...

19748344086java爬虫怎么抓取js动态生成的内容
袁哑翔答:我用Jsoup写爬虫,一般遇到html返回没有的内容。但是浏览器显示有的内容。都是分析页面的http请求日志。分析页面JS代码来解决。1、有些页面元素被隐藏起来了->换selector解决 2、有些数据保存在js/json对象中->截取对应的串,分析解决 3、通过api接口调用->伪造请求获得数据 还有一个终极方法 4、使用...

19748344086如何运行NodeJS程序
袁哑翔答:在Windows环境中运行NodeJS程序,将代码文件保存到NodeJS安装文件的根目录,运行文件的时候,需要打开cmd,然后输入NodeJS的安装盘名称,例如:D:,点击回车键;再输入cd以及NodeJS的安装文件路径,点击回车键;然后输入node +保存的js文件名,然后点击回车键,即可将程序运行起来。还有其他小插件自行百度 ...

19748344086什么是爬虫和爬虫的基本流程
袁哑翔答:通常爬虫是从某个网站的某个页面开始,爬取这个页面的内容,找到网页中的其他链接地址,然后从这个地址爬到下一个页面,这样一直不停的爬下去,进去批量的抓取信息。那么,我们可以看出网络爬虫就是一个不停爬取网页抓取信息的程序。爬虫的基本流程:1.发起请求: 通过HTTP库向目标站点发起请求,即发送一...


(编辑:幸颖许)
联系方式:
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 作文摘要网