Node.js抓取网页
前几天四六级成绩出来(然而我没考),用Node.js做了一个模拟表单提交并抓取数据的Web
总结一下用到的知识,简单的网页抓取大概就是这个流程了
发送Get或Post请求
表单提交,首先弄到原网页提交的地址,然后引入http或https模块
也可以下载使用request模块。
这边以get为例
1 | var http = require('http'); |
如果是post请求,需要在req.end()
之前用req.write(content)
写入请求参数
Transfer-Encoding:chunked?
有时候服务器的response header会带有一个Transfer-Encoding,如果是chunked,说明服务器是分段传输数据的
这种情况下,会触发多次res的data事件,因此可以先定义一个变量,然后在data事件处理函数中将接收到的数据拼接起来
1 | var req = http.request(options, function(res){ |
使用zlib库解压gzip压缩过的html
现在很多网站在进行数据传输时都会先用gzip或deflate压缩以减小传输数据的体积,这样,我们请求到的数据就是压缩过的数据,无法正常解析,因此需要先解压
Node.js带有一个zlib库可以用来解压gzip格式的数据
我们可以利用Node.js的管道流机制,将接收到的数据先通过pipe()交给zlib处理,然后再进行我们自己的处理
1 | var zlib = require('zlib'); |
压缩html字符串(去除换行符)
接收到的data如果不是json格式而是html,就需要进一步处理
但是在html中有各种换行符,不方便进行正则匹配,因此先把换行符去掉
1 | htmlstring = htmlstring.replace(/[\r\n]/g, ''); |
用正则表达式提取有用的信息
去除了烦人的换行符后,就可以愉快地用正则来获取我们需要的信息啦
什么?你不会用正则?
学啊,相信你肯定搜到过这个 正则表达式30分钟入门教程 ,需要的时候看一看。
大致的匹配流程是这样的:
1 | var reg = new RegExp(''); //参数为正则的pattern |
这里贴个MDN上的文档,提高提高姿势水平
- [RegExp - JavaScript | MDN][]
- [String.prototype.match() - JavaScript | MDN][]
解析html(可选)
如果你不想用正则对html数据进行处理,没关系,还可以选择对html数据构造DOM树,然后通过各种选择器来获取你需要的数据
像是node-jquery、node-htmlparser之类的,具体的做法问Google吧,这边贴上一篇文章供参考 NodeJS 中寻找可用的 HTMLParser
我也没用过,就不多说了。
参考
- How do I ungzip (decompress) a NodeJS request’s module gzip response body?
- 正则表达式30分钟入门教程
- [RegExp - JavaScript | MDN][]
- [String.prototype.match() - JavaScript | MDN][]