首页前端开发JavaScriptnode爬取数据实例:聊聊怎么抓取小说章节

node爬取数据实例:聊聊怎么抓取小说章节

时间2024-01-31 12:25:02发布访客分类JavaScript浏览763
导读:收集整理的这篇文章主要介绍了node爬取数据实例:聊聊怎么抓取小说章节,觉得挺不错的,现在分享给大家,也给大家做个参考。node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助...
收集整理的这篇文章主要介绍了node爬取数据实例:聊聊怎么抓取小说章节,觉得挺不错的,现在分享给大家,也给大家做个参考。node怎么爬取数据?下面本篇文章给大家分享一个node爬虫实例,聊聊利用node抓取小说章节的方法,希望对大家有所帮助!@H_304_0@

准备用electron制作一个小说阅读工具练练手,那么首先要解决的就是数据问题,也就是小说的文本。

这里准备使用nodejs对小说网站进行爬虫爬取,尝试爬下一本小说,数据就不存放数据库了,先使用txt作为文本存储

node中对于网站的请求,本身就存在httphttps库,内部含有request请求方法。

实例:

request = https.request(testUrl, {
 encoding:'utf-8' }
    , (res)=>
{
        let chunks = ''    res.on('data', (chunk)=>
{
        chunks += chunk    }
)    res.on('end',function(){
            console.LOG('请求结束');
    }
)}
    )

但是也就到此为止了,只是存取了一个htML的文本数据,并不能够对内部元素进行提取之类的工作(也可以正则拿,但是太过复杂)。

我将访问到的数据通过fs.wrITeFile方法存储起来了,这只是整个网页的html

但是我想要的还有各个章节中的内容,这样一来就需要获取章节的超链接,组成超链接链表进去爬取

cheerio库

所以,这里就要介绍一个js的库了,cheerio

官方文档:https://cheerio.js.org/

中文文档:https://github.COM/cheeriojs/cheerio/wiki/Chinese-README

在文档中,可以使用示例进行调试


使用cheerio解析HTML

cheerio解析html时,获取dom节点的方式与jquery相似。

根据之前获取到的书籍首页的html,查找自己想要的dom节点数据

const fs = require('fs')const cheerio = require('cheerio');
// 引入读取方法const {
 getFile, writeFun }
     = require('./requestNovel')let hasIndexpromise = getFile('./hasGetfile/index.html');
    let BookArray = [];
    hasIndexPRomise.then((res)=>
{
        let htmlstr = res;
        let $ = cheerio.load(htmlstr);
        $(".listmain dl dd a").map((index, item)=>
{
            let name = $(item).text(), href = 'https://www.shuquge.com/txt/147032/' + $(item).attr('href')        if (index >
 11){
            bookArray.push({
 name, href }
)        }
            }
)    // console.log(bookArray)    writeFun('./hasGetfile/hrefList.txt', JSON.stringify(bookArray), 'w')}
    )

打印一下信息

可以同时将这些信息也存储起来


现在章节数和章节的链接都有了,那么就可以获取章节的内容了。

因为批量爬取最后需要IP代理,这里还没准备,暂时先写获取某一章节小说的内容方法

爬取某一章节的内容其实也比较简单:

// 爬取某一章节的内容方法function getOneChapter(n) {
        return new Promise((resolve, reject)=>
{
            if (n >
= bookArray.length) {
            reject('未能找到')        }
            let name = bookArray[n].name;
        request = https.request(bookArray[n].href, {
 encoding:'gbk' }
    , (res)=>
{
                let html = ''            res.on('data', chunk=>
{
                    html += chunk;
            }
    )            res.on('end', ()=>
{
                               let $ = cheerio.load(html);
                    let content = $("#content").text();
                if (content) {
                    // 写成txt                    writeFun(`./hasGetfile/${
name}
    .txt`, content, 'w')                    resolve(content);
                }
 else {
                    reject('未能找到')                }
            }
)        }
    )        request.end();
    }
)}
    getOneChapter(10)


这样,就可以根据上面的方法,来创造一个调用接口,传入不同的章节参数,获取当前章节的数据

const exPress = require('express');
     const IO = express();
const {
 getAllChapter, getOneChapter }
     = require('./readIndex')// 获取章节超链接链表getAllChapter();
IO.use('/book',function(req, res) {
        // 参数    let query = req.query;
    if (query.n) {
            // 获取某一章节数据        let promise = getOneChapter(parseint(query.n - 1));
            promise.then((d)=>
{
            res.json({
 d: d }
)        }
    , (d)=>
{
            res.json({
 d: d }
)        }
)    }
 else {
        res.json({
 d: 404 }
)    }
    }
)//服务器本地主机的数字IO.listen('7001',function(){
        console.log("启动了。。。");
}
    )

效果:

现在,一个简单的查找章节接口就做好了,并且也可以做一些参数超出判断。

对于不同的数据接口,爬虫处理方式也不一样,不过在本次爬取的链接中,内容的显示并不是由前端动态渲染出来的,所以可以直接爬取静态的html即可。如果遇到数据是通过Ajax之类的方式获取到的json串,那就要通过网络接口去请求数据了。

更多node相关知识,请访问:nodejs 教程!

以上就是node爬取数据实例:聊聊怎么抓取小说章节的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

nodenodejs

若转载请注明出处: node爬取数据实例:聊聊怎么抓取小说章节
本文地址: https://pptw.com/jishu/593957.html
JavaScript经典基础详解之函数 什么是管道?浅析Angular中的管道(PIPE)

游客 回复需填写必要信息