2012-12-23 14 views
1

我正在學習python,並且作爲我的第一個項目,我想登錄幾家航空公司網站並刮掉我的飛行常客里程信息。我已經成功地登錄和颳了美國航空公司和美國聯合航空公司,但我無法在達美航空,美國航空公司和英國國際航空公司這樣做。嘗試使用請求庫登錄到航空公司網站時出現Python 10054錯誤

我一直在使用的方法是觀察來自Fiddler2,Chrome或Firebug的網絡流量。 Wireshark目前看起來太複雜了。

對於我的腳本與美國和United拼湊工作,我所做的只是觀察fiddler2上的流量,複製FORM DATA和REQUEST HEADER DATA,然後使用python第三方請求庫訪問數據。很簡單。好簡單。另一家航空公司網站給我帶來了很多麻煩。

讓我們來專門討論英國航空公司。以下是我登錄虛擬BA帳戶時從提琴手處獲得的FORM DATA和REQUEST HEADER DATA的圖片。我還包括了我一直在使用的測試腳本。我寫了兩個不同的版本。一個使用Requests庫和一個使用urllib。他們都會產生相同的錯誤,但我認爲如果他們沒有導入請求庫,我會提供這兩種方法來幫助他人更容易地幫助我。使用你想要的。

基本上,當我做一個request.post我得到一個

10054,錯誤「的現有連接被強行關閉遠程主機」。

我不知道發生了什麼事。一直在尋找3天,並沒有得到任何東西。我希望有人能幫助我。下面的代碼使用我的虛擬BA帳戶信息。用戶名:python_noob密碼:p4ssword。隨意使用並測試它。

下面是一些圖片到fiddler2數據

http://i.imgur.com/iOL91.jpg?1

http://i.imgur.com/meLHL.jpg?1

import requests 

import urllib 


def get_BA_login_using_requests(): 
    url_loginSubmit1 = 'https://www.britishairways.com/travel/loginr/public/en_us' 

    url_viewaccount1 = 'https://www.britishairways.com/travel/viewaccount/public/en_us?eId=106011' 
    url_viewaccount2 = 'https://www.britishairways.com/travel/viewaccount/execclub/_gf/en_us?eId=106011' 


    form_data = { 
     'Directional_Login':'', 
     'eId':'109001', 
     'password':'p4ssword', 
     'membershipNumber':'python_noob', 
     } 


    request_headers= { 
     'Cache-Control':'max-age=0', 
     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
     'Accept-Encoding':'gzip,deflate,sdch', 
     'Accept-Language':'en-US,en;q=0.8', 
     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11', 

     'Cookie': 'BIGipServerba.com-port80=997762723.20480.0000; v1st=EDAB42A278BE913B; BASessionA=kDtBQWGclJymXtlsTXyYtykDLLsy3KQKvd3wMrbygd7JZZPJfJz2!-1893405604!clx42al01-wl01.baplc.com!7001!-1!-407095676!clx43al01-wl01.baplc.com!7001!-1; BIGipServerba.com-port81=997762723.20736.0000; BA_COUNTRY_CHOICE_COOKIE=us; Allow_BA_Cookies=accepted; BA_COUNTRY_CHOICE_COOKIE=US; opvsreferrer=functional/home/home_us.jsp; realreferrer=; __utma=28787695.2144676753.1356203603.1356203603.1356203603.1; __utmb=28787695.1.10.1356203603; __utmc=28787695; __utmz=28787695.1356203603.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); fsr.s={"v":-2,"rid":"d464cf7-82608645-1f31-3926-49807","ru":"http://www.britishairways.com/travel/globalgateway.jsp/global/public/en_","r":"www.britishairways.com","st":"","to":3,"c":"http://www.britishairways.com/travel/home/public/en_us","pv":1,"lc":{"d0":{"v":1,"s":false}},"cd":0}', 

     'Content-Length':'78', 
     'Content-Type':'application/x-www-form-urlencoded', 

     'Origin':'https://www.britishairways.com', 
     'Referer':'https://www.britishairways.com/travel/loginr/public/en_us', 

     'Connection':'keep-alive', 
     'Host':'www.britishairways.com', 
     } 



    print ('Trying to login to British Airways using Requests Library (takes about 1 minute for error to occur)') 


    try: 
     r1 = requests.post(url_loginSubmit1, data = form_data, headers = request_headers) 
    print ('it worked') 
    except Exception as e: 
     msg = "An exception of type {0} occured, these were the arguments:\n{1!r}" 
     print (msg.format(type(e).__name__, e.args)) 


    return 







