今天被问到,怎么爬B站的视频链接,问我的大哥用的python,我就用node来试试。
看了眼B站的网页代码,是用的jquery实现的。
首先要安装两个node的依赖包

1
$ npm install superagent cheerio --save

superagent主要用于向网页发起http请求

Small progressive client-side HTTP request library, and Node.js module with the same API, sporting many high-level HTTP client features

cheerio用于获取jquery中的元素,对于网页爬虫容易定位到想要的dom上

Fast, flexible & lean implementation of core jQuery designed specifically for the server.

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
const superagent = require('superagent');
const cheerio = require('cheerio');
const reptileUrl = "https://www.bilibili.com/";
superagent.get(reptileUrl).end(function (err, res) {
if(err) {
throw err;
return;
}
let $ = cheerio.load(res.text);
$("a").each(function(i, e) {
console.log($(e).attr("href"));
});
});

因为要的是视频链接,而且源码里<a>没有加class或者id所以直接取的<a>标签的href属性,简单粗暴。
爬取结果数据太多不好展示,不过想了一下,是不是可以把爬取结果写到文件中呢?可以用nodefs模块试一下?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
const superagent = require('superagent');
const cheerio = require('cheerio');
const fs = require('fs');
const reptileUrl = "https://www.bilibili.com/";
superagent.get(reptileUrl).end(function (err, res) {
if(err) {
throw err;
return;
}
let $ = cheerio.load(res.text);
let arr = []
$("a").each(function(i, e) {
arr.push($(e).attr("href"))
});
fs.writeFile('./static/mydata.txt', arr, function(err) {
if (err) {
return console.error(err);
} console.log("数据写入成功!");
console.log("--------我是分割线-------------")
console.log("读取写入的数据!");
fs.readFile('./static/mydata.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取文件数据: " + data.toString());
});
});
});

ok,成功~ 😄