我正在使用以下代码检查网址状态:
h = httplib2.Http()
hdr = {'User-Agent': 'Mozilla/5.0'}
resp = h.request("http://" + url, headers=hdr)
if int(resp[0]['status']) < 400:
return 'ok'
else:
return 'bad'
并获得
Error -3 while decompressing data: incorrect header check
我正在检查的网址是:
http://www.sueddeutsche.de/wirtschaft/deutschlands-innovationsangst-wir-neobiedermeier-1.2117528
异常位置是:
Exception Location: C:\Python27\lib\site-packages\httplib2-0.9-py2.7.egg\httplib2\__init__.py in _decompressContent, line 403
try:
encoding = response.get('content-encoding', None)
if encoding in ['gzip', 'deflate']:
if encoding == 'gzip':
content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
if encoding == 'deflate':
content = zlib.decompress(content) ##<---- error line
response['content-length'] = str(len(content))
# Record the historical presence of the encoding in a way the won't interfere.
response['-content-encoding'] = response['content-encoding']
del response['content-encoding']
except IOError:
content = ""
http状态为200,对于我的情况为ok
,但我收到此错误
我实际上只需要http状态,为什么要阅读整个内容?
答案 0 :(得分:2)
您可能有多种原因选择httplib2
,但使用python模块requests
获取HTTP请求的状态代码非常容易。使用以下命令安装:
$ pip install requests
请参阅下面的极简单示例。
In [1]: import requests as rq
In [2]: url = "http://www.sueddeutsche.de/wirtschaft/deutschlands-innovationsangst-wir-neobiedermeier-1.2117528"
In [3]: r = rq.get(url)
In [4]: r
Out[4]: <Response [200]>
除非您有明确需要httplib2
的相当大的限制,否则此解决您的问题。
答案 1 :(得分:1)
这可能是httplib2
中的错误(或只是不常见的设计决定)。我不会在2.x stdlib中使用urllib2
或httplib
,或者在3.x stdlib中使用urllib.request
或http.client
,或者第三个 - 共享图书馆requests
,urllib3
或pycurl
。
那么,您是否需要使用此特定库?
如果是这样的话:
我实际上只需要http状态,为什么要阅读整个内容?
好吧,大多数 HTTP库将在返回控件之前读取和解析整个内容,或者至少解析标题。通过这种方式,他们可以响应有关标头或分块编码或MIME信封的简单请求或任何延迟。
此外,他们中的许多人都会自动执行100次继续,302重定向,各种身份验证等操作,如果他们没有提前阅读,他们就无法做到这一点。特别是,根据description for httplib2
,自动处理这些事情是您首先应该使用它的主要原因之一。
此外,第一个TCP read
几乎总是会包含标题,那么为什么不读取它们?
这意味着如果标头无效,您可能会立即收到异常。无论如何,他们仍然可以提供获取状态代码(或原始标题或其他信息)的方法。
作为旁注,如果您只想要HTTP状态,则应该发送HEAD请求而不是GET。除非您正在编写和测试服务器,否则您几乎总是可以依赖这样一个事实:the RFC says,状态和标题应该与您GET
所获得的相同。事实上,在这种情况下,几乎可以肯定地解决问题 - 如果没有机构可以解压缩,httplib2
已经混淆了认为身体在没有得到胜利的情况下被压缩的事实。无论如何。