Node.js抓取网页

原创 2016年08月29日 17:18:37

前几天四六级成绩出来(然而我没考),用Node.js做了一个模拟表单提交并抓取数据的Web
总结一下用到的知识,简单的网页抓取大概就是这个流程了

发送Get或Post请求

表单提交,首先弄到原网页提交的地址,然后引入http或https模块
也可以下载使用request模块。
这边以get为例

var http = require('http');

//设置请求参数,包括headers
var options = {
    url: 'www.chsi.com.cn',
    encoding: null,
    host: 'www.chsi.com.cn',
    path: '/cet/query?' + querystring,
    method: 'GET',
    headers: {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'Cookie': 'JSESSIONID=8D79F004CB79FC5352F123F76CF4D853; __utmt=1; __utma=65168252.1576213452.1471513579.1471575867.1471575870.3; __utmb=65168252.5.10.1471575870; __utmc=65168252; __utmz=65168252.1471575870.3.3.utmcsr=baidu|utmccn=(organic)|utmcmd=organic|utmctr=%E5%AD%A6%E4%BF%A1%E7%BD%91',
        'Host': 'www.chsi.com.cn',
        'Referer': 'http://www.chsi.com.cn/cet/',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
    }
};

var req = http.request(options, function(res){
  res.on('data', function(data){
    //处理data事件,当接收到数据时触发
  }).on('end', function(){
    //处理读取完所有数据的事件
  }).on('error', function(err){
    //处理错误时的事件
    console.log(err);
  });
});

//发送请求
req.end();

如果是post请求,需要在req.end()之前用req.write(content)写入请求参数

Transfer-Encoding:chunked?

有时候服务器的response header会带有一个Transfer-Encoding,如果是chunked,说明服务器是分段传输数据的
这种情况下,会触发多次res的data事件,因此可以先定义一个变量,然后在data事件处理函数中将接收到的数据拼接起来

var req = http.request(options, function(res){
  var data = '';
  res.on('data', function(chunk){
    //处理data事件,当接收到数据时触发
    data += chunk;
  }).on('end', function(){
    //处理读取完所有数据的事件
  }).on('error', function(err){
    //处理错误时的事件
    console.log(err);
  });
});

//发送请求
req.end();

使用zlib库解压gzip压缩过的html

现在很多网站在进行数据传输时都会先用gzip或deflate压缩以减小传输数据的体积,这样,我们请求到的数据就是压缩过的数据,无法正常解析,因此需要先解压

Node.js带有一个zlib库可以用来解压gzip格式的数据

我们可以利用Node.js的管道流机制,将接收到的数据先通过pipe()交给zlib处理,然后再进行我们自己的处理

var zlib = require('zlib');

var req = http.request(options, function(res){
  var gunzip = zlib.createGunzip();
  res.pipe(gunzip);  //通过pipe()将数据交给gunzip
  var data = '';
  //事件处理,res.on改为gunzip.on
  gunzip.on('data', function(chunk){
    //处理data事件,当接收到数据时触发
    data += chunk;
  }).on('end', function(){
    //处理读取完所有数据的事件
  }).on('error', function(err){
    //处理错误时的事件
    console.log(err);
  });
});

//发送请求
req.end();

压缩html字符串(去除换行符)

接收到的data如果不是json格式而是html,就需要进一步处理
但是在html中有各种换行符,不方便进行正则匹配,因此先把换行符去掉

htmlstring = htmlstring.replace(/[\r\n]/g, '');

用正则表达式提取有用的信息

去除了烦人的换行符后,就可以愉快地用正则来获取我们需要的信息啦

什么?你不会用正则?
学啊,相信你肯定搜到过这个 正则表达式30分钟入门教程 ,需要的时候看一看。

大致的匹配流程是这样的:

var reg = new RegExp('');  //参数为正则的pattern

var arr = [];

arr = htmlstring.match(reg);  //显然match()方法返回的是匹配结果的数组,如果没有结果则返回null

这里贴个MDN上的文档,提高提高姿势水平
* RegExp - JavaScript | MDN
* String.prototype.match() - JavaScript | MDN

解析html(可选)

如果你不想用正则对html数据进行处理,没关系,还可以选择对html数据构造DOM树,然后通过各种选择器来获取你需要的数据
像是node-jquery、node-htmlparser之类的,具体的做法问Google吧,这边贴上一篇文章供参考 NodeJS 中寻找可用的 HTMLParser
我也没用过,就不多说了。

参考

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。转载请注明来源http://blog.csdn.net/azureternite

相关文章推荐

node.js 小爬虫抓取网页数据(2)

node.js 小爬虫抓取网页数据 http://blog.csdn.net/sunnylinner/article/details/52942096 在原来的基础上,采用了promise的模块,...

使用node.js cheerio抓取网页数据

http://www.75team.com/archives/543 发表于 2013 年 10 月 9 日 by bower 想要自动从网页抓一些数据或者想把一坨从什么博客上...

node js 抓取指定网页内容gb2312乱码问题解决

开始思路是用crawler。具体地址在Github上。https://github.com/sylvinus/node-crawler                 它的好处是可以用jquery选...

node.js 小爬虫抓取网页数据

慕课网的nodejs教程:http://www.imooc.com/learn/348 首先,npm install cheerio,可以认为cheerio这货就是nodejs版本的jQuery,用...

Node.js使用cheerio抓取网页数据DEMO

Node.js,原本是用来做Js服务器的,但是现在咱们一起来使用他做个抓取 关键是抓取到网页之后如何获取到想要的数据呢?然后就发现了cheerio,用来解析html非常方便,就像在浏览器中使...

使用node.js cheerio抓取网页数据

想要自动从网页抓一些数据或者想把一坨从什么博客上拉来的数据转成一种有结构的数据? 居然没有现成的API可以取数据?!!! !@#$@#$… 没关系 网页抓取可以解决。 什么是网页抓取? 你可...
  • kavensu
  • kavensu
  • 2014年01月04日 21:53
  • 8907

Node.js学习之网络爬虫(使用cheerio抓取网页数据)

准备工作 1.安装node.js开发环境:http://www.runoob.com/nodejs/nodejs-install-setup.html 2.了解cheerio库 英文:https...

node.js静态网页聊天系统

  • 2016年03月02日 15:55
  • 5KB
  • 下载

网页中实时查看服务器日志(websocket + node.js实现)

每当我需要查看linux服务器的日志时,我都需要通过SSH客户端访问,如果想让其他人也能查看日志,首先需要安装一个SSH客户端,然后设置连接信息,如果安全性高一点的,还需要额外在linux服务器上配置...

使用node.js ,Express, 和Mongodb 简历一个简单的Restful 网页服务-part1

使用node.js ,Express, 和Mongodb 简历一个简单的Restful 网页服务-part1 这个实现的基础是《使用handlebars 代替Jade 使用Express》 ,或者...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Node.js抓取网页
举报原因:
原因补充:

(最多只允许输入30个字)