NodeJS爬取笔趣阁小说

1,187 阅读2分钟

采用的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执行即可