前提

$ 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里

python爬斗鱼直播官网,【爬虫】nodejs爬斗鱼直播间数据实战相关推荐

  1. Python爬取国家统计局官网最新全国所有城市县镇数据

    最近项目里需要省市区村的数据,网上找了很多方法,都没有如意的,有的老数据竟然还要钱,要积分的我也还认可,我在网上查了下,参考了这位老兄的博客,自己又动手把第五级村级行政加了上去.下面请看大屏幕,我要划 ...

  2. python爬虫入门练习,使用正则表达式和requests爬取LOL官网皮肤

    刚刚python入门,学会了requests模块爬取简单网页,然后写了个爬取LOL官网皮肤的爬虫,代码奉上 #获取json文件 #获取英雄ID列表 #拼接URL #下载皮肤 #导入re request ...

  3. 用python输出所有的玫瑰花数_用Python爬取WordPress官网所有插件

    转自丘壑博客,转载注明出处 前言 只要是用WordPress的人或多或少都会装几个插件,可以用来丰富扩展WordPress的各种功能.围绕WordPress平台的插件和主题已经建立了一个独特的经济生态 ...

  4. python 认证机构_利用Python爬了SIG官网BQB认证公司清单,我有一些重大发现..

    关注"无线技术联盟"提供有价值的物联网市场信息和最新的技术分析 利用Python爬取了蓝牙联盟上近一年BQB认证公司的清单,把爬到的有价值的东西写出来分享给大家. 1 蓝牙认证 产 ...

  5. 爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider ,包括了项目的所有代码. 本文 ...

  6. python使用selenium爬取联想官网驱动(一):获取遍历各驱动的下载网址

    python使用selenium爬取联想官网驱动(一):获取遍历各驱动的下载网址然后wget命令试验下载 由于初期学习,所以先拿一个型号的产品驱动试验. (1)以下为在联想某型号产品获取相关驱动下载的 ...

  7. python爬取千图网_python爬取lol官网英雄图片代码

    python爬取lol官网英雄图片代码可以帮助用户对英雄联盟官网平台的皮肤图片进行抓取,有很多喜欢lol的玩家们想要官方的英雄图片当作自己的背景或者头像,可以使用这款软件为你爬取图片资源,操作很简单, ...

  8. 如何用Python爬取LOL官网全英雄皮肤

    今天小编带你爬取LOL官网全英雄皮肤的图片 不要失望,也不要难过 接下咱们来讲讲怎么爬取LOL官网 本次案例使用到的模块 import requests import re import json 安 ...

  9. Python3爬取国家统计局官网2017年全国所有城市县镇数据

    最近由于项目需要用到全国城镇乡的数据,网上找了下大部分都是很久之前的,或者不理想的数据,某文库更是无论文章好不好都要下载券,所以索性自己用Python写爬虫爬数据,以下是代码(Python3.6版本) ...

  10. 如何用Python瞬间获取LOL官网全英雄皮肤的图片?

    你没有看错 就是爬取LOL官网全英雄皮肤[的图片] 嘿嘿嘿,以为可以有全英雄,全皮肤了? 爬虫实战 用到的模块:requests.re.json 安装:pip isntall requests 首先让 ...

最新文章

  1. k8s实战之数据卷(volume)
  2. Git 这样回退代码,才足够优雅
  3. 人口普查(20) PAT
  4. mysql8.0.20忘记密码_mysql8.0.19忘记密码的完美解决方法
  5. 30秒就能学会一个Python小技巧?
  6. python代码规范工具_如何检查python3中的代码规范
  7. 软件开发---全套规范
  8. C#命名规范,SqlServer命名规范
  9. Hbase常用操作记录
  10. 新iPhone将采用更大容量电池:最低3110mAh?
  11. 西门子plc烧录单片机_用51单片机做简易PLC
  12. python游戏解法图_python 游戏(记忆拼图Memory_Puzzle)
  13. Iphone6/6s刷机常见问题
  14. iOS模拟器iOS Simulator详细图文使用教程
  15. ucharts 柱状图圆角_圆角柱状图
  16. 今天给大家介绍一下关于锂离子电池的负极材料选择
  17. (个人解题思路系列)猜拳游戏
  18. VC6.0补丁Vs6sp6安装方法
  19. 计算机表格a列除b列,win10系统下EXCEL表格A列B列C列消失了怎么办
  20. java中的mybatis作用_mybatis作用、基本使用、小结

热门文章

  1. 光学efl_(完整版)光学专业英语
  2. 模拟计算机怎么做,电脑虚拟U盘如何制作 电脑虚拟U盘怎样制作
  3. 关于Fluent网格尺寸的疑惑
  4. 信息流驱动百度App高位增长:日活和时长双双跑赢大盘
  5. 2022 ios APP最新开发测试教程
  6. 我在蚂蚁金服技术风险部做“医生”
  7. 智能指针手表_智能手表如何检测体内的药物水平
  8. vue整合jQuery和bootstrap,实现官网效果,实现Glyphicon Halflings 的字体图标
  9. Robotics System Toolbox中的机器人运动(7)--RRT规划避障路径
  10. 2018清华-伯克利深圳学院数据科学方向笔试题