没错,我就是那个倒霉蛋。前两天爬取一个小说网站的数据的时候被封了ip了,我也是醉了,我明明还没有开始大规模的爬取啊。让我先组织一下问题先。 贴一段代码先把。 var http = require(‘http’); var url = ‘http://www.biquku.com/xiaoshuodaquan/’; var StoryCategory = require(’…/models/storyCategory’); var cheerio = require(‘cheerio’); var iconv = require(‘iconv-lite’) var fs = require(‘fs’); exports.crawlerAll = function(){ http.get(url, function(res){ var html = ‘’; res.on(‘data’, function(data){ html += iconv.decode(data, ‘GBK’) }) res.on(‘end’,function(){ var storiesMessage = crawlerChapter(html); printInfo(storiesMessage); }) }).on(‘error’, function(){ console.log(‘爬取页面错误’); }); } function crawlerChapter(html){ var $ = cheerio.load(html); var stories = $(’.novellist’); var data = []; stories.map(function(i,el){ var player = $(this); var categoryname = player.find(‘h2’).text().trim(); var categories = player.find(‘ul li’); categories.map(function(j,el){ var li = $(this); var storyname = li.find(‘a’).text().trim(); var _author = li.text().trim(); var author = _author.split(’/’)[1]; var link = li.find(‘a’).attr(‘href’).trim(); var number = link.subString(22,23); var storyData = { number : i, categoryname : categoryname, storyname : storyname, author : author, link : link }; data.push(storyData); }); }); return data; } function printInfo(data){ data.forEach(function(story){ var _story = new StoryCategory(story) _story.save(function(err,story){ if(err){ console.log(err); } }) }) console.log(‘ok’); } 就是这么一个爬小说的代码。没用代理,因为我不知道怎么用,所以被封了。 以下是我目前遇到的问题,希望有大手子帮帮我。 1.很明显我是被biquku.com封了ip了。如果我不换一个方法的话,明显也会被xxx.com或者hhh.com给封的,可是怎么办呢。 2.爬小说最重要的是更新,按照我的想法是基本上所有未完本的小说都再爬一次更新一次,这不就又有问题了。 3.救命啊 !!!
很明显是因为短时间内频繁提交才会被封的。 可以把提交的速度减下来或者使用ip池代理http://www.xicidaili.com/
你反复执行crawlerAll了吗,或者你还有其他的访问该网站的代码,你给的代码中只是去访问了“http://www.biquku.com/xiaoshuodaquan/”一下,不该被封啊。ip被封了什么现象,浏览器访问可以吗?
@youthfighter 我的电脑上不了。。。我同学的电脑可以上。尴尬。还有,我明显没有反复提交,两三次就调试完了这段代码,这是存数据库的,存了两次没偏差。当天没有情况,第二天我就GG了
@jimliang 很尴尬,IP池怎么搞,我查了下百度,好像node在request里可以配置host改代理之类的爬网站,貌似我就没有成功过。
应该模拟浏览器行为去爬虫,然后降低频率。每天定时爬几次一般都没问题的。你估计短时间太频繁了。 或者你爬的网站太敏感了,当初爬淘宝和京东,调试很多次,一天爬很多次都没问题吧。
@guirenpei http://www.jianshu.com/p/6462130488e8 这个爬虫有教怎么使用代理IP爬
@WayneLiang 谢谢啦
@guirenpei 我感觉不应该是封ip了吧,我之前也写了个demo去访问这个网站,抓了3G的数据也没有问题,而且是连续不间断的访问。
var IP = require(’…/models/Ip’); var request = require(‘superagent’) var http = require(‘http’); var cheerio = require(‘cheerio’); var iconv = require(‘iconv-lite’) require(‘superagent-proxy’)(request) //请求代理页面 for(var page = 1;page <= 10;page ++){ request.get(‘http://www.xicidaili.com/nn/’ + page) .end(function(err,res){ var $ = cheerio.load(res.text) var tr = $(‘tr’) //从第二行开始获取IP和端口 for(var line = 1;line < tr.length ; line ++){ var td = $(tr[line]).children(‘td’) var proxy = ‘http://’ + td[1].children[0].data + ‘:’ + td[2].children[0].data console.log(‘proxy1:’+proxy) try{ //代理IP请求,设置超时为3000ms,返回正确即当可用 (function(proxy){ request.get(‘http://ip.chinaz.com/getip.aspx’).proxy(proxy).timeout(3000) .end(function(err,rep){ if(rep == undefined){ //存入数据库 // console.log(‘proxy2:’+proxy) }else if(rep.statusCode == 200 && rep.text.substring(0,4) == ‘{ip:’){ console.log(‘proxy3ok:’+proxy); } }) })(proxy) }catch(error){ console.log(error); } } }) } 我这段代码应该是循环里面的异步出了问题。在最后的if(rep == undefined){ //存入数据库 // console.log(‘proxy2:’+proxy) }else if(rep.statusCode == 200 && rep.text.substring(0,4) == ‘{ip:’){ console.log(‘proxy3ok:’+proxy); } 里面,这里rep会变成undefined,我不知道为什么,有大手子解答一下吗
500个ip就两个ok 我是不信的类,为什么啊 ,在线求