def get_BA_login_using_urllib(): 
    """Tries to request the URL. Returns True if the request was successful; false otherwise. 
    https://www.britishairways.com/travel/loginr/public/en_us 

    response -- After the function has finished, will possibly contain the response to the request. 

    """ 
    response = None 
    print ('Trying to login to British Airways using urllib Library (takes about 1 minute for error to occur)') 
    # Create request to URL. 
    req = urllib.request.Request("https://www.britishairways.com/travel/loginr/public/en_us") 

    # Set request headers. 
    req.add_header("Connection", "keep-alive") 
    req.add_header("Cache-Control", "max-age=0") 
    req.add_header("Origin", "https://www.britishairways.com") 
    req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11") 
    req.add_header("Content-Type", "application/x-www-form-urlencoded") 
    req.add_header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") 
    req.add_header("Referer", "https://www.britishairways.com/travel/home/public/en_us") 
    req.add_header("Accept-Encoding", "gzip,deflate,sdch") 
    req.add_header("Accept-Language", "en-US,en;q=0.8") 
    req.add_header("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3") 
    req.add_header("Cookie", 'BIGipServerba.com-port80=997762723.20480.0000; v1st=EDAB42A278BE913B; BIGipServerba.com-port81=997762723.20736.0000; BA_COUNTRY_CHOICE_COOKIE=us; Allow_BA_Cookies=accepted; BA_COUNTRY_CHOICE_COOKIE=US; BAAUTHKEY=BA4760A2434L; BA_ENROLMENT_APPLICATION_COOKIE=1356219482491AT; BASessionA=wKG4QWGSTggNGnsLTnrgQnMxGMyzvspGLCYpjdSZgv2pSgYN1YRn!-1893405604!clx42al01-wl01.baplc.com!7001!-1!-407095676!clx43al01-wl01.baplc.com!7001!-1; HOME_AD_DISPLAY=1; previousCountryInfo=us; opvsreferrer=functional/home/home_us.jsp; realreferrer=; __utma=28787695.2144676753.1356203603.1356216924.1356219076.6; __utmb=28787695.15.10.1356219076; __utmc=28787695; __utmz=28787695.1356203603.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); fsr.s={"v":-2,"rid":"d464cf7-82608645-1f31-3926-49807","ru":"http://www.britishairways.com/travel/globalgateway.jsp/global/public/en_","r":"www.britishairways.com","st":"","to":5,"c":"https://www.britishairways.com/travel/home/public/en_us","pv":31,"lc":{"d0":{"v":31,"s":true}},"cd":0,"f":1356219889982,"sd":0}') 

    # Set request body. 
    body = b"Directional_Login=&eId=109001&password=p4ssword&membershipNumber=python_noob" 

    # Get response to request. 


    try: 
     response = urllib.request.urlopen(req, body) 
     print ('it worked') 
    except Exception as e: 
     msg = "An exception of type {0} occured, these were the arguments:\n{1!r}" 
     print (msg.format(type(e).__name__, e.args)) 

    return 



def main(): 
    get_BA_login_using_urllib() 
    print() 
    get_BA_login_using_requests() 
    return 


main() 

回答

1

隨口說說,我說你成功地創建一個惡意或非法請求,服務器(或甚至代理)在對方只是拒絕處理它。

  1. 不要使用requests庫。非常好。 Urllib是相當於已過時(並且,根本沒有使用的樂趣)。

  2. 擺脫幾乎所有的自定義標題。特別是Content-Length,Keep-Alive,ConnectionCookie。前三個應該讓請求庫負責,因爲它們是HTTP 1.1協議的一部分。關於Cookie:這也將由requests庫處理,具體取決於您如何使用會話。 (您可能想查閱該文檔。)如果沒有任何以前的cookie,當您嘗試訪問該網站時,您可能會獲得類似於401的內容,或者您​​將(透明地)重定向到登錄頁面。進行登錄會設置正確的cookie,之後您應該能夠重新嘗試原始請求。

  3. 如果您爲後數據使用字典,您也不需要Content-Type標題。你可能想要在所述字典中使用unicode-values。我發現這有時會產生變化。

換句話說:儘量去除儘可能多的東西,然後從那裏建立起來。做這樣的事情通常不應該花費太多的成本。現在,抓取一個網頁,這是另一個問題:嘗試'美麗的'爲此。

P.S .:不要有史以來在公共論壇發佈cookie數據:它們可能包含個人或敏感數據,可能會隱藏陰影字符可能會被濫用。

+0

感謝您回覆我的問題。我將繼續使用請求庫。我在這裏遇到的主要問題是,當我提出請求時,我會在一分鐘後回到10054錯誤。我嘗試了發送發佈數據的所有不同組合。沒有表格數據,沒有標題數據,沒有表格和標題數據,不同的標題數據等。到目前爲止,每個組合都有10054錯誤的例外。再次,我只是發送了我從小提琴手那裏看到的相同信息。任何其他建議,以縮小我應該發送的。至少,得到的東西,而不是一個例外? –

+0

我在這裏找到了一些有關Windows問題和請求的內容http://stackoverflow.com/questions/13167907/https-request-results-in-reset-connection-in-windows-with-python-3。我會仔細看看的。在旁註中。我用Beatifulsoup成功地掃描了Amerian和United :)感謝您發佈Cookie提示! –

0

看來在Python 3.3的windows版本中有一個bug是我的問題的原因。我使用的答案從這裏

HTTPS request results in reset connection in Windows with Python 3

,使我的劇本的urllib版本進度。我想使用請求,所以我需要弄清楚如何使用該模塊進行SSL降級工作。我會做一個單獨的線程。如果有人有答案,你也可以在這裏發帖。謝謝。