天天看点

使用node爬取小说内容并保存到本地

1. 先下载node

2. 创建一个以 .js 结尾的文件

3. 创建一个存放小说的文件夹名称自定义

4. 下载 cheerio 和 request 包

npm i cheerio

npm i request

5. 在文件内导入需要用到的模块

// npm下载模块后,引入cheerio模块
let cheerio = require('cheerio');
// 引入fs文件模块,帮助爬取的页面写入文件里面
let fs = require('fs');
// 引入请求模块
let request = require('request');
           

6. 获取每一章的链接

这里可以在页面按F12打开类似于这样的界面 

使用node爬取小说内容并保存到本地
// cheerio模块操作本地的现有的HTML页面的DOM节点,进而通过节点进行筛查获取信息
request("http://book.zongheng.com/showchapter/1215587.html",
    (err, res, body) => {
        if (err) return false; //如果请求报错就退出

        // 类似于jquery选择器返回$,
        // Cheerio的选择器实现与jQuery几乎相同,因此API非常相似。
        let $ = cheerio.load(body);
        // 通过$这个选择器,选择我们爬取内容所在的节点
        // return false相当于break ; return true相当于continue
        // 根据上图选择对应的节点获取每一章的链接
        $(".col-4 a").each(function (index) {
             if (index > 100) {
                 return false; //break,当小说章节达到100章则退出循环
             }
             // 这里的this等于$获取的a节点,同prop方法捕获a节点中的href属性内容
             let strurl = $(this).prop("href");
             // 判断页面链接是否存在
             if (strurl) {
                 // 调用获取小说内容的函数
                 getNoveltext(strurl, index);
             }

        })
    }
)
           

7. 获取小说内容

跟第6步一样的先按f12

使用node爬取小说内容并保存到本地

 获取对应节点数据

// 获取小说内容的函数
function getNoveltext(url, index) {
    // 通过传入每一章节小说内容的链接,获取小说的内容
    request(url, (err, res, body) => {
        if (err) return false; //如果请求报错就退出
        let $ = cheerio.load(body); //获取Cheerio的选择器
        // 获取每一章的标题
        let strtext = $('.title .title_txtbox').text() + '\n\r'  // 进行换行
        // 获取文字内容
        $(".content p").each((index, el) => {
            strtext += $(el).text() + '\r'  
        })

        // 通过fs文件模块将小说内容异步写入text文档,这里必须新建fiction的文件夹
        fs.writeFileSync(`./fiction/page${index + 1}.txt`, strtext);
    })
}
           

完整内容

// npm下载模块后,引入cheerio模块
let cheerio = require('cheerio');
// 引入fs文件模块,帮助爬取的页面写入文件里面
let fs = require('fs');
// 引入请求模块
let request = require('request');

// cheerio模块操作本地的现有的HTML页面的DOM节点,进而通过节点进行筛查获取信息
request("http://book.zongheng.com/showchapter/1215587.html",
    (err, res, body) => {
        if (err) return false; //如果请求报错就退出

        // 类似于jquery选择器返回$,
        // Cheerio的选择器实现与jQuery几乎相同,因此API非常相似。
        let $ = cheerio.load(body);
        // 通过$这个选择器,选择我们爬取内容所在的节点
        // return false相当于break ; return true相当于continue
        // 根据上图选择对应的节点获取每一章的链接
        $(".col-4 a").each(function (index) {
             if (index > 100) {
                 return false; //break,当小说章节达到100章则退出循环
             }
             // 这里的this等于$获取的a节点,同prop方法捕获a节点中的href属性内容
             let strurl = $(this).prop("href");
             // 判断页面链接是否存在
             if (strurl) {
                 // 调用获取小说内容的函数
                 getNoveltext(strurl, index);
             }

        })
    }
)

// 获取小说内容的函数
function getNoveltext(url, index) {
    // 通过传入每一章节小说内容的链接,获取小说的内容
    request(url, (err, res, body) => {
        if (err) return false; //如果请求报错就退出
        let $ = cheerio.load(body); //获取Cheerio的选择器
        // 获取每一章的标题
        let strtext = $('.title .title_txtbox').text() + '\n\r'  // 进行换行
        // 获取文字内容
        $(".content p").each((index, el) => {
            strtext += $(el).text() + '\r'  
        })

        // 通过fs文件模块将小说内容异步写入text文档,这里必须新建fiction的文件夹
        fs.writeFileSync(`./fiction/page${index + 1}.txt`, strtext);
    })
}
           

完整目录结构

使用node爬取小说内容并保存到本地
 在当前文件夹下运行 node ./1.js

 就可以在fiction文件夹下得到所有章节的text文件

使用node爬取小说内容并保存到本地

继续阅读