const axios = require("axios");
const cheerio = require("cheerio");
const fs = require("fs");
// 下载每一章节
async function handleText(url, isFirst) {
const resp = await axios(url);
const $ = cheerio.load(resp.data);
const bookName = $("#r-titlePage > div > h1").text();
// 章节名称
const chapterName = $(
"#reader-content > div.min-h-100vh.relative.z-1.bg-inherit > div > div.relative > div > h1"
).text();
let content = [];
let nextChapterLink = "";
if (isFirst) {
content.push(bookName);
// nextChapterLink = $(
// "#reader-content > div.min-h-100vh.relative.z-1.bg-inherit > div > div.mx-64px.pb-64px.mt-auto > div > a:nth-child()"
// ).attr("href");
} else {
// nextChapterLink = $(
// "#reader-content > div.min-h-100vh.relative.z-1.bg-inherit > div > div.mx-64px.pb-64px.mt-auto > div > a:nth-child(3)"
// ).attr("href");
}
nextChapterLink = $(
"#reader-content > div.min-h-100vh.relative.z-1.bg-inherit > div > div.mx-64px.pb-64px.mt-auto > div > a:nth-child(3)"
).attr("href");
content.push(chapterName);
// if (!nextChapterLink) {
// nextChapterLink = $(
// "#reader-content > div.min-h-100vh.relative.z-1.bg-inherit > div > div.mx-64px.pb-64px.mt-auto > div > a:nth-child(3)"
// ).attr("href");
// console.log("nextChapterLink11111", nextChapterLink);
// }
$("main")
.find("p")
.each((idx, ele) => {
content.push($(ele).text());
});
content.push("\f");
// $("p").each((idx, ele) => {
// content.push($(ele).text());
// });
content = content.join("\n");
return { title: bookName, chapterName, content, nextChapterLink };
}
async function createFile(bookName) {
let filename = `${bookName}.txt`;
return new Promise((resolve) => {
fs.open(filename, "w", function (err, file) {
if (err) throw err;
// console.log("File is created successfully.");
resolve("success");
});
});
}
async function writeFile(bookName, content) {
let filename = `${bookName}.txt`;
return new Promise((resolve) => {
fs.appendFile(filename, content, function (err) {
if (err) throw err;
// console.log("Content has been added!");
resolve("success");
});
});
}
// handleText(url);
async function downloadBook(url) {
let nextUrl = url;
let isFirst = true;
let bookName = "";
console.log("下载开始...");
while (nextUrl) {
const { title, chapterName, content, nextChapterLink } = await handleText(
nextUrl,
isFirst
);
// console.log(title, content);
console.log(chapterName);
nextUrl = nextChapterLink;
if (isFirst) {
bookName = title;
await createFile(bookName);
}
await writeFile(bookName, content);
isFirst = false;
}
console.log("下载完成");
// console.log(title, chapterName, content, nextChapterLink);
// 下一章
}
// const url = `https://www.qidian.com/chapter/1025990049/651697912/`;
// const url = `https://www.qidian.com/chapter/2952453/47370768/`;
downloadBook(url);
JJJ69
- 粉丝: 6365
- 资源: 5917
最新资源
- 基于C语言的嵌入式软件定时器详细文档+全部资料+高分项目+源码.zip
- 基于ffmpeg的直播推流器,超级稳定,经过长时间稳定性测试,超低延时,可用于手机,电视,嵌入式等直播App及设备。详细文档+全部资料+高分项目+源码.zip
- 基于DCT算法的水印嵌入和提取的移动智能终端数字图像证据系统详细文档+全部资料+高分项目+源码.zip
- 基于FPGA的DDR1控制器,为低端FPGA嵌入式系统提供廉价、大容量的存储详细文档+全部资料+高分项目+源码.zip
- 基于FreeRTOS开发的嵌入式开发框架详细文档+全部资料+高分项目+源码.zip
- 基于FMCW雷达的多天线定位系统详细文档+全部资料+高分项目+源码.zip
- 基于FriendlyARM6410平台的嵌入式Qt程序:实时天气信息,远程vnc控制,远程监视摄像头,语音控制,语音输出TTS详细文档+全部资料+高分项目+源码.zip
- 基于FSMPSTem32的嵌入式音乐播放器、实训作业详细文档+全部资料+高分项目+源码.zip
- 基于GEC6818嵌入式大作业详细文档+全部资料+高分项目+源码.zip
- 基于jetty嵌入式容器的java性能分析工具,内嵌H2 database,以图表形式直观展现应用当前性能数据详细文档+全部资料+高分项目+源码.zip
- 基于jq开发的数学公式插件,可随意嵌入web中详细文档+全部资料+高分项目+源码.zip
- 基于Linux系统的应用程序,旨在搭建一套完整的多进程多线程通讯的消息框架. 支持多SOC的嵌入式APP详细文档+全部资料+高分项目+源码.zip
- 基于mplayer的嵌入式音视频播放器详细文档+全部资料+高分项目+源码.zip
- 基于LSM-Tree的嵌入式数据库详细文档+全部资料+高分项目+源码.zip
- 基于liunx下的一个QT程序,KTV点歌系统嵌入式设备详细文档+全部资料+高分项目+源码.zip
- 基于MySQL的嵌入式Linux智慧农业采集控制系统详细文档+全部资料+高分项目+源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