您的位置:首页技术文章
文章详情页

node.js - 关于Node爬虫爬小说的问题

【字号: 日期:2024-07-16 18:02:09浏览:50作者:猪猪

问题描述

最近因为没小说看,也无聊,就想着用Node来写爬虫爬书下来,弄了好几天有些问题。爬小说异步的话章节不是顺序排列的,所以用了sync-request进行同步操作,我爬的是笔趣阁这个网站上的书,现在由于刚学,只是做了爬单本书的。我发现在爬取的时候,会假死掉,停在那不动了,而且每次的章节数不同,我就加了个十秒的timeout超时,但是还是会出现这种假死的情况。后来百度了下,说网站是有防止爬虫的东东的,具体我也不太清楚==,我就想,那我就加个间隔咯,我让他每请求十次就休息20秒钟,再重新爬。结果!!!还是会假死,233333。所以现在有点不明白为啥了,想求教一下,给点思路。拜托各位~~

下面是我请求的代码,具体章节列表我在另一个js里面爬出来写在json里面了,这边是直接请求每个链接的了:

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’)//爬取每章节正文并存在txt中function getContent(list,title) { //用try catch进行错误捕获,防止报错跳出 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(/&nbsp;/g, ’’) fs.appendFileSync(title+'.txt', ContentTitle) fs.appendFileSync(title+'.txt', ContentText) console.log('爬取' + list.link + '成功') }catch(err) { console.log('爬取' + list.link + '出错') }}//为了达到间隔的调用请求做了递归调用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)

node.js - 关于Node爬虫爬小说的问题

就和这个一样,爬了一段时间就这样了,就跟死机了似得,后面不管等多久都没动静,设置的超时啥的也没有反应

问题解答

回答1:

这两天一直在弄这个问题,起初是以为是sync-request的问题,后来换了别的还是一样。我就猜可能是ip网站给屏蔽了还是什么的,后来中午吃饭和同事闲聊,顺便就请教了下,他们也就是说大概就这个问题。既然如此,我就去弄了些免费的代理IP,然后在请求的时候,只要是请求超时或者报错就立马切换一个IP地址去请求。这样下来,昨天特地爬了一个很大的小说,今天上班过来一看,全部爬下来了,没有出现问题,哈哈。不过免费的代理IP很多都用不了,所以在这上面浪费了部分时间。现在要开始看看怎么爬多本书了,↖(^ω^)↗

相关文章: