网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。那么JavaScript能写爬虫吗?下面本篇文章就来给大家介绍一下。
爬虫,大多人对于爬虫的理解都停留在使用后端语言如Python写的爬虫。当然这是在 nodejs 前了,nodejs的出现,使得Javascript也可以用来写爬虫了。
由于nodejs强大的异步特性,让我们可以轻松以异步高并发去爬取网站,当然这里的轻松指的是cpu的开销。
使用客户端JavaScript有诸多后端爬虫所无法拥有的优势:可以方便的分享给其他人用,只要对方电脑里有浏览器
由于跑在客户端,几乎可以无视对方网站的反爬虫机制
可以拥有完善的UI,无开发基础的小白也可以随意使用
下面就要说一下如何用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和cherrio写一个爬虫吧!
首先引入依赖var request = require("request");
var cheerio = require("cheerio");
接下来就以爬取我们学校的新闻页为例吧,我们学校的新闻页面链接是http://news.shu.edu.cn/Default.aspx?tabid=446
然后调用request的接口request('http://news.shu.edu.cn/Default.aspx?tabid=446',function(err,result){
if(err){
console.log(err);
}
console.log(result.body);
})
将request返回的结果传入cheerio中,并获得想要获取的信息request('http://news.shu.edu.cn/Default.aspx?tabid=446',function(err,result){
if(err){
console.log(err);
}
var $ = cheerio.load(result.body);
$('a[id^="dnn"]').each(function(index,element){
console.log($(element).text());
})
})
4、设置请求头
具体事例代码如下:var options = {
url: startUrl+'?page=1',
method: 'GET',
charset: "utf-8",
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36",
"cookie": cookies
}
};
request(options,function(err,response,body){
//...
})
5、并发控制
爬取一个页面还好,要是页面多了就是无限制并发了,那肯定就要被封了,所以就要有一个并发控制,这里要介绍的就是async。跟上述一样要通过npm install async --save来安装并通过var async = require("async")来引入。
具体以一个限制并发的方式来示例一下async.mapLimit(5,function(url,callback)){
//...
fetch(url,callback)
})