js 爬虫抓取网页数据(node.js爬虫怎么能够异步高并发去爬取网站)
优采云 发布时间: 2021-10-28 22:17js 爬虫抓取网页数据(node.js爬虫怎么能够异步高并发去爬取网站)
node.js 爬虫
前端同学可能对爬虫不是很感冒,认为爬虫需要用到后端语言,比如php、python等,当然这是在nodejs之前。随着nodejs的出现,Javascript也可以用来写爬虫了。由于nodejs强大的异步特性,我们可以轻松爬取异步高并发的网站。当然,这里的easy指的是cpu的开销。
要理解这篇文章,其实你只需要具备Nodejs作为爬虫的优缺点即可。首先说一下node作为爬虫的优势。
首先是他的驱动语言是 JavaScript。在 nodejs 诞生之前,JavaScript 是一种运行在浏览器上的脚本语言。它的优点是在网页上操作dom元素,在网页操作上是其他语言无法比拟的。
二是nodejs是单线程异步的。听起来很奇怪,单线程怎么能异步呢?想一想为什么在学习操作系统时单核cpu可以进行多任务处理?原因是类似的。在操作系统中,进程占用CPU时间片。每个进程占用的时间很短,但是所有进程都循环了很多次,所以看起来像是同时处理多个任务。对于 js 也是如此。js中有一个事件池。CPU会在事件池循环中处理响应的事件,未处理的事件不会放入事件池中,因此不会阻塞后续操作。这样做在爬虫上的好处是,在并发爬取的页面上,一个页面返回失败不会阻塞后续页面继续加载。去做这个,
二是node的缺点
第一个是异步并发。处理好很方便,处理不好就麻烦了。比如要爬10个页面,用node不做异步处理,返回的结果不一定在1、2、3、4...... 这个顺序很可能是随机的。解决办法是添加一个页面序列戳,让爬取的数据生成一个csv文件,然后重新排序。
二是数据处理的劣势,不如python。如果只是单纯的爬取数据,用node就好,但是如果用爬取的数据继续做统计分析,做回归分析和聚类。,那你就不能用node到最后了。
如何使用nodejs作为爬虫我们来谈谈如何使用nodejs作为爬虫。
在对应的项目文件夹中执行 npm init 初始化一个 package.json 文件
请求听起来很熟悉,就像python中的请求函数一样。它的作用是建立目标网页的链接并返回相应的数据,不难理解。
Cheerio 的功能是用来操作dom元素的。它可以将请求返回的数据转换成dom可以操作的数据。更重要的是,cheerio 的 api 和 jquery 是一样的。它使用 $ 来选择相应的 dom 节点。很方便?对于前端程序员来说,这比python的xpath和beautisoup方便多了。不知道多少钱哈哈
安装命令也很简单:
它们是 npm install request --save 和 npm installcheerio
接下来用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的回合。
将请求返回的结果传递给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 安装cheerio --save
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);
...
});
});
②请求+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
这种方法与前两种截然不同。超级代理的 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爬虫的核心已经介绍完毕,剩下的就完全免费玩了