资讯专栏INFORMATION COLUMN

【爬虫】nodejs爬斗鱼直播间数据实战

KunMinX / 2019人阅读

摘要:前提本项目地址如果需要,可以到本地打开可直接查看爬虫数据目标爬取斗鱼正在直播的主播数据房间号,在线人数,房间标题,主播名称,直播分类等等依赖构建安装包的应用程序框架小型渐进式客户端请求库,和模块具有相同的,具有许多高级客户端功能可以

前提

本项目github地址:https://github.com/janyin/dou...
如果需要,可以clone到本地

$ npm install --save
$ node app

打开http://localhost:3030/index.html 可直接查看爬虫数据

目标

爬取斗鱼正在直播的主播数据(房间号,在线人数,房间标题,主播名称,直播分类等等)

依赖构建

安装npm包express+superagent+cheerio

$ npm install express superagent cheerio --save

express:Node.js的Web应用程序框架

superagent:小型渐进式客户端HTTP请求库,和Node.js模块具有相同的API,具有许多高级HTTP客户端功能

cheerio:可以理解为一个Node.js版本的jquery,用来从网页中以 css selector取数据,使用方式和jquery基本相同

实现步骤 1、引入依赖并实例化express
const express = require("express");
const superagent = require("superagent");
const cheerio = require("cheerio");
const app = express();
2、定义目标url
const url = "https://www.douyu.com/directory/all";
const rooturl = "https://www.douyu.com";

rooturl是斗鱼首页,url是斗鱼全部直播间第一页,rooturl后面直播间地址数据要用到

3、发送请求 获取数据 分析数据 生成页面数据到前端

用superagent发送get请求到斗鱼,回调函数接受到的数据给cheerio解析,这样就可以用jquery选择器进行操作

使用cheerio.load()解析

打开斗鱼,发现其直播列表均在id为live-list-contentbox的ul里,用jquery选择器获取所有li并遍历

在li里寻找到我们需要的数据,最后push到data里

app.get("/", function (req, response) { // 声明get请求在指定的路径下调用相应的回调函数
   let data = [];//存放获取的数据
   superagent.get(url).end(function (err, res) {//发起get请求
       if (err) {
           console.log(err);
       } else {
           console.log("状态码:" + res.status);
           let $ = cheerio.load(res.text);//使用cheerio解析数据
           $("#live-list-contentbox li").each(function (i, ele) { //获取目标数据 并遍历存放到data中
               let href = rooturl + $(ele).find("a.play-list-link").attr("href");//href是存放的直播间id,加rooturl生成直播间链接
               let lives = {
                   name: $(ele).find("span.dy-name").text(),
                   num: $(ele).find("span.dy-num").text(),
                   title: $(ele).find(".mes-tit>h3").text().trim(),
                   links: href,//直播间链接
               };
               data.push(lives);
           })
       }
       response.send(data);//目标数据发送给前端

})

4、监听端口
app.listen(3030, function () {
    console.log("server is listening port 3030....");
})

最后node这个项目,打开http://localhost:3000/ 得到我们需要的数据

以上全部代码在first.js里. 爬虫数据部分结果:

进阶爬虫

思考:这只是斗鱼第一页主播的数据,如果是100页的数据,或者全部呢?
这时候就需要async,不可能同步发100个请求,容易被误以为恶意攻击

Async提供了直接,强大的函数来处理异步JavaScript,虽然最初设计用于Node.js,但它也可以直接在浏览器中使用

$ npm install async --save
分析页面

100个页面可以先获取100个相应的url,但是发现斗鱼切换到第二页的时候其url并没有改变,
通过chrome devtools发现在切换页面时的ajax请求。

发现ajax请求的url是https://www.douyu.com/gapi/rk... ,后面加的/2就是相应的页数(这里是第二页)

实现爬虫 1、和刚才上面一样
const express = require("express");
const superagent = require("superagent");
const async = require("async");

const app = express();
const rooturl = "https://www.douyu.com/gapi/rkc/directory/0_0";
2、声明一个函数获取所有的url
function geturls(num) {
    let href = [];
    let urls = [];
    for (let i = 1; i <= num; i++) {
        href.push("/" + i);
    }
    href.forEach(function (ele) {
        urls.push(rooturl + ele);
    })
    return urls;
}

传进去的num是多少,返回的url就有多少

3、async异步发送请求
app.get("/data", function (req, res) {
    let urls = geturls(100); //获取100个url
    let datas = []; //存放目标数据
    async.mapLimit(urls,25,function (url, callback) { //异步发送请求
        fetchPage(url, callback);//分析数据并提取
    }, function (err, result) {
        console.log("分析完成!");
        res.send(datas);//发送数据给前端
    });
})

async.mapLimit(coll, limit, iteratee, callback)

coll是迭代的集合,就是数组存放需要发送请求的url

limit一次最大异步操作数

一个异步函数,用于应用于每个项目 coll

callback可选,所有iteratee 函数完成或发生错误时调用的回调。

ps:最后一个函数里result参数的数据和datas数组数据是一样的,发送datas主要是方便后面页面提取

4、分析页面函数
function fetchPage(url, callback) {
        superagent.get(url).end(function (err, sres) {
            if (err) {
                console.log(err);
            } else {
                let item = JSON.parse(sres.text);//解析json数据
                let list = item.data.rl;
                list.forEach(function (ele) {//提取需要的数据
                    let obj = {
                        name: ele.nn,
                        id: ele.rid,
                        online: ele.ol,
                        title: ele.rn,
                        class: ele.c2name,
                    };
                    datas.push(obj);
                });
                callback(null, datas);//这个datas会发送给result
            }
        })
    }
})

