node爬虫爬取小说
node爬虫爬取小说
最近发现自己喜欢的一个小说无法下载,网页版广告太多,操作太难受,只能自己写个爬虫把内容爬下来放在阅读器里面看
项目下载地址:源码下载
本来想上传个免费资源的,结果审核通过后发现需要10积分,没有办法设置成免费的,我抽空把资源上传到百度云再分享出来,有需要的朋友可以留言
直接上代码
const cheerio = require("cheerio");
const puppeteer = require("puppeteer");
const axios = require("axios");
const fs = require("fs");
/**
* 公共请求链接方法
* @param url 请求链接后缀(例:https://www.baidu.com/zhangsan/111 中 /张三/111 是后缀)
*/
const getPage = async (url) => {
//请求链接
const { data } = await axios.get(`https://www.9biquge.com${url}`, {
headers: {
"user-agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.36",
},
});
//返回请求结果
return data;
// console.log('抓取网页成功')
};
//主方法
const main = async () => {
//请求小说章节列表(找那种所有章节都在一个目录下的页面,如果有翻页的话比较麻烦)
const pageData = await getPage("/25/25538/");
//转换页面数据变为节点
const $ = cheerio.load(pageData);
//获取到所有章节标题节点(可通过f12查看)
const $list = $("#list dd a");
//查看有多少章
console.log($list.length);
//开始循环标题节点
for (let i = 0; i < $list.length; i++) {
//拿到标题节点中的页面链接并请求数据(这里可以灵活获取,只要能拿到就行,拿到之后看一下数据是什么样的,完整的还是只有后缀,我这里是只有后缀的)
const pageItemData = await getPage($list[i].attribs.href);
//同样转化为节点
const $$ = cheerio.load(pageItemData);
//获取所有文本数据,我这里是一行行进行处理,因为前后中间都有空格,所以我处理一下,不然到时候排版我不喜欢
let datailText = "";
for (let j = 0; j < $$(".content_detail").length; j++) {
datailText +=
$$(".content_detail")[j].children[0].data.replace(/\s/g, "") + "\n";
}
//写入文件,文件需要新建好,就在项目根目录下下面新建,这里需要替换文件名
fs.appendFileSync(
"./我一个史莱姆.txt",
"\n\n" + $$(".bookname h1").text() + "\n\n" + datailText
);
console.log($$(".bookname h1").text());
//睡眠一秒钟,防止请求频繁被封ip
await sleep(1000);
}
};
/*
休眠函数sleep
调用 await sleep(1500)
*/
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
main();