HTTPS POST请求Python,返回.csv

问题描述:

我想向一个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

带有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