知乎是一个好地方,最近翻阅知乎官网,发现知乎专栏藏的很隐蔽,如果不知道专栏名,只能在搜索中找关键词。而对于我们不知道的领域,我们几乎是认为知乎是没有这方面的专栏的。关于这个会用 Google 的朋友应该会知道怎么样在网上找到所有的知乎专栏
爬虫诞生
作为一个收藏癖,看到好东西不藏在本地就不爽,虽然存起来大多时候是忘记它的存在的。再者,最近发现有些知乎专栏的文章确实不错,就萌生了爬专栏文章的念头。在 github 上找了很久,发现没有爬专栏的爬虫,只找到爬某用户回答的爬虫。模仿别人的爬虫,于是这个 爬虫 就诞生了。
爬虫原理
其实我也不太明白这个爬虫的原理,四个*.js
文件,只有一个是我自己写的,其他的都是网上找的,反正就是能用就对了 (⊙v⊙)。
废话不多说了,源码送上:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| const fs = require("fs"); const request = require("request"); const cheerio = require("cheerio"); const config = require("./config.js"); const server = require("./download.js"); const zhihuId = config.zhihuId; const dir = `${zhihuId}`; const url = `https://zhuanlan.zhihu.com/${zhihuId}`;
console.log("---------start----------------"); fs.exists(dir, function(exists) { if (exists) console.log(dir + "文件夹存在"); else { fs.mkdir(dir, function(err) { if (err) console.error(err); console.log("创建" + dir + "文件夹成功"); }); } }); server.download(url, function(data) { if (data) {
var $ = cheerio.load(data);
var postsCount = JSON.parse($("textarea#preloadedState").text()) .columns[`${zhihuId}`].postsCount;
loopdown(postsCount); } });
function loopdown(postsCount) { var posts = postsCount % 20; var times = (postsCount - posts) / 20;
for (var i = 0; i <= times; i++) { var urlp = `https://zhuanlan.zhihu.com/api/columns/${zhihuId}/posts?limit=20&offset=${i * 20}`;
request .get(urlp, function(err, res, body) { }) .pipe(fs.createWriteStream(`${dir}/${i}.json`)); console.log(`${dir}/${i}.json`); } }
|
fs
模块用来创建文件夹和读写*.json
数据
request
模块用来获取 api 的内容,并用pipe
来写入文件。
cheerio
模块用来获取网页中的 DOM,因为 DOM 里面有部分我需要的数据
其他的就没什么了。值得一提,的是知乎的 api 一直最多只支持读取 20 条数据,所以我用console.log()
打印我有多少*.json
文件,(*.json
文件个数-1)_20<得到的文章数<=_.json
文件个数、* 20。虽然我也打印了总的文章数在控制台。