js 爬虫抓取网页数据(node.js爬虫怎么能够异步高并发去爬取网站)

优采云 发布时间: 2021-10-28 22:17

  js 爬虫抓取网页数据(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爬虫的核心已经介绍完毕,剩下的就完全免费玩了

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线