node.js爬虫

前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等。当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript 也可以用来写爬虫了。由于 nodejs 强大的异步特性,让我们可以轻松以异步高并发去爬取网站,当然这里的轻松指的是 cpu 的开销。

要读懂本文,其实只需要有

  • 能看懂 Javascript 及 JQuery
  • 简单的nodejs基础
  • http 网络抓包 和 URL 基础

Nodejs做爬虫的优劣

首先说一下node做爬虫的优势

第一个就是他的驱动语言是JavaScript。JavaScript在nodejs诞生之前是运行在浏览器上的脚本语言,其优势就是对网页上的dom元素进行操作,在网页操作上这是别的语言无法比拟的。

第二就是nodejs是单线程异步的。听起来很奇怪,单线程怎么能够异步呢?想一下学操作系统的时候,单核cpu为什么能够进行多任务处理?道理也是类似,在操作系统中进程对CPU的占有进行时间切片,每一个进程占有的时间很短,但是所有进程循环很多次,因此看起就像是多个任务在同时处理。js也是一样,js里有事件池,CPU会在事件池循环处理已经响应的事件,未处理完的事件不会放到事件池里,因此不会阻塞后续的操作。在爬虫上这样的优势就是在并发爬取页面上,一个页面未返回不会阻塞后面的页面继续加载,要做到这个不用像python那样需要多线程。

其次是node的劣势

首先是异步并发上。处理的好很方便,处理的不好就会很麻烦。例如要爬取10个页面,用node不做异步处理话,那返回的结果可不一定是按1、2、3、4……这个顺序,很可能是随机。解决的办法就是增加一个页面的序列戳,让爬取的数据生成csv文件,然后重新排序。

第二个是数据处理上的劣势,这点是不如python的,如果只是单纯的爬数据,用node当然很好,但是如果用爬来的数据继续做统计分析,做个回归分析聚类啥的话,那就不能用node一步到底了。

如何用nodejs做爬虫

下面就要说一下如何用nodejs做爬虫了

  • 1、初始化项目文件

在对应的项目文件夹下执行npm init来初始化一个package.json文件

  • 2、安装request和cheerio依赖包

request听起来很熟悉吧,跟python里request功能一样。它的功能就是建立起对目标网页的链接,并返回相应的数据,这个不难理解。

cheerio的功能是用来操作dom元素的,他可以把request返回来的数据转换成可供dom操作的数据,更重要的cheerio的api跟jquery一样,用$来选取对应的dom结点,是不很方便?对一个前端程序员来说,这比python的什么xpath和beautisoup方便了不知道多少啊哈哈

安装命令也很简单:

分别是npm install request --save 和 npm install cheerio

  • 3、引入依赖包并使用

接下来就用request , fs和cherrio写一个爬虫吧!

首先引入依赖模块

var http=require("http");        //网络请求var fs=require("fs");            //操作文件,读写文件var cheerio=require("cheerio");  //扩展模块注:cheerio 模块是第三方模块,需要进行安装:npm install cheerio --save

接下来就以我之前爬取的的百度新闻页为例吧,为什么要选这个呢,因为这个是最基础最简单的。

百度新闻页面链接是:http://news.baidu.com/

执行下面代码:

var http=require("http");
var fs=require("fs");const wz="http://news.baidu.com/"; //网址var strHtml="";
var results=[];
http.get(wz,function(res){res.on("data",function(chunk){strHtml+=chunk;})res.on("end",function(){console.log(strHtml);});
})

运行一下结果就是这样的

是不是很激动哈哈,html返回回来了。这样还是不够的,接下就是要处理下返回的数据,并提炼出我们想要获得的信息,这就轮到cheerio登场了

将request返回的结果传入cheerio中,并获得想要获取的信息,看代码是不是想在写脚本的感觉?

接下来我们在获取一下这一段

执行以下代码:

