前段时间沉迷一本小说,于是想下载成txt来观看,网上找了很久都没有找到资源,但是能找到可以在线观看的网站,于是产生一个想法,我能不能给它爬下来自己制作一个txt文档。
大概思路如下:打开该网站可以查看到网页的dom,根据dom将内容截取成字符串做一定的修改替换变成自己想要的字符串,然后写入本地的一个文件里面。
环境方面需要安装nodejs
依赖的话就是两个,一个是axios,用来发起网络请求的工具,也可以直接使用nodejs提供的http模块来获取,然后就是关键的cheerio,一个可以像jquery一样操作网页的工具库。
开搞
npm init -y
npm i axios cheerio --save
index.js内容如下,每一行都注释了
const axios = require("axios"); // 引入axios--发请求
const cheerio = require("cheerio"); // 引入cheerio--处理网页
const fs = require("fs"); // 引入fs模块进行文件系统操作
// getMenu用来构建urlList
let getMenu = async () => {
// 这里通过axios获取到页面的章节列表
let { data } = await axios.get("http://www.tycqzw.net/148_148589/");
// 将获取到的静态网页生成dom,初始化操作
const $ = cheerio.load(data);
// 根据网页选择到需要使用的数据,这里的结构是<div id="list"><dl><dd><a href="/148_148589/53672568.html">第五章 归去!</a></dd></dl></div>
let list = $("#list dl dd a"); // 一个包含了所有a标签的类数组对象
let menuList = [];
//开始遍历该对象并构建urlList
for (const key in list) {
const element = list[key];
try {
menuList.push("http://www.tycqzw.net" + $(element).attr("href"));
} catch (error) {
console.log("获取菜单错误");
}
}
// 构建完成,开始缓存内容
menuList.forEach(async (i, index) => {
// 使用定时器来确保顺序
setTimeout(() => {
generateTxtByUrl(i);
}, 500 * index);
});
};
// 通过url生成内容
const generateTxtByUrl = async (url) => {
try {
let { data } = await axios.get(url);
const $ = cheerio.load(data);
// 获取章节的标题
let title = $(".bookname h1").text();
// 获取小说的内容,这里的内容里面比较乱,通过replace给无关的内容替换掉
let content = $("#content")
.html()
.replace(/\s+/g, "")
.replaceAll(" ", " ")
.replaceAll("<br><br>", "");
// 标题+内容就是一章的整个内容
let params = title + "\n" + content;
const filepath = "./cscyjzyks.txt";
// 使用fs开始写文件
fs.appendFileSync(filepath, params, (err) => {
if (err) throw err;
});
console.log(title + "缓存成功!");
} catch (error) {
console.log("缓存失败" + url);
}
};
getMenu()
写完之后直接node index.js就可以愉快的爬内容了