Я читаю www.marriot.com для получения информации о своих отелях и ценах. Я использовал инструмент проверки хрома, чтобы отслеживать сетевой трафик, чтобы выяснить, какой API-интерфейс используется endpoint marriot.Обход ответа скрипта при очистке сайта с помощью запросов/BeautifulSoup
Это запрос, который я пытаюсь подражать:
С моим питона код:
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
Что я делаю неправильно?
Вы пробовали, включая заголовки и пользовательских агентов? –
Нет, я этого не пробовал. Какие заголовки я должен добавить? Я думаю, что файлы cookie могут быть проблемой, но поскольку весь запрос на самом деле является серией запросов на получение, я не знаю, какие заголовки добавлять и где. – Chirag