2017-02-28 91 views
0

我使用cheerio和惡夢的節點包從「Yelp.com」進行爬取。我從Yelp.com檢索數據。 但yelp已經阻止了我的IP。 請任何一個都可以提供解決方案或suggestions.Thanks提前如何抓取yelp.com上的數據而無需阻止我們的IP

這裏是我的代碼,因爲正在從中似乎是在同一臺服務器的IP地址產生的所有請求

var Nightmare = require('nightmare'); 
var fs  = require('fs'); 
var http  = require('http'); 
var cheerio = require('cheerio'); 
var request = require('request'); 

function yelpmenuitemsscrap(url) 
{ 
    // console.log(url); 

var menuitems = new Nightmare(); 

menuitems.goto(url); 
menuitems.wait(); 

menuitems.evaluate(function() { 
    var objs = []; 
    $('div.menu-sections div.media-block.menu- 
    item').each(function(index){ 

     objs.push($(this).find('div.media-story h4').text().trim()); 

    }); 
    return objs; 
    },function (html) {}); 
    menuitems.run(function(err, nightmare) { 
    if (err) 
    { 
     return console.log(err); 
    } 
    else 
    { 
     console.log(nightmare); 
    }; 


    }); 
} 

回答

0

IP塊完成黑客攻擊服務器。在這樣的要求中,數據爬行應該從正在訪問來自不同IP地址的應用程序的客戶端完成。這將產生來自不同IP地址的流量,Yelp不會阻止它。

另一種選擇是使用多個HTTP代理服務器,它們隨機生成來自所有不同服務器的請求,以便不阻止任何特定的IP地址。

另一種選擇是使用類似http://www.screen-scraper.com

+0

有關可用來創建代理服務器和在線使用它們滿足您的要求的現成的軟件工具。在「軟件代理服務器」上進行一些谷歌搜索,你會罰款符合你的要求。 –

+0

我嘗試過創建多個代理servers.But但我沒有得到。您能否請我提供示例代碼以創建代理服務器及其用法 – siva

+0

感謝您的建議 – siva

0

如果你不介意使用和API,你可以嘗試https://gimmeproxy.com它有很好的包裝gimmeproxy-request

它會自動從GimmeProxy獲取代理,並在發生故障時通過另一個代理重新路由請求。

例如何使請求隨着該包裝:

const setup = require('gimmeproxy-request').setup; 
 
const request = require('gimmeproxy-request').request; 
 
    
 
setup({ 
 
    api_key: 'your api key', 
 
    query: 'get=true&cookies=true&country=US&supportsHttps=true&maxCheckPeriod=1800&minSpeed=10', // additional gimmeproxy query parameters 
 
    retries: 5, // max retries before fail 
 
    test: (body, response) => body.indexOf('captcha') === -1 && response.statusCode === 200 // test function 
 
}); 
 
    
 
request('https://example.com', { 
 
    timeout: 10000 // additional request parameters, see https://github.com/request/request 
 
}, 
 
function(err, res, body) { 
 
    console.log('err', err) 
 
    console.log('res', res) 
 
    console.log('body', body) 
 
    process.exit() 
 
});