0

Я читаю www.marriot.com для получения информации о своих отелях и ценах. Я использовал инструмент проверки хрома, чтобы отслеживать сетевой трафик, чтобы выяснить, какой API-интерфейс используется endpoint marriot.Обход ответа скрипта при очистке сайта с помощью запросов/BeautifulSoup

Это запрос, который я пытаюсь подражать:

http://www.marriott.com/reservation/availabilitySearch.mi?propertyCode=TYSMC&isSearch=true&fromDate=02/23/17&toDate=02/24/17&numberOfRooms=1&numberOfGuests=1&numberOfChildren=0&numberOfAdults=1

С моим питона код:

import requests 
from bs4 import BeautifulSoup 

base_uri = 'https://www.marriott.com' 
availability_search_ext = '/reservation/availabilitySearch.mi' 

rate_params = { 
    'propertyCode': 'TYSMC', 
    'isSearch': 'true', 
    'fromDate': '03/01/17', 
    'toDate': '03/02/17', 
    'numberOfRooms': '1', 
    'numberOfGuests': '1', 
    'numberOfChildren': '0', 
    'numberOfAdults': '1' 
} 

def get_rates(sess): 
    first_resp = sess.get(base_uri + availability_search_ext, params=rate_params) 
    soup = BeautifulSoup(first_resp.content, 'html.parser') 
    print soup.title 

if __name__ == "__main__": 
    with requests.Session() as sess: 
     #get_hotels(sess) 
     get_rates(sess) 

Однако я получаю этот результат:

<!DOCTYPE doctype html> 

<html> 
<head><script src="/common/js/marriottCommon.js" type="text/javascript"> </script> 
<meta charset="utf-8"> 
</meta></head> 
<body> 
<script> 
     var xhttp = new XMLHttpRequest(); 
     xhttp.addEventListener("load", function(a,b,c){ 
      window.location.reload() 
     }); 
     xhttp.open('GET', '/reservation/availabilitySearch.mi?istl_enable=true&istl_data', true); 
     xhttp.send(); 
     </script> 
</body> 
</html> 

Кажется, они пытаются предотвратить выскальзывание ботов их данные, поэтому они отправляют обратно сценарий, который перезагружает страницу, отправляет запрос XHR, а затем удаляет эту конечную точку http://www.marriott.com/reservation/rateListMenu.mi, чтобы получить визуализацию веб-страницы.

Так что я пытался эмулировать поведение JavaScript, который возвращается, изменив свой питона код этого:

rate_list_ext = '/reservation/rateListMenu.mi'  
xhr_params = { 
    'istl_enable': 'true', 
    'istl_data': '' 
} 

def get_rates(sess): 
    first_resp = sess.get(base_uri + availability_search_ext, 
          params=rate_params) 
    rate_xhr_resp = sess.get(base_uri + availability_search_ext, 
          params=xhr_params) 
    rate_list_resp = sess.get(base_uri + rate_list_ext) 
    soup = BeautifulSoup(rate_list_resp.content, 'html.parser') 

Я делаю первоначальный запрос GET со всеми параметрами, то я сделать запрос XHR, что скрипт создает, а затем я делаю запрос конечной точке rateListMenu.mi, чтобы попытаться получить последнюю страницу html, но я получаю отсроченный сеанс ответа.

Я даже постоянный сеанс с библиотекой запросов хранить любой куки, что сайт возвращающийся после прочтения: Different web site response with RoboBrowser

Что я делаю неправильно?

+0

Вы пробовали, включая заголовки и пользовательских агентов? –

+0

Нет, я этого не пробовал. Какие заголовки я должен добавить? Я думаю, что файлы cookie могут быть проблемой, но поскольку весь запрос на самом деле является серией запросов на получение, я не знаю, какие заголовки добавлять и где. – Chirag

ответ

0

Когда javascript делает запросы на получение, он включает заголовки. Если вы включили много этих заголовков, ваши запросы должны получить одинаковые возвращаемые значения.

пример:

headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.100 Safari/537.36"} 

sess.get(base_uri + availability_search_ext, params=rate_params, headers=headers) 
+0

Спасибо за ваш ответ, позвольте мне попробовать позже. – Chirag

+0

np, надеюсь, что это поможет –