var http=require("http");var fs=require("fs");var cheerio=require("cheerio");const wz="http://news.baidu.com/";var strHtml="";
var results=[];
http.get(wz,function(res){res.on("data",function(chunk){strHtml+=chunk;})res.on("end",function(){//console.log(strHtml);var $=cheerio.load(strHtml);$("#channel-all li").each((iten,i)=>{console.log($(i).text());})});
})        

运行一下结果如下:

这样一个简单的爬虫就完成啦,是不是很简单啊。

然后再简单的介绍一下node.js爬取图片

以下是我们将要爬取的图片:

首先我们也需要同上面一样引入一些需要的核心模块

var http = require("http");var https = require("https");var fs = require("fs");var cheerio = require("cheerio");

注:cheerio 模块是第三方模块,需要进行安装:

npm install cheerio --save

//保存网络图片
function saveImage(imageUrl){http.get(imageUrl, function (res) {res.setEncoding('binary');      //二进制(binary)var imageData ='';res.on('data',function(data){  //图片加载到内存变量imageData += data;}).on('end',function(){        //加载完毕保存图片if(!fs.existsSync("./images")){fs.mkdirSync("./images");}fs.writeFile('images/'+Math.random()+'.png',imageData,'binary',function (err) {  //以二进制格式保存if(err) throw err;console.log('保存成功');});});});
}

nodejs 爬虫总结

① http.get+cheerio+iconv-lite

这种方式还是比较简单的,容易理解,直接使用http的get方法进行请求url,将得到的内容给cheerio解析,用jquery的方式解析出我们要东西即可。

要点:

得到的结果中文乱码如何解决呢,用iconv-lite模块将得到的内容进行转码即可。

http.get(options,function(result){var body = [];result.on('data',function(chunk){body.push(chunk);});result.on('end', function () {var html = iconv.decode(Buffer.concat(body), 'gb2312');  //注意这里body是数组var $ = cheerio.load(html);...});
});

② request+cheerio+iconv-lite

这种方式在获取内容的方式上与上有些不同,可以直接获取到Buffer类型的数据。然后将得到的内容给cheerio解析,用jquery的方式解析出我们要东西即可。

要点:

结果中文乱码如何解决,用iconv-lite模块将得到的内容进行转码即可。

request(options,function(err,res,body){if(err)console.log(err);if(!err&&res.statusCode==200){var html = iconv.decode(body, 'gb2312');     //这里body是直接拿到的是Buffer类型的数据,可以直接解码。var $ = cheerio.load(html);...}
});

③ superagent+cheerio+superagent-charset

这种方式是比前面两个有较大差别,用了superagent的get方法发起请求,解码的时候用到了superagent-charse,用法还是很简单的,之后再将获取到的内容给cheerio解析,用jquery的方式解析出我们要东西即可。

要点:

结果中文乱码解决用superagent-charset模块进行转码,方式较之上面有点差别。

首先看它的加载方式:

var charset = require("superagent-charset");var superagent = charset(require("superagent"));   //将superagent模块传递给superagent-charset

解码方式:

superagent.get(url).charset('gb2312')                                //用charset方法达到解码效果。.end(function(err,result){if(err) console.log(err);var $ = cheerio.load(result.text);...});

至此呢,Nodejs爬虫的核心就已经介绍完毕了,剩下就完全可以自由发挥了

node.js 爬虫入门总结相关推荐

  1. node 没有界面的浏览器_node.js爬虫入门(二)爬取动态页面(puppeteer)

    之前第一篇爬虫教程node.js爬虫入门(一)爬取静态页面讲解了静态网页的爬取,十分简单,但是遇到一些动态网页(ajax)的话,直接用之前的方法发送请求就无法获得我们想要的数据.这时就需要通过爬取动态 ...

  2. 54 Node.js快速入门

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.Node开发概述 1.1 为什么要学习服务器端开发基础 能够与后端程序员更加紧密的配合 ...

  3. Node.js核心入门(二)

    目录: Node.js核心入门(一) 全局对象 常用工具 事件机制 Node.js核心入门(二) 文件系统访问 HTTP服务器与客户端 文件系统 fs fs 模块是文件操作的封装,它提供了文件的读取. ...

  4. Node.js aitaotu图片批量下载Node.js爬虫1.00版

    即使是https网页,解析的方式也不是一致的,需要多试试. 代码: //====================================================== // aitaot ...

  5. python中 getnode用法_node.js 爬虫入门总结

    node.js爬虫 前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等.当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript ...

  6. Node.js umei图片批量下载Node.js爬虫1.00

    这个爬虫在abaike爬虫的基础上改改图片路径和下一页路径就出来了,代码如下: //====================================================== // ...

  7. Node.js:入门资料

    <快速搭建 Node.js 开发环境以及加速 npm> http://fengmk2.com/blog/2014/03/node-env-and-faster-npm.html <N ...

  8. 如何用 Node.js 爬虫?

    本文来自作者 小北 在 GitChat 上分享「Node.js 爬虫从 0 到 1」,「阅读原文」查看交流实录 「文末高能」 编辑 | 家辉 写在前面 我们经常会听说爬虫这个词语,但是却从来没有见过这 ...

  9. java爬虫拉勾网_[Java教程]node.js爬虫爬取拉勾网职位信息

    [Java教程]node.js爬虫爬取拉勾网职位信息 0 2017-03-14 00:00:21 简介 用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京.上海.广州.深圳 ...

最新文章

  1. 面试前必知必会的二分查找及其变种
  2. 路由器mstp多域配置举例
  3. openStack镜像制作
  4. eclipse3.6默认指向 WebContent 目录 修改为 webRoot
  5. C 语言内联汇编介绍
  6. gdb / 调试进入 so 库的方法
  7. Qt学习笔记(持续更新)
  8. LeetCode371——Sum of Two Integers(不用+)
  9. cad缩放工具怎么用_小米电视怎么投屏?这个投屏工具真的太好用啦!
  10. 疫情中该如何保证高效远程办公(1)-员工到底是在家办公,还是在家躺着??
  11. Linux常用命令、权限管理和开发工具详细介绍
  12. [转]C#综合揭秘——细说进程、应用程序域与上下文之间的关系
  13. Hadoop快速入门(一)
  14. BT Openreach批发FTTP网络推出千兆宽带服务
  15. 深度解析TCP/IP---网络原理的重重之重
  16. Linux错误码汇总
  17. 基因组测序中N50和N90到底指什么?
  18. 数字电路中的锁存器(latch)和各种触发器(flip-flop)
  19. 通过空气质量指数AQI学习统计分析并进行预测(上)
  20. django.db.utils.OperationalError: (2003, Can't connect to MySQL server on ‘127.0.0.1’)

热门文章

  1. 接口有个电池标志_有人说手机快充毁电池,真的假的?电池快充的原理是什么?...
  2. 【MATLAB】 csvwrite数据缺失怎么办
  3. 浏览器 android x86,360浏览器x86版下载
  4. 用计算机表白我不喜欢你了,隐藏式表白,表白不一定要用“我喜欢你”这几个字...
  5. 超级计算机清华,从清华到华科 名校为何主办超级计算机大赛?
  6. html制作圆盘时钟,jquery+html5制作超酷的圆盘时钟表
  7. python3.7基础教程_关于本教程 |《Python 官方文档:入门教程 3.7.0》| Python 技术论坛...
  8. 宝塔linux 做负载均衡,利用BT宝塔面板做网站多服务器负载均衡图文教程
  9. dynamo方程怎么写_【简明自控】为什么特征方程如此重要
  10. MySQL命令梳理_MySQL操作命令梳理(2)