中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用node抓取小說章節

發布時間:2022-05-07 18:31:30 來源:億速云 閱讀:323 作者:iii 欄目:web開發

本文小編為大家詳細介紹“怎么用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庫

在文檔中,可以使用示例進行調試

怎么用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抓取小說章節”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉林市| 大荔县| 汶川县| 娄底市| 循化| 丹东市| 富阳市| 盘锦市| 石河子市| 十堰市| 北票市| 商水县| 彰化县| 龙岩市| 亚东县| 常熟市| 沙雅县| 五常市| 明溪县| 石门县| 德阳市| 镶黄旗| 谷城县| 枣阳市| 远安县| 平和县| 宜宾县| 佛山市| 宜丰县| 盖州市| 临城县| 革吉县| 上杭县| 宝丰县| 大名县| 禄劝| 文山县| 民县| 横山县| 威远县| 邓州市|