2

在 Python 中(使用 Python 3.2,但我想它在 Python 2.x 中应该基本相同),我尝试向某个 URL 发出请求。

在访问被拒绝等错误的情况下,我得到一个异常:

>>> request = urllib.request.urlopen(myurl)
...
  File "/usr/lib/python3.2/urllib/request.py", line 495, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: Unauthorized

但即使出现错误,我也想查看请求的标头。

>>> request = urllib.request.urlopen(myurl)
>>> print(request.status)
401
>>> print(request.headers)
...

我还注意到,当页面回复重定向状态代码(例如 301)时,我得到的响应是重定向页面,而不是第一个(这是我想要的)。

知道我该怎么做吗?

4

1 回答 1

4

您是否考虑过使用 requests 包?它为您提供了为满足您的请求而进行的所有重定向的历史记录:

>>> import requests
>>> r = requests.get('http://google.com')
>>> r
<Response [200]>
>>> r.history
[<Response [301]>, <Response [302]>]
>>> r.url
u'http://www.google.co.uk/'

它还可以很好地处理 401 错误

>>> r = requests.get('http://sitesurgeon.co.uk/!dev/http-authorisation/staff/index.htm')
>>> r
<Response [401]>
>>> r.content
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> ...
....'
>>> r.headers
{'date': 'Wed, 06 Jun 2012 14:24:16 GMT', 'x-powered-by': 'PHP/5.3.13', 'transfer-encoding': 'chunked', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'Basic realm="Staff Area"', 'server': 'Apache'}

如果您希望控制超时,只需按以下方式发出请求:

requests.get('http://google.com', timeout=0.1)
于 2012-06-06T14:22:00.250 回答