如何在不阻止我们的IP的情况下从yelp.com抓取数据

时间:2017-02-28 06:09:46

标签: node.js

我正在使用cheerio和nightmare的节点包从" Yelp.com"。我从Yelp.com检索数据。 但是yelp阻止了我的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);
    };


  });
 }

2 个答案:

答案 0 :(得分:0)

IP块已完成,因为所有请求都是从同一服务器IP地址生成的,这似乎是对服务器的黑客攻击。在此类要求中,应从正在从不同IP地址访问应用程序的客户端进行数据爬网。这将生成来自不同IP地址的流量,Yelp不会阻止它。

另一种选择是使用多个HTTP代理服务器,它们随机生成来自所有不同服务器的请求,以免阻止任何特定的IP地址。

另一种选择是使用http://www.screen-scraper.com

之类的东西

答案 1 :(得分: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()
});