2

Python (Python 3.2 を使用していますが、Python 2.x でもほとんど同じはずです) で、特定の URL にリクエストを送信しようとします。

Access Denied などのエラーの場合、例外が発生します。

>>> 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 に答える