知乎是一个好地方,最近翻阅知乎官网,发现知乎专栏藏的很隐蔽,如果不知道专栏名,只能在搜索中找关键词。而对于我们不知道的领域,我们几乎是认为知乎是没有这方面的专栏的。关于这个会用Google的朋友应该会知道怎么样在网上找到所有的知乎专栏
爬虫诞生作为一个收藏癖,看到好东西不藏在本地就不爽,虽然存起来大多时候是忘记它的存在的。再者,最近发现有些知乎专栏的文章确实不错,就萌生了爬专栏文章的念头。在github上找了很久,发现没有爬专栏的爬虫,只找到爬某用户回答的爬虫。模仿别人的爬虫,于是这个爬虫就诞生了。
爬虫原理其实我也不太明白这个爬虫的原理,四个*.js
文件,只有一个是我自己写的,其他的都是网上找的,反正就是能用就对了(⊙v⊙)。
废话不多说了,源码送上:
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。虽然我也打印了总的文章数在控制台。
热门评论
收集了
SyntaxError: Unexpected token e in JSON at position 7448
node src/index.js报上面的错误...JSON格式化出错
去你git上研究一波