node.js - 關(guān)于Node爬蟲爬小說的問題
問題描述
最近因?yàn)闆]小說看,也無聊,就想著用Node來寫爬蟲爬書下來,弄了好幾天有些問題。爬小說異步的話章節(jié)不是順序排列的,所以用了sync-request進(jìn)行同步操作,我爬的是筆趣閣這個(gè)網(wǎng)站上的書,現(xiàn)在由于剛學(xué),只是做了爬單本書的。我發(fā)現(xiàn)在爬取的時(shí)候,會(huì)假死掉,停在那不動(dòng)了,而且每次的章節(jié)數(shù)不同,我就加了個(gè)十秒的timeout超時(shí),但是還是會(huì)出現(xiàn)這種假死的情況。后來百度了下,說網(wǎng)站是有防止爬蟲的東東的,具體我也不太清楚==,我就想,那我就加個(gè)間隔咯,我讓他每請求十次就休息20秒鐘,再重新爬。結(jié)果!!!還是會(huì)假死,233333。所以現(xiàn)在有點(diǎn)不明白為啥了,想求教一下,給點(diǎn)思路。拜托各位~~
下面是我請求的代碼,具體章節(jié)列表我在另一個(gè)js里面爬出來寫在json里面了,這邊是直接請求每個(gè)鏈接的了:
var http = require(’http’)var fs = require(’fs’)var cheerio = require(’cheerio’)var iconv = require(’iconv-lite’)var request = require(’sync-request’)var urlList = JSON.parse(fs.readFileSync(’list.json’, ’utf-8’))var header = JSON.parse(fs.readFileSync(’header.json’), ’utf-8’)//爬取每章節(jié)正文并存在txt中function getContent(list,title) { //用try catch進(jìn)行錯(cuò)誤捕獲,防止報(bào)錯(cuò)跳出 try{ var res = request(’GET’,list.link,{ ’timeout’: 10000, ’retry’: true, ’retryDelay’: 10000 }) var html = iconv.decode(res.body, ’utf8’) var $ = cheerio.load(html,{ decodeEntities: false }) var ContentTitle = $(’.bookname h1’).text() var ContentText = $(’#content’).text().trim().replace(’readx();’, ’’).replace(/ /g, ’’) fs.appendFileSync(title+'.txt', ContentTitle) fs.appendFileSync(title+'.txt', ContentText) console.log('爬取' + list.link + '成功') }catch(err) { console.log('爬取' + list.link + '出錯(cuò)') }}//為了達(dá)到間隔的調(diào)用請求做了遞歸調(diào)用function getUrl(index) { for (let i = index;i < urlList.length;i++){ if (i>0 && i%10 == 0){ getContent(urlList[i],header.title) console.log('休息一下') setTimeout(() => {i++getUrl(i) },20000) return }else { console.log(i) getContent(urlList[i],header.title) } }}getUrl(0)
就和這個(gè)一樣,爬了一段時(shí)間就這樣了,就跟死機(jī)了似得,后面不管等多久都沒動(dòng)靜,設(shè)置的超時(shí)啥的也沒有反應(yīng)
問題解答
回答1:這兩天一直在弄這個(gè)問題,起初是以為是sync-request的問題,后來換了別的還是一樣。我就猜可能是ip網(wǎng)站給屏蔽了還是什么的,后來中午吃飯和同事閑聊,順便就請教了下,他們也就是說大概就這個(gè)問題。既然如此,我就去弄了些免費(fèi)的代理IP,然后在請求的時(shí)候,只要是請求超時(shí)或者報(bào)錯(cuò)就立馬切換一個(gè)IP地址去請求。這樣下來,昨天特地爬了一個(gè)很大的小說,今天上班過來一看,全部爬下來了,沒有出現(xiàn)問題,哈哈。不過免費(fèi)的代理IP很多都用不了,所以在這上面浪費(fèi)了部分時(shí)間。現(xiàn)在要開始看看怎么爬多本書了,↖(^ω^)↗
相關(guān)文章:
1. python - django 里自定義的 login 方法,如何使用 login_required()2. javascript - git clone 下來的項(xiàng)目 想在本地運(yùn)行 npm run install 報(bào)錯(cuò)3. python如何不改動(dòng)文件的情況下修改文件的 修改日期4. mysql優(yōu)化 - mysql count(id)查詢速度如何優(yōu)化?5. 主從備份 - 跪求mysql 高可用主從方案6. angular.js - 不適用其他構(gòu)建工具,怎么搭建angular1項(xiàng)目7. mysql主從 - 請教下mysql 主動(dòng)-被動(dòng)模式的雙主配置 和 主從配置在應(yīng)用上有什么區(qū)別?8. node.js - node_moduls太多了9. android-studio - Android 動(dòng)態(tài)壁紙LayoutParams問題10. sql語句如何按or排序取出記錄
