亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

nodejs爬蟲——知乎專欄

標簽:
Node.js

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

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JS工程師
手記
粉絲
9581
獲贊與收藏
319

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消