使用 nodejs Crawler模块 爬取页面数据
- 1. 安装 crawler 模块
- 2. 创建爬虫对象,开始爬取
- 3. 爬取文件
- 3.1 爬取页面结构dom树
- 3.2 爬取页面的图片
- 4. 爬取视频文件
- 5. 总结
1. 安装 crawler 模块
npm install Crawler
2. 创建爬虫对象,开始爬取
var c = new Crawler({
maxConnections : 10,
// This will be called for each crawled page
callback : function (error, res, done) {
//爬好之后会执行这个回调函数
if(error){
console.log(error);
}else{
//将爬好的数据赋值给juqery对象
var $ = res.$;
// $ is Cheerio by default
//a lean implementation of core jQuery designed specifically for the server
// 爬取页面结构dom树
console.log($("html").html());
// 爬取页面的图片
console.log($('#lg > img').attr('src'));
}
done();
}
});
// 写入需要爬取网页的地址
c.queue('http://www.baidu.com');
3. 爬取文件
3.1 爬取页面结构dom树
通过 $ 获取 html 节点的html 文本信息
console.log($("html").html()); //获取的是页面的所有 dom 树,如下所示
3.2 爬取页面的图片
此时就可以根据页面结构获取dom树,进行数据获取,如:获取页面 #lg 下面的 src 图片地址数据
console.log($('#lg > img').attr('src'));
4. 爬取视频文件
我们这里爬取的是哔哩哔哩大型视频网站,基本上大型网站都可以爬取的话,小网站更别说了。
需要使用操作文件模块,所有需要引入 fs 模块
var crawler = require("crawler");
var fs = require('fs');
var c = new crawler({
encoding:null,
jQuery:false,// set false to suppress warning message.
callback:function(err, res, done){
if(err){
console.error(err.stack);
}else{
//将爬取好的文件通过fs模块写入文件
fs.createWriteStream(res.options.filename).write(res.body);
}
done();
}
});
//绝大多数网站,都有反爬机制。只有小众网站没有。所以我们需要使用以下配置
//浏览器可以下载,但是服务端爬虫无效。反爬:检测你这个请求是通过浏览器发出来,还是服务端(解决方案:让服务端伪装成浏览器来发这个请求)
c.queue({
url:"http://upos-hz-mirrorcos.acgvideo.com/upgcxcode/97/31/76823197/76823197-1-6.mp4?um_deadline=1550575994&platform=html5&rate=77500&oi=3085779014&um_sign=db48251bc5b1372571ebb345b6a1a098&gen=playurl&os=cos&trid=84e2a7ae166240fbb86a73d28ff5f1c1",
filename:"./video/11111.mp4",//写入文件名 默认在根目录
headers:{'User-Agent': 'requests'}//让服务端伪装成客户端
});
根据页面的 vidio 标签,可以获取到视频的地址,我们只需要在 url:地址里面拼接上 http + 获取的地址即可
本地文件存放地址和文件名
5. 总结
- 可以爬页面结构dom数,就可以根据页面结构的标签,类名获取页面需要的数据。
- 可以利用页面结构的数据地址,爬取下载图片,视频等。
- 但是爬取视频,有的网站是爬取不了的,有反扒机制。PC端视频如果是flash插件加载的视频是不能爬取的。但是可以切换到无线端,爬取无线端的数据。像哔哩哔哩这种大型PC和无线都有数据的网站
- 只有浏览器可以下载,服务端爬虫无效。需要反爬:检测你这个请求是通过浏览器发出来,还是服务端(解决方案:让服务端伪装成浏览器来发这个请求)