知乎专栏爬虫

bubao-zhihu

知乎是一个好地方,最近翻阅知乎官网,发现知乎专栏藏的很隐蔽,如果不知道专栏名,只能在搜索中找关键词。而对于我们不知道的领域,我们几乎是认为知乎是没有这方面的专栏的。关于这个会用 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
54
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) {
//console.log(data);

var $ = cheerio.load(data);

var postsCount = JSON.parse($("textarea#preloadedState").text()).columns[`${zhihuId}`].postsCount
//console.log(postsCount)
//console.log("done");

loopdown(postsCount)
}
});

function loopdown(postsCount) {
// body...
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) {
// console.log(err);
// console.log(res);
//console.log(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。虽然我也打印了总的文章数在控制台。


知乎专栏爬虫
https://bubao.github.io/posts/1d8fc11f.html
作者
一念
发布于
2017年7月1日
许可协议