首頁  >  文章  >  web前端  >  node爬取資料實例:聊聊怎麼抓取小說章節

node爬取資料實例:聊聊怎麼抓取小說章節

青灯夜游
青灯夜游轉載
2022-05-02 10:00:173688瀏覽

node怎麼爬取資料?以下這篇文章跟大家分享一個node爬蟲實例,聊聊利用node抓取小說章節的方法,希望對大家有幫助!

node爬取資料實例:聊聊怎麼抓取小說章節

準備用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

node爬取資料實例:聊聊怎麼抓取小說章節

但是我想要的還有各個章節中的內容,這樣一來就需要獲取章節的超鏈接,組成超鏈接鍊錶進去爬取

node爬取資料實例:聊聊怎麼抓取小說章節

cheerio庫

所以,這裡就要介紹一個js的函式庫了,cheerio

#官方文件:https://cheerio.js.org/

中文文件:https://github.com/cheeriojs/cheerio/wiki/Chinese-README

在文件中,可以使用範例進行偵錯

node爬取資料實例:聊聊怎麼抓取小說章節


#使用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')
})

列印一下資訊

node爬取資料實例:聊聊怎麼抓取小說章節

##可以同時將這些資訊也儲存起來

node爬取資料實例:聊聊怎麼抓取小說章節


現在章節數和章節的連結都有了,那麼就可以獲得章節的內容了。

因為批量爬取最後需要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)

node爬取資料實例:聊聊怎麼抓取小說章節


這樣,就可以根據上面的方法,來創造一個呼叫接口,傳入不同的章節參數,取得當前章節的資料

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("启动了。。。");
})

效果:

node爬取資料實例:聊聊怎麼抓取小說章節

現在,一個簡單的查找章節介面就做好了,也可以做一些參數超出判斷。

對於不同的資料接口,爬蟲處理方式也不一樣,不過在本次爬取的連結中,內容的顯示並不是由前端動態渲染出來的,所以可以直接爬取靜態的html即可。如果遇到資料是透過Ajax之類的方式取得到的json串,那就要透過網路介面去請求資料了。

更多node相關知識,請造訪:

nodejs 教學

以上是node爬取資料實例:聊聊怎麼抓取小說章節的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除