今天被问到,怎么爬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
属性,简单粗暴。
爬取结果数据太多不好展示,不过想了一下,是不是可以把爬取结果写到文件中呢?可以用node
的fs
模块试一下?
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,成功~ 😄