bubao / zhihu-zhuanlan

知乎专栏爬虫
13 stars 9 forks source link

如何使用 #5

Closed ANNOARK closed 4 years ago

ANNOARK commented 4 years ago

您好,我没什么代码基础,但是想用您的代码完成爬取。目前已经完成了cnpm获取那一步,不知道下一步应该怎么办

bubao commented 4 years ago

对不起,最近才看到。 文档一直没更新,在这在写一遍吧。

创建一个项目文件夹,比如getSomething,进入文件夹中,下面所以操作都在这个文件夹下。

获取包

git clone https://github.com/bubao/zhihu-zhuanlan.git

在新建一个index.js文件

const Zhuanlan = require("./zhihu-zhuanlan"); // 引入包
const fs = require("fs");
const util = require("util");
const FsStat = util.promisify(fs.stat);
const MAX_SAFE_INTEGER = 9007199254740991;

function isLength(value) {
    return (
        typeof value === "number" &&
        value > -1 &&
        value % 1 === 0 &&
        value <= MAX_SAFE_INTEGER
    );
}

function isArrayLike(value) {
    return (
        value != null && typeof value !== "function" && isLength(value.length)
    );
}

const mkdir = async (...filePath) => {
    if (isArrayLike(filePath)) {
        filePath = require("path").resolve(...filePath);
    }
    await FsStat(`${filePath}`).then(() => {
        console.log(
            `⚓  ${require("path").basename(filePath)} 文件夹已经存在`
        );
    }).catch(() => {
        fs.mkdir(`${filePath}`, () => {
            console.log(
                `🤖 创建 ${require("path").basename(
                    filePath
                )}文件夹成功`
            );
        });
    });
};

const writeFile = (path, data, format) => {
    fs.writeFile(`${path}.${format}`, data, "utf8", err => {
        if (err) throw err;
    });
};
const run = (path, columnsID) => {
    const zhihu = Zhuanlan.init({ columnsID });
    let dir;
    zhihu.once("info", (data) => {
        dir = data.title;
        mkdir(`${path}/${data.title}`);
    });
    let write_count = 0;
    zhihu.on("batch_data", (element) => {
        // console.log((element.now_count / element.articles_count * 100).toFixed(2) + "%");
        element.data.map(({ filenameTime, header, content, copyRight, json }) => {
            writeFile(
                `${path}/${dir}/${filenameTime}`,
                header + content + copyRight,
                "md"
            );
            writeFile(
                `${path}/${dir}/${filenameTime}`,
                JSON.stringify(json),
                "json"
            );
            write_count++;
                        // 打印进度
            console.log((write_count / element.articles_count * 100).toFixed(2) + "%");
        });
    });
    zhihu.getAll();
};

run("./", "YJango"); // 第一个参数"./"不用改,第二个参数"YJango"可以改成你需要的网址上的专栏名

运行

node index.js

end