2013-02-24 118 views
2

我想向一個HTTPS站點發出一個POST請求,該站點應該以.csv文件響應。我有這樣的Python代碼:HTTPS POST請求Python,返回.csv

try: 
    #conn = httplib.HTTPSConnection(host="www.site.com", port=443) 

=>給出一個BadStatusLine:'錯誤

conn = httplib.HTTPConnection("www.site.com"); 
    params = urllib.urlencode({'val1':'123','val2':'abc','val3':'1b3'}) 
    conn.request("POST", "/nps/servlet/exportdatadownload", params) 
    content = conn.getresponse() 
    print content.reason, content.status 
    print content.read() 
    conn.close() 
except: 
    import sys 
    print sys.exc_info()[:2] 

輸出:

Found 302 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<HTML><HEAD> 
<TITLE>302 Found</TITLE> 
</HEAD><BODY> 
<H1>Found</H1> 
The document has moved <A HREF="https://www.site.com/nps/servlet/exportdatadownload">here</A>.<P> 
<HR> 
<ADDRESS>Oracle-Application-Server-10g/10.1.3.5.0 Oracle-HTTP-Server Server at mp-www1.mrco.be Port 7778</ADDRESS> 
</BODY></HTML> 

我在做什麼錯?我如何「抓住」返回的.csv文件? 我嘗試了Chrome瀏覽器擴展(高級休息客戶端,這是工作...)的POST請求

+0

正如錯誤所示,Web服務器希望您通過https訪問url - 當您嘗試建立HTTPSConnection時,確切的錯誤是什麼? – 2013-02-24 23:25:48

+0

在命令行上,以下命令給你什麼? 'curl -XPOST'https://www.site.com/nps/servlet/exportdatadownload?val1 = 123&val2 = abc&val3 = 1b3'' – Trevor 2013-02-24 23:25:53

+0

@ Ali-AkberSaifee:'(,BadStatusLine(「 ''「,))' – francisMi 2013-02-25 11:40:12

回答

1

帶有302錯誤的HTML輸出是因爲您使用HTTP連接到網站而不是HTTPS,這是在你的代碼在這裏:

conn = httplib.HTTPConnection("www.site.com"); 

想必你這樣做,因爲你的代碼的註釋部分其他一些錯誤的。

如果我試圖做到這一點,我會使用Requests,它帶有非常明確的documentation。隨着請求的代碼會是這樣的:

import requests 

url = "https://www.example.com/nps/servlet/exportdatadownload" 
payload = { "val1": "123", "val2": "abc", "val3": "1b3" } 
r = requests.post(url, data=payload, verify=True) 

CSV文件應在r.content,一個可以寫入到文件中。

+0

謝謝,那很完美!以爲我一整天都不得不通過coldfusion廢話。花了15分鐘完成本來8小時的手動下載任務。 – Blairg23 2015-12-21 22:59:42

+0

我已經更新了這個使用example.com並添加了驗證參數。還要注意,在Python 3中使用這段代碼需要注意響應數據(r.content)是二進制還是unicode字符串/數據。除此之外它沒有改變。 – Ben 2016-02-28 06:55:22