本笔记记录如何使用request进行小说的爬取
- 这次爬取小说运用了cheerio模块,该模块类似于jquery模块,可以直接对元素节点进行操作,方便我们对小说内容的爬取。
- 本次爬取的小说网站是http://www.zongheng.com/。
- 这里随意找的一篇小说,找到小说所有目录的页面链接url(这里直接通过F12检查元素就知道小说内容的链接了),链接如下图片所示:
- 具体实现基于上一次爬取图片过程中获取页面的方法,这次同样先获取到页面的链接,以及页面的HTML文档,在通过cheerio模块匹配到小说内容所在的节点,获取小说内容后任然通过流的方式进行快速下载到本地txt文档中。
- 这里引入实际代码进行解释。
// 通过cheerio模块去获取小说
// Cheerio 实现了核心 jQuery 的一个子集。
// 使用非常简单、一致的 DOM 模型。因此,解析、操作和渲染非常高效。几乎可以解析任何 HTML 或 XML 文档。
// 这里爬取的是 http://www.zongheng.com 这个小说网站
// cnpm下载模块后,引入cheerio模块
let cheerio = require('cheerio');
// 引入fs文件模块,帮助爬取的页面写入html文件里面
let fs = require('fs');
// 引入请求模块
let request = require('request');
// 创建写入的路径文件
let writeStream = fs.createWriteStream('novelurl.txt');
// cheerio模块操作本地的现有的HTML页面的DOM节点,进而通过节点进行筛查获取信息
// 因此需要先获取页面的HTML文件
request( "http://book.zongheng.com/showchapter/907701.html",
( err, res, body ) => {
if( err ) return false; //如果请求报错就退出
fs.writeFileSync('./novel.html', body);
/*
这是一章节小说的内容链接:
http://book.zongheng.com/chapter/907701/59100424.html
*/
//console.log( cheerio.load( body ) );
// 类似网页浏览器上下文,load方法将引进<html>,<head>和<body>元素
// 作为一个类似于jquery选择器返回$,
// 官方文档给出的话:Cheerio的选择器实现与jQuery几乎相同,因此API非常相似。
let $ = cheerio.load( body );
// 通过$这个选择器,选择我们爬取内容所在的节点
// return false相当于break ; return true相当于continue
$( ".col-4 a" ).each( function( index ){
if( index > 99 ){
return false; //break,当小说章节达到100章则退出循环
}
// 这里的this等于$获取的a节点,同prop方法捕获a节点中的href属性内容
let strurl = $( this ).prop( "href" ) + '\n'; //小说每一章节链接进行换行处理
writeStream.write( strurl, 'utf-8' ); //以流形式写入novelurl.txt文档
// 判断页面链接是否存在
if( strurl ){
// 调用获取小说内容的函数
getNoveltext( strurl, index );
}
} )
}
)
// 获取小说内容的函数
function getNoveltext( url, index ){
// 通过传入每一章节小说内容的链接,去获取有小说内容的页面HTML
request( url, ( err, res, body) => {
if( err ) return false; //如果请求报错就退出
let $ = cheerio.load( body ); //获取Cheerio的选择器
// 获取页面中content节点下的内容,并获取下面的text内容
let strtext = $( ".content" ).text(); //strtext存放每一章节具体内容
// 小说内容中有2个空格以上的部分进行\r换行处理
// 这里的space是作为形参传入箭头函数中,返回换行\r字符
strtext = strtext.replace( /(\s{2,})/g, space=>"\r"+space );
// 通过fs文件模块将小说内容异步写入text文档,这里必须新建novel的文件夹
fs.writeFileSync( `./novel/page${index+1}.txt`, strtext );
} )
}
- 上面代码写的注释很详细,主要获取了小说内容的链接写入了novel.txt文档中以及小说每一章节内容写入到了noverl的文件夹中,具体效果如下:(代码获取的是100章节,获取几千章节电脑有的要命)
- 以上就是爬取小说的实现过程了,有的地方持续完善吧。