2017-02-09 17 views
2

Хотелось бы сделать запрос к https://zomato.com/, но ответа нет, я могу подключиться где угодно, но не к zomato. Я получаю ошибку тайм-аута каждый раз. Я пытался установить user-agent, но он не работал. Я использую узел 6.6.0 и запрос 2.79.0. Есть идеи?Node.js не может сделать запрос на zomato.com

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

request.get({ 
    url: 'http://zomato.com/', 
    headers: { 
     'user-ggent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36' 
     } 
}, function(error, response, body) { 
    if(error) { 
     console.log("Error: " + error); 
     return; 
    } 
    else { 
     console.log("Status code: " + response.statusCode); 
    } 
}); 



Update:
Я заметил, что это:

curl -X GET "https://zomato.com/" 

возвращает 301 перенаправлять

ответ

-1

, если вы посмотрите на выходе завитка zomato.com - v вы можете видеть, что мы перенаправляемся:

HTTP/1.1 301 Moved Permanently 
HTTP/1.1 301 Moved Permanently 

Так что нам нужно добавить:

followAllRedirects: true, 

Здесь:

request.get({ 

    url: 'http://zamato.com/', 
    followAllRedirects: true, 
    headers: { 
      'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36' 
     } 
+0

Это исправление не работает. – wyrdrender

+0

Я обновил свой ответ, попробовал еще раз – NiallJG

+0

Теперь мне удалось заставить программу ответить «200», есть ли у вас проблема? – NiallJG

1

У меня были некоторые проблемы, пытаясь сделать что-то подобное с некоторыми веб-сайтами. Попробуйте NigthmareJS вместо запроса

Я не тестировал на zomato, но здесь есть код, который я использовал для другого сайта:

var website = new Nightmare() 
.useragent("Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36") 
.goto('http://zomatoorwhateverwebsite.com/') 
.evaluate(function(){ 
    return document.documentElement.innerHTML; 
}) 
.end() 
.then(function(html) { 
    var $ = cheerio.load(html); 

    //Do what you need here 
}) 

Я надеюсь, что это помогает. Иногда вам нужно добавить некоторое ожидание() проверить документацию на дополнительные функции

+0

Html аргумент null каждый раз. Я почти уверен, что это их трюк в сфере безопасности, чтобы не соскабливать их сайт, но я понятия не имею, как это работает. Кстати, я обнаружил, что почтальон без каких-либо дополнительных заголовков отлично работает. – wyrdrender

+0

Да. У меня была такая же проблема с tripadvisor ... Я почти уверен, что zomato использует API, иногда сложно отказаться от веб-сайтов, которые используют API, потому что HTML, например, если они используют угловую строку

  • {{line.text}}
, но без вызова API, который ничего не значит. Возможно, попробуйте проверить сетевые вызовы на dev-инструментах, иногда вы можете выяснить, как выполняются вызовы api, а затем легко получить данные. Удачи – perseus