为了账号安全,请及时绑定邮箱和手机立即绑定

nodejs爬虫——知乎专栏

2017.05.08 13:03 5496浏览

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

点击查看更多内容

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

8人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消