0

我颳了www.marriot.com的酒店和價格的信息。我使用chrome inspect工具來監視網絡流量,以確定哪些API端點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

隨着我的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

我在做什麼錯?

+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,希望它有幫助 –