我颳了www.marriot.com的酒店和價格的信息。我使用chrome inspect工具來監視網絡流量,以確定哪些API端點marriot正在使用。當要求/ BeautifulSoup網站抓取時繞過腳本響應
這是我試圖仿效請求:
隨着我的Python代碼:
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
獲取呈現網頁。
所以,我試圖模仿是通過改變我的Python代碼這個返回的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頁面,但我得到的會話超時響應。
我還送與請求庫持續性會話存儲該網站是閱讀後返回的任何cookie:Different web site response with RoboBrowser
我在做什麼錯?
您是否嘗試過包括標題和用戶代理? –
不,我沒有試過。我應該添加哪些標題?我認爲cookie可能是一個問題,但由於整個請求實際上是一系列獲取請求,所以我不知道要添加哪些標題以及在哪裏。 – Chirag