使用请求从Python 3中的API调用下载CSV

时间:2018-06-14 15:56:27

标签: python python-3.x csv python-requests decode

我正在连接到第三方网站,尝试下载特定于我公司的数据。我发布了必填字段并且文件已经生成,但是,csv所在的URL在链接中没有.csv。当我试图获取网站的内容时,它只有'b'\ xef \ xbb \ xbf''

download = r.get('http://XXXXXapi-b.XXXstage.com/reporting/Reports?id='+str(requestID), auth=('XXXXX','XXXXX'))
print(download)
print(download.headers)
print(download.content)
content = download.content
print(content.decode('UTF-8'))

请求ID是在提交请求时更早定义的。

我得到的回复:

Response [200]

{'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Content- Length': '3', 'Content-Type': 'text/csv', 'Expires': '-1', 
'Content-Disposition': 'attachment; filename=Report.csv', 
'Access-Control-Allow-Origin': '*', 'Date': 'Thu, 14 Jun 2018 14:17:46 GMT'}

b'\xef\xbb\xbf'

-

我看错了吗?这些内容是否需要解码,是否有内容?内容长度是否意味着实际上只有3个结果。最后,有没有办法从这个get中下载csv,或者csv数据是否应该在内容中?

1 个答案:

答案 0 :(得分:0)

从回复看:

  • 代码200表示服务器报告处理成功
  • Content-Type: text/csv表示返回的内容为CSV 格式化
  • Content-Length: 3表示内容长度为3个字节

对于CSV来说,3个字节似乎很短,而且您使用wsodownload.content访问的内容确实是一些不可打印的字符。

所以看起来您的请求没有任何问题,但服务器返回的响应无效。

顺便说一句,您可以使用params参数requests.get()来使用正确的方法将参数作为查询字符串传递:

requests.get('http://XXXXapi-b.XXXXstage.com/reporting/Reports', params={'id': requestID}, auth=('XXXX','XXXX'))