采用的npm包有crawler、cheerio 安装依赖 npm i --save crawler cheerio
一、配置书目录和输出文件
需要注意的是url就是想要爬取的书在笔趣阁的总目录
const Config = {
url:"https://www.biquge.com.cn/book/41972/",
outFile:"./book.txt"
}
二、主要函数
- getCatalog
作用是获取书的每一章的地址和标题
function getCatalog(){
var Catalog = new crawler({
encoding:null,
jQuery:false,
callback:function(err,res,done){
if(err){
console.log(err);
return;
}
//获取文本并且解析
let $ = cheerio.load(res.body.toString())
//目录数组
let arr = []
$("#list dl dd a").each((i,e) => {
//书的地址
let href = $(e).attr("href").split("/")[3]
let json = {
href,
//标题
title:$(e).text()
}
arr.push(json)
})
//获取数据
getPage(arr,0,arr.length)
}
});
Catalog.queue({
//书目录地址
url:Config.url,
//模仿客户端访问
headers:{'User-Agent': 'requests'},
})
}
- getPage
获取文章并且输出到配置的文件中
function getPage(arr,idx,len) {
if(idx >= len) {
console.log('爬书完成!');
return
}
var page = new crawler({
encoding:null,
jQuery:false,
callback:function(err,res,done){
if(err){
console.log(err);
return;
}
let $ = cheerio.load(res.body.toString())
//把标题加入到每一张的前面
let info = "\n" + arr[idx].title + '\n' + $("#content").text()
fs.appendFile(Config.outFile,info,function(e) {
if(e) return
//输出当前状态
console.log("已完成:" + arr[idx].title);
//递归调用本函数以获取下一章内容
getOnePage(arr,idx+1,len)
})
}
});
page.queue({
url:Config.url+arr[idx].href,
headers:{'User-Agent': 'requests'},
})
}
三、完整代码
const fs = require("fs");
const crawler=require("crawler");
const cheerio = require("cheerio")
const Config = {
//书的目录地址
url:"https://www.biquge.com.cn/book/41972/",
//输出文件
outFile:"./book.txt"
}
getCatalog()
function getCatalog(){
var Catalog = new crawler({
encoding:null,
jQuery:false,
callback:function(err,res,done){
if(err){
console.log(err);
return;
}
//获取文本并且解析
let $ = cheerio.load(res.body.toString())
//目录数组
let arr = []
$("#list dl dd a").each((i,e) => {
//书的地址
let href = $(e).attr("href").split("/")[3]
let json = {
href,
//标题
title:$(e).text()
}
arr.push(json)
})
//获取数据
getPage(arr,0,arr.length)
}
});
Catalog.queue({
//书目录地址
url:Config.url,
//模仿客户端访问
headers:{'User-Agent': 'requests'},
})
}
function getPage(arr,idx,len) {
if(idx >= len) {
console.log('爬书完成!');
return
}
var page = new crawler({
encoding:null,
jQuery:false,
callback:function(err,res,done){
if(err){
console.log(err);
return;
}
let $ = cheerio.load(res.body.toString())
//把标题加入到每一张的前面
let info = "\n" + arr[idx].title + '\n' + $("#content").text()
fs.appendFile(Config.outFile,info,function(e) {
if(e) return
//输出当前状态
console.log("已完成:" + arr[idx].title);
//递归调用本函数以获取下一章内容
getOnePage(arr,idx+1,len)
})
}
});
page.queue({
url:Config.url+arr[idx].href,
headers:{'User-Agent': 'requests'},
})
}
四、使用
在Config中修改你想要爬取的地址和输出文件,并且安装好依赖即可通过node执行即可