node怎麼爬取資料?以下這篇文章跟大家分享一個node爬蟲實例,聊聊利用node抓取小說章節的方法,希望對大家有幫助!
準備用electron
製作一個小說閱讀工具練練手,那麼首先要解決的就是資料問題,也就是小說的文字。
這裡準備使用nodejs對小說網站進行爬蟲爬取,嘗試爬下一本小說,資料就不存放資料庫了,先使用txt
作為文字存儲
在node
中對於網站的請求,本身就存在http
和https
庫,內部含有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
但是我想要的還有各個章節中的內容,這樣一來就需要獲取章節的超鏈接,組成超鏈接鍊錶進去爬取
所以,這裡就要介紹一個js的函式庫了,cheerio
#官方文件:https://cheerio.js.org/
中文文件:https://github.com/cheeriojs/cheerio/wiki/Chinese-README
在文件中,可以使用範例進行偵錯
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爬取資料實例:聊聊怎麼抓取小說章節的詳細內容。更多資訊請關注PHP中文網其他相關文章!