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

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

执行下面代码:

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爬虫的核心就已经介绍完毕了,剩下就完全可以自由发挥了

python中 getnode用法_node.js 爬虫入门总结相关推荐

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

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

  2. python中headers的作用_爬虫入门到精通-headers的详细讲解(模拟登录知乎)

    直接开始案例吧. 本次我们实现如何模拟登陆知乎. 1.抓包 注意打开开发者工具后点击"preserve log",密码记得故意输入错误,然后点击登录 我们很简单的就找到了 我们需要 ...

  3. Python中self用法详解

    Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...

  4. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  5. python中 的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...

  6. python讲解-详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,"@function"作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是 ...

  7. 【 Python 中 int 用法详解】(转载)

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  8. Python 中 int 用法详解

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  9. python中“end=”用法

    python中"end="用法:例如print("#",end=" \n"),默认换行,print("#",end=&q ...

最新文章

  1. equals方法和==的区别--用实例简单说明
  2. ubuntu上wordpress安装的前置工作
  3. 1023. 组个最小数 (20)
  4. cal css,CSS calc计算属性
  5. java开发者工具开源版_开源工具如何帮助飓风受害者
  6. 物流设计大赛优秀作品_喜报 | 物流设计大赛商院学子获佳绩,实现该项竞赛零的突破...
  7. 实现下拉菜单的宽度与登录人ID长度的匹配
  8. 计算机图像类型ppt,计算机图像处理.ppt
  9. Android 自定义CheckBoxPreference的CheckBox复选框
  10. FFmpeg硬件加速
  11. [蓝桥杯]java实现第39级台阶
  12. pygame之Surface模块
  13. 人生苦短,使用百度云SDK,编写python代码调用接口的车牌识别
  14. 【编程实践】快速构建软件:从“快速移动并打破事物”到“快速移动,并保持稳定”
  15. 泛统计理论初探——孤立森林简介
  16. Java RESTful Web Service实战(第2版)
  17. 调用http时因为js问题遇到的一个报错
  18. Java项目:JavaWeb实现网上图书商城系统
  19. 通过Horizon Connection 下载Horizon Client(含UAG场景)
  20. Linux 学习之路 (三):用户管理命令详解

热门文章

  1. 当前深度神经网络模型压缩和加速都有哪些方法?
  2. 机器学习理论《统计学习方法》学习笔记:奇异值分解(SVD)
  3. 深度学习入门之线性模型和梯度下降
  4. 很好的阻止了事件的发生_请定好您的闹钟,八月,夜空中将发生这13件超酷的天文事件...
  5. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】——第四章——自编解析与答案
  6. BugKuCTF WEB 矛盾
  7. android 设置 媒体服务器,第三讲:如何掌握媒体服务器的运行情况
  8. 查看动态代理生成的代理类字节码
  9. 【笔记】opencv的python使用 腐蚀模糊背景分割等处理图像
  10. Redis-学习笔记05【Jedis连接池】