2016-07-22 65 views
1

所以目前我有一行python代碼,它使用wget和os.system從網站下載文件。但是,當我嘗試將此wget轉換爲更優雅的庫(如urllib或請求)時,Cookie無法驗證,而是下載登錄html頁面而不是該文件。使用urllib代替wget進行會話認證

這裏是我目前使用:

try: 
     print(URL) 
     os.system(
      "wget --save-cookies cookies.txt --keep-session-cookies --post-data='name={}&password={}' https://fakesite/login".format(
       username, password)) 
     os.system("wget --load-cookies cookies.txt --accept=exe {}".format(URL)) 

    except Exception as e: 
     print(" File not found, please refer to the website manually for download link", e) 

我試圖重構弄成這個樣子:

try: 
    print("Downloading file {} version: {}......".format(version, buildNo)) 
    with requests.session() as s: 
     s.post(loginUrl, data="name:{}&password:{}".format(username,password)) 
     print(URL) 
     r = s.get(URL,cookies=s.cookies, headers={"Accept": "application/octet-stream"}) 
     print (r.content) 

但這種失敗,而不是打印的登錄頁面的HTML內容!任何人都可以對此有所瞭解嗎?

+0

檢查這也許:http://stackoverflow.com/questions/13854735/python-requests-managing-cookies#19129354 –

+0

我已經嘗試了你嘗試的方式,它沒有工作,因爲登錄不成功(已更改數據到數據= {「用戶名」:「一些用戶名」,「密碼」:「密碼」}但這是特定的API)。兩個問題,登錄響應的status_code是什麼,第二個是accept是否正確?另外,在wget示例中,您發送名稱而不是用戶名。 – mkaran

+0

我得到一個302響應,但我已經改變了獲取請求以允許重定向,它仍然無法通過。另外我注意到用戶名問題,只要我發佈這個,但仍然沒有解決我的問題:( – Matchbox2093

回答

1

您應在查詢中使用=代替:

s.post(loginUrl, data="name={}&password={}".format(username,password)) 

此外,您可以(而且應該,繼requests最佳實踐)進行的字典來data說法:

s.post(
    loginUrl, 
    data={ 
     'name': username, 
     'password': password, 
    } 
) 
+0

謝謝!:)這解決了我的問題 – Matchbox2093

+0

不客氣! – mingaleg