知乎是一个好地方,最近翻阅知乎官网,发现知乎专栏藏的很隐蔽,如果不知道专栏名,只能在搜索中找关键词。而对于我们不知道的领域,我们几乎是认为知乎是没有这方面的专栏的。关于这个会用 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) {
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。虽然我也打印了总的文章数在控制台。