2013-09-23 73 views
3

我想抓取請求模塊的網站。Python的網絡抓取請求遵循重定向

使用chrome和檢查元素,我轉到url,填寫表單並單擊繼續按鈕。 Chrome瀏覽器的檢測元素(網絡文檔)顯示了郵件發送的郵件內容。它還顯示多個Cookie。該網站重定向到一個網址,其中包括一個會話ID。

爲了模擬這個,我嘗試使用請求。我從檢查元素中獲取表單數據並將其重新格式化爲字典。我使用requests.session來包含cookie。

import requests 

form_data = 'currentCalForm=dep&currentCodeForm=&tripType=oneWay&searchCategory=award&originAirport=JFK&flightParams.flightDateParams.travelMonth=5&flightParams.flightDateParams.travelDay=14&flightParams.flightDateParams.searchTime=040001&destinationAirport=LHR&returnDate.travelMonth=-1000&returnDate.travelDay=-1000&adultPassengerCount=2&adultPassengerCount=1&serviceclass=coach&searchTypeMode=matrix&awardDatesFlexible=true&originAlternateAirportDistance=0&destinationAlternateAirportDistance=0&discountCode=&flightSearch=award&dateChanged=false&fromSearchPage=true&advancedSearchOpened=false&numberOfFlightsToDisplay=10&searchCategory=&aairpassSearchType=false&moreOptionsIndicator=oneWay&seniorPassengerCount=0&youngAdultPassengerCount=0&childPassengerCount=0&infantPassengerCount=0&passengerCount=2'.split('&') 

payload = {} 
for item in form_data: 
    key, value = item.split('=') 
    if value: 
     payload[key] = value 

with requests.session() as s:  
    r = s.post('https://www.aa.com/homePage.do', params = payload, allow_redirects=True) 
    print r.headers 
    print r.history 
    print r.url 
    print r.status_code 
    with open('x.htm', 'wb') as f: 
     f.write(r.text.encode('utf8')) 

但是,請求似乎不遵循重定向。歷史記錄爲空,網址似乎是我發送的數據,而不是網站返回的內容。 x.htm顯示一個網頁,但不包含我期望的信息。

http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history我期望r.url包含重定向的url和r.history以包含http響應代碼。

我在做什麼錯?

+0

你知道如何使用wireshark嗎? –

+0

請在瀏覽器中禁用JavaScript,因爲請求不會解析或運行JavaScript。我也不確定它是否遵循該網站可能正在做的meta重定向。 – justinfay

+0

@OfirIsrael我以爲wireshark是監測低級別的網絡流量。如何在這裏使用? – foosion

回答

2

好的,你做的事似乎是錯的。我不知道你是如何決定發送https://www.aa.com/homePage.do的帖子,但這似乎是一個得到,並沒有採取你發送的參數。當你點擊搜索您的瀏覽器發送這篇文章:https://www.americanairlines.co.uk/reservation/searchFlightsSubmit.do;jsessionid=XXXXXXXXXXXXXXXXXXX和參數:

currentCalForm=dep 
currentCodeFrom= 
tripType=roundTrip 
originAirport=LAX 
flightParams.flightDateParams.travelMonth=10 
flightParams.flightDateParams.travelDay=24 
flightParams.flightDateParams.searchTime=040001 
destinationAirport=JFK 
returnDate.travelMonth=10 
returnDate.travelDay=31 
returnDate.searchTime=400001 
adultPassengerCount=1 
adultPassengerCount=1 
childPassengerCount=0 
hotelRoomCount=1 
serviceclass=coach 
searchTypeMode=matrix 
awardDatesFlexible=true 
originAlternateAirportDistance=0 
destinationAlternateAirportDistance=0 
discountCode= 
flightSearch=revenue 
dateChanged=false 
fromSearchPage=true 
advancedSearchOpened=false 
numberOfFlightsToDisplay=10 
searchCategory= 
aairpassSearchType=false 
moreOptionsIndicator= 
seniorPassengerCount=0 
youngAdultPassengerCount=0 
infantPassengerCount=0 
passengerCount=1 

這將然後給你一個HTML回來。你必須發送瀏覽器發送的所有請求。用硒來做它可能會更容易。

我發現這使用httpfox可能類似於鉻網絡。

+0

你在哪裏得到了JSESSIONID = XXXXXXXXXXXXXXXXXXX的XXXXXXX?我遇到的主要問題是弄清楚如何獲取屬於重定向URL的會話ID。 – foosion

+0

其在餅乾:JSESSIONID –

+1

如果我打它重定向到https://www.americanairlines.co.uk/homePage.do?locale=en_GB其中有一個cookie JSESSIONID –