简单爬虫实例 - 爬取B站看板娘服装资源

最近又在网上看到一个 node 爬妹纸图的东西,去看了下源码,写的其实太啰嗦了。
其实 node + got + async/await 才是王道。

由于之前做了个 B站看板娘集合 的东西,所以就写个爬虫爬了下直播间。

数据分析

先分析下B站直播间的情况,打开全部直播页面 https://live.bilibili.com/all 看下 Network 模板。
很容易发现他的数据是 ajax 过来的 https://api.live.bilibili.com/room/v1/room/get_user_recommend?page=1,运气真好,都不需要写正则匹配数据了。
我们需要的目标数据是在直播页面中的模型数据。
例如 https://live.bilibili.com/271744 直播间中模型地址为 https://api.live.bilibili.com/live/getRoomKanBanModel?roomid=271744
这是我们要的数据目标数据。

那么简单了,在列表页的 /room/v1/room/get_user_recommend 接口中,一页有30个房间,其中的 roomid 就是我们要的房间号,有了这个,我们就可以直接获取到模型数据了。

房间 列表数据 和 模型数据 这里就不展开说明了,json数据比较占篇幅。

步骤就是:

  1. 遍历列表页面 1-100 页
  2. 遍历每页的30个房间 roomid
  3. 获取房间看板娘模型中的服装资源

开始爬取

这里用到 got 模块,它是 request 的替代品,配合 async/await 食用风味更佳。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const got = require('got');

// 直播间列表页 翻页参数 page=1
const urlList = 'https://api.live.bilibili.com/room/v1/room/get_user_recommend';
// 模型json地址 参数 roomid=1
const urlModel = 'https://api.live.bilibili.com/live/getRoomKanBanModel';

(async () => {
// 抓取100页
for (let i = 1; i <= 100; i++) {
const { body: { data: list } } = await got.get(urlList, { query: { page: i }, json: true });
// 抓房间模型json
for (let item of list) {
const { body } = await got.get(urlModel, { query: { roomid: item.roomid }, json: true });
console.log(body.textures); // 得到数据,textures为服装数据
}
}
console.log('done!');
})().catch(console.error);

这里是主要核心代码,数据去重 和 保存数据 部分没写,为了看起来更加干净。
因为数据抓取部分代码就这么点,这是爬虫核心代码,不到20行。
保存数据,你可以随意。

这里是完整的爬虫代码 https://github.com/52cik/bilibili-haruna/blob/master/fetch.js
完整的代码里加了 ua + referer 参数,简单伪造浏览器。

小结

当然,这只是个简单爬虫脚本,没做并发,也没做并发控制。
但作为简易爬虫入门学习,这是最理想的方式了。