因为ajax请求直接返回的是json数据就不需要上面的cheerio解析

5、设置静态文件目录
app.use(express.static("public"))

app.listen(3030, function () {
    console.log("server is listening port 3030....");
})
6、编写前端html,展示数据

前端代码在index.html里,主要是获取数据遍历输出到表格,还有一个搜索功能(不建议搜索1W以上的数据,会很卡)


以上代码均在app.js里

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97018.html

相关文章

  • 大话的基本套路

    摘要:有什么作用通过有效的爬虫手段批量采集数据,可以降低人工成本,提高有效数据量,给予运营销售的数据支撑,加快产品发展。因为信息是完全公开的,所以是合法的。 showImg(https://segmentfault.com/img/remote/1460000011359885?w=566&h=316);   什么是爬虫? 网络爬虫也叫网络蜘蛛,如果把互联网比喻成一个蜘蛛网,那么蜘蛛就是在...

    Towers 评论0 收藏0
  • B 站播间数据

    摘要:站的弹幕服务器也有类似的机制,随便打开一个未开播的直播间,抓包将看到每隔左右会给服务端发送一个心跳包,协议头第四部分的值从修改为即可。 原文:B 站直播间数据爬虫, 欢迎转载项目地址:bilibili-live-crawler 前言 起因 去年在 B 站发现一个后期超强的 UP 主:修仙不倒大小眼,专出 PDD 这样知名主播的吃鸡精彩集锦,涨粉超快。于是想怎么做这样的 UP,遇到的第一...

    xuweijian 评论0 收藏0
  • Nodejs实战项目之链家

    摘要:很基础,不喜勿喷转载注明出处爬虫实战项目之链家效果图思路爬虫究竟是怎么实现的通过访问要爬取的网站地址,获得该页面的文档内容,找到我们需要保存的数据,进一步查看数据所在的元素节点,他们在某方面一定是有规律的,遵循规律,操作,保存数据。 说明 作为一个前端界的小学生,一直想着自己做一些项目向全栈努力。愁人的是没有后台,搜罗之后且学会了nodejs和express写成本地的接口给前端页面调用...

    noONE 评论0 收藏0
  • Nodejs实战项目之链家

    摘要:很基础,不喜勿喷转载注明出处爬虫实战项目之链家效果图思路爬虫究竟是怎么实现的通过访问要爬取的网站地址,获得该页面的文档内容,找到我们需要保存的数据,进一步查看数据所在的元素节点,他们在某方面一定是有规律的,遵循规律,操作,保存数据。 说明 作为一个前端界的小学生,一直想着自己做一些项目向全栈努力。愁人的是没有后台,搜罗之后且学会了nodejs和express写成本地的接口给前端页面调用...

    MartinDai 评论0 收藏0
  • 一步一步教你如何搭建自己的视频聚合站

    摘要:不过因为各个平台互相挖人的关系,导致关注的一些主播分散到了各个直播平台,来回切换有点麻烦,所以萌生了做一个视频聚合站的想法。后续我们会对这三个部分的功能做逐一展开说明。正则处理要求比较高,但是几乎能应对所有的情况,属于大杀器。 前言 作为一个炉石传说玩家,经常有事没事开着直播网站看看大神们的精彩表演。不过因为各个平台互相挖人的关系,导致关注的一些主播分散到了各个直播平台,来回切换有点麻...

    justjavac 评论0 收藏0

发表评论

0条评论

KunMinX

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<