摘要:前提本项目地址如果需要,可以到本地打开可直接查看爬虫数据目标爬取斗鱼正在直播的主播数据房间号,在线人数,房间标题,主播名称,直播分类等等依赖构建安装包的应用程序框架小型渐进式客户端请求库,和模块具有相同的,具有许多高级客户端功能可以
前提
本项目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、引入依赖并实例化expressconst 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就是相应的页数(这里是第二页)
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
摘要:站的弹幕服务器也有类似的机制,随便打开一个未开播的直播间,抓包将看到每隔左右会给服务端发送一个心跳包,协议头第四部分的值从修改为即可。 原文:B 站直播间数据爬虫, 欢迎转载项目地址:bilibili-live-crawler 前言 起因 去年在 B 站发现一个后期超强的 UP 主:修仙不倒大小眼,专出 PDD 这样知名主播的吃鸡精彩集锦,涨粉超快。于是想怎么做这样的 UP,遇到的第一...
摘要:很基础,不喜勿喷转载注明出处爬虫实战项目之链家效果图思路爬虫究竟是怎么实现的通过访问要爬取的网站地址,获得该页面的文档内容,找到我们需要保存的数据,进一步查看数据所在的元素节点,他们在某方面一定是有规律的,遵循规律,操作,保存数据。 说明 作为一个前端界的小学生,一直想着自己做一些项目向全栈努力。愁人的是没有后台,搜罗之后且学会了nodejs和express写成本地的接口给前端页面调用...
摘要:很基础,不喜勿喷转载注明出处爬虫实战项目之链家效果图思路爬虫究竟是怎么实现的通过访问要爬取的网站地址,获得该页面的文档内容,找到我们需要保存的数据,进一步查看数据所在的元素节点,他们在某方面一定是有规律的,遵循规律,操作,保存数据。 说明 作为一个前端界的小学生,一直想着自己做一些项目向全栈努力。愁人的是没有后台,搜罗之后且学会了nodejs和express写成本地的接口给前端页面调用...
摘要:不过因为各个平台互相挖人的关系,导致关注的一些主播分散到了各个直播平台,来回切换有点麻烦,所以萌生了做一个视频聚合站的想法。后续我们会对这三个部分的功能做逐一展开说明。正则处理要求比较高,但是几乎能应对所有的情况,属于大杀器。 前言 作为一个炉石传说玩家,经常有事没事开着直播网站看看大神们的精彩表演。不过因为各个平台互相挖人的关系,导致关注的一些主播分散到了各个直播平台,来回切换有点麻...
阅读 2991·2023-04-25 20:43
阅读 1701·2021-09-30 09:54
阅读 1569·2021-09-24 09:47
阅读 2858·2021-09-06 15:02
阅读 3484·2021-02-22 17:09
阅读 1205·2019-08-30 15:53
阅读 1421·2019-08-29 17:04
阅读 1919·2019-08-28 18:22