問題是這樣的,本菜鳥剛開始學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...