使用 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 树,如下所示

javascript抓取网页上的table数据 javascript抓取页面数据_图片

3.2 爬取页面的图片

此时就可以根据页面结构获取dom树,进行数据获取,如:获取页面 #lg 下面的 src 图片地址数据

console.log($('#lg > img').attr('src'));

javascript抓取网页上的table数据 javascript抓取页面数据_爬虫_02

javascript抓取网页上的table数据 javascript抓取页面数据_爬虫_03

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 + 获取的地址即可

javascript抓取网页上的table数据 javascript抓取页面数据_图片_04


本地文件存放地址和文件名

javascript抓取网页上的table数据 javascript抓取页面数据_爬虫_05

5. 总结

  • 可以爬页面结构dom数,就可以根据页面结构的标签,类名获取页面需要的数据。
  • 可以利用页面结构的数据地址,爬取下载图片,视频等。
  • 但是爬取视频,有的网站是爬取不了的,有反扒机制。PC端视频如果是flash插件加载的视频是不能爬取的。但是可以切换到无线端,爬取无线端的数据。像哔哩哔哩这种大型PC和无线都有数据的网站
  • 只有浏览器可以下载,服务端爬虫无效。需要反爬:检测你这个请求是通过浏览器发出来,还是服务端(解决方案:让服务端伪装成浏览器来发这个请求)