为什么python urllib2 urlopen返回与API调用中的浏览器不同的东西

问题描述 投票:0回答:2

我需要从以下格式的网站上例行访问和解析XML数据:

https://api.website.com/stuff/getCurrentData?security_key=blah

由于数据的安全性,我无法发布实际的连接。当我将此网址放入浏览器(Safari)时,我得到了XML。

当我通过urllib2打电话时,我会很烂。

f = urllib2.urlopen("https://api.website.com/stuff/getCurrentData?security_key=blah") 
s = f.read()
f.close()
s
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xc5\x96mo\xda0\x10\xc7\xdf\xf7SX\xbc\xda4\x15\xc7y\x00R\xb9\xae\xfa\xb4U\x1a-\x150M{5y\xe1\x06V\x13\x079\x0e\x14>\xfd\x9c\x84\xb0\xd2\xa4S\xa4L\xe5\x95\xef\xeeo 

此文章Urllib's urlopen breaking on some sites (e.g. StackApps api): returns garbage results似乎是一个类似的问题,但它引用的是JSON而不是XML。按照说明看标题,我认为我正在返回GZIP数据。 {我做了建议的测试,发布在这里}

req = urllib2.Request("https://api.website.com/stuff/getCurrentData?security_key=blah",
                      headers={'Accept-Encoding': 'gzip, identity'})
conn = urllib2.urlopen(req)
val = conn.read()
conn.close()
val[0:25]
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xc5\x96]o\xda0\x14\x86\xef\xfb+,\xae6M'

在那篇文章中,有人建议这可能是本地问题,所以我尝试了一个示例站点。

f = urllib2.urlopen("http://www.python.org")
s = f.read()
f.close()
s
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n\n\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n\n<head>\n  <meta http-equiv="content-type" content="text/html; charset=utf-8" />\n  <title>Python Programming Language &ndash; Official Website</title>\n  

这很好,所以我认为它与我实际上试图访问的站点API有关。

[此帖子Why does text retrieved from pages sometimes look like gibberish?建议我可能需要对“ Selenium”进行处理,但随后的发帖人说该问题已“修复”,这无助于我找出问题所在。

我无法使用python下载安全数据吗?我需要使用urlib2和url open以外的其他方法吗?

我正在Mac OSX 10.7.5上运行python 2.7

python xml python-2.7 urllib2 urlopen
2个回答
2
投票

您正在检索经过GZIP处理的压缩数据;服务器明确告诉您它使用Content-Encoding: gzip。使用zlib库解压缩数据:

import zlib

decomp = zlib.decompressobj(16 + zlib.MAX_WBITS)
data = decomp.decompress(val)

或如果响应头指示已使用压缩,则使用支持透明解压缩的库,例如requests。>>


1
投票

requests确实是gzip的魔术头,因此您将获得gzip数据。

© www.soinside.com 2019 - 2024. All rights reserved.