11-爬虫爬取小说

本文档介绍了如何利用request和cheerio库来爬取网络小说。首先,通过cheerio解析HTML文档,找到小说章节链接。接着,遍历章节链接并获取每章内容,最后将内容写入TXT文件。示例代码详细展示了爬取过程,包括获取HTML、筛选章节链接、读取章节内容和保存到本地文件。整个流程适用于批量下载长篇小说,可扩展至其他类似网站。
摘要由CSDN通过智能技术生成

本笔记记录如何使用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章节,获取几千章节电脑有的要命)

小说内容链接
小说txt文件
小说具体内容

  • 以上就是爬取小说的实现过程了,有的地方持续完善吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐沐茶壶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值