站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        node爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)

        node怎么爬取數(shù)據(jù)?下面本篇文章給大家分享一個(gè)node爬蟲實(shí)例,聊聊利用node抓取小說章節(jié)的方法,希望對大家有所幫助!

        node爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)

        準(zhǔn)備用electron制作一個(gè)小說閱讀工具練練手,那么首先要解決的就是數(shù)據(jù)問題,也就是小說的文本。

        這里準(zhǔn)備使用nodejs對小說網(wǎng)站進(jìn)行爬蟲爬取,嘗試爬下一本小說,數(shù)據(jù)就不存放數(shù)據(jù)庫了,先使用txt作為文本存儲

        node中對于網(wǎng)站的請求,本身就存在httphttps庫,內(nèi)部含有request請求方法。

        實(shí)例:

        request = https.request(TestUrl, { encoding:'utf-8' }, (res)=>{     let chunks = ''     res.on('data', (chunk)=>{         chunks += chunk     })     res.on('end',function(){         console.log('請求結(jié)束');     }) })

        但是也就到此為止了,只是存取了一個(gè)html的文本數(shù)據(jù),并不能夠?qū)?nèi)部元素進(jìn)行提取之類的工作(也可以正則拿,但是太過復(fù)雜)。

        我將訪問到的數(shù)據(jù)通過fs.writeFile方法存儲起來了,這只是整個(gè)網(wǎng)頁的html

        node爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)

        但是我想要的還有各個(gè)章節(jié)中的內(nèi)容,這樣一來就需要獲取章節(jié)的超鏈接,組成超鏈接鏈表進(jìn)去爬取

        node爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)

        cheerio庫

        所以,這里就要介紹一個(gè)js的庫了,cheerio

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

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

        在文檔中,可以使用示例進(jìn)行調(diào)試

        node爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)


        使用cheerio解析HTML

        cheerio解析html時(shí),獲取dom節(jié)點(diǎn)的方式與jquery相似。

        根據(jù)之前獲取到的書籍首頁的html,查找自己想要的dom節(jié)點(diǎn)數(shù)據(jù)

        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爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)

        可以同時(shí)將這些信息也存儲起來

        node爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)


        現(xiàn)在章節(jié)數(shù)和章節(jié)的鏈接都有了,那么就可以獲取章節(jié)的內(nèi)容了。

        因?yàn)榕颗廊∽詈笮枰狪P代理,這里還沒準(zhǔn)備,暫時(shí)先寫獲取某一章節(jié)小說的內(nèi)容方法

        爬取某一章節(jié)的內(nèi)容其實(shí)也比較簡單:

        // 爬取某一章節(jié)的內(nèi)容方法 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爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)


        這樣,就可以根據(jù)上面的方法,來創(chuàng)造一個(gè)調(diào)用接口,傳入不同的章節(jié)參數(shù),獲取當(dāng)前章節(jié)的數(shù)據(jù)

        const express = require('express');  const IO = express(); const { getAllChapter, getOneChapter } = require('./readIndex') // 獲取章節(jié)超鏈接鏈表 getAllChapter();  IO.use('/book',function(req, res) {     // 參數(shù)     let query = req.query;     if (query.n) {         // 獲取某一章節(jié)數(shù)據(jù)         let promise = getOneChapter(parseInt(query.n - 1));         promise.then((d)=>{             res.json({ d: d })         }, (d)=>{             res.json({ d: d })         })     } else {         res.json({ d: 404 })     }      })  //服務(wù)器本地主機(jī)的數(shù)字 IO.listen('7001',function(){     console.log("啟動(dòng)了。。。"); })

        效果:

        node爬取數(shù)據(jù)實(shí)例:聊聊怎么抓取小說章節(jié)

        現(xiàn)在,一個(gè)簡單的查找章節(jié)接口就做好了,并且也可以做一些參數(shù)超出判斷。

        對于不同的數(shù)據(jù)接口,爬蟲處理方式也不一樣,不過在本次爬取的鏈接中,內(nèi)容的顯示并不是由前端動(dòng)態(tài)渲染出來的,所以可以直接爬取靜態(tài)的html即可。如果遇到數(shù)據(jù)是通過Ajax之類的方式獲取到的json串,那就要通過網(wǎng)絡(luò)接口去請求數(shù)據(jù)了。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 蜜桃麻豆www久久国产精品 | 69久久精品无码一区二区| 99久久精品国产毛片| 久久久精品人妻一区二区三区蜜桃| 国产精品九九久久免费视频 | 久久97久久97精品免视看秋霞 | 久久精品国产精品亚洲人人| 亚洲精品私拍国产福利在线| 国产午夜精品久久久久免费视| 亚洲AV永久无码精品一区二区| 国产精品成| 久久线看观看精品香蕉国产| 国产成人精品无码播放| 亚洲精品一级无码鲁丝片| 久久国产精品免费一区二区三区 | 国产精品一区12p| 亚洲天堂久久精品| 免费91麻豆精品国产自产在线观看| 国产成人久久精品激情| 精品国产福利一区二区| 久久夜色精品国产噜噜亚洲AV| 亚洲国产精品成人AV无码久久综合影院 | 精品久久久久中文字| 国产精品免费久久久久影院| 亚洲精品视频在线| 欧美日韩精品乱国产538| 国产精品影音先锋| 国产欧美国产精品第一区| 99久久国语露脸精品国产| 国产AV午夜精品一区二区三区| 国产美女精品一区二区三区| 久久精品国产99久久无毒不卡| 久久精品国产亚洲av麻豆色欲 | 精品国精品国产自在久国产应用| 久久精品www人人爽人人| 国产在线精品一区二区中文| 精品久久久久久久久午夜福利| 久久国产精品一国产精品金尊| 国产亚洲色婷婷久久99精品| 国产精品成人A区在线观看| 国产精品扒开腿做爽爽爽视频 |