继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

nodejs爬虫——知乎专栏

布宝
关注TA
已关注
手记 22
粉丝 9581
获赞 319

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

打开App,阅读手记
8人推荐
发表评论
随时随地看视频慕课网APP

热门评论

收集了

SyntaxError: Unexpected token e in JSON at position 7448

node src/index.js报上面的错误...JSON格式化出错

去你git上研究一波

查看全部评论