问题是这样的,本菜鸟刚开始学node,当然,明显是冲着爬虫去的。然后我最近在看一本小说,但是那些免费的小说网站广告太多,所以计划写个爬虫把整本小说爬下来,但是遇到url请求次数太频繁,以至于会遭反爬,被屏蔽掉了,用过增加请求间隔的方式来规避,但是没发现什么效果,偶然发现可以换ip这种东西来规避,奈何百度上这方面资源太少,所以来这里请求大神啦,有知道的可以分享一下吗,谢谢大神。
强调一下,问题是node怎么换ip进行规避反爬
使用的框架有superagent, cheerio, async...谢谢大神啦。
代码:
var superagent = require('superagent');
var cheerio = require('cheerio');
var file = require('./writeText.js');
require('superagent-charset')(superagent);
var str = '';
var count = 150;
var fetchUrl = function (url, callback, len) {
count++;
getArticle(url, callback, len);
}
function getArticle (url, callback, len) {
superagent.get(url)// 'http://m.kanshuzw.com/4/4201/'
.proxy(proxy)
.charset('gbk')
.end(function (err, sres) {
if (err) {
return console.error(err);
} else {
var $ = cheerio.load(sres.text);
file.writeFile($('#nr_title').text() + '\n' + $('#nr').text(), 'C:\Users\Administrator\Desktop\nodeTextTest\writeFileTest-' + count + '.txt');
$('.nr_page .dise').each(function (idx, element) {
var $element = $(element);
if ($element.text() === '下一页') {
superagent.get('http://m.kanshuzw.com' + $element.attr('href'))
.set("X-Forwarded-For", ip)
.proxy(proxy)
.charset('gbk')
.end(function (err, sres) {
if (err) {
console.log('2 error end.');
return console.error(err);
}
var $ = cheerio.load(sres.text);
file.appendFile($('#nr_title').text() + '\n' + $('#nr').text(), 'C:\Users\Administrator.lic-PC\Desktop\nodeTextTest\writeFileTest-' + count + '.txt');
console.log('progress: ' + count + '/' + len);
callback(null, url + ' html content');
});
} else if ((idx + 1) === $('.nr_page .dise').length) {
console.log('progress: ' + count + '/' + len);
callback(null, url + ' html content');
}
});
}
})
}
等待大神ing
防反爬,就是控制程序不能使用一个ip地址以非常快的频率多次抓取同一个网站,那么思路来了,现在拥有一个ip池,则程序可以使用多个ip发起请求,这时要做的就是定期更换程序使用的ip,比如根据你的抓取频率,半个小时,或者半天,或者更长时间为一次间隔,时间到了,就为爬虫程序替换一个ip.这有一条链接,node代理,或许有用/q/10...