リクエストのドキュメントから:
timeout パラメータを使用して、指定された秒数が経過したら応答の待機を停止するようにリクエストに指示できます。
>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
ノート:
タイムアウトは、応答ダウンロード全体の制限時間ではありません。むしろ、サーバーが timeout 秒の間応答を発行しなかった場合 (より正確には、timeout 秒の間、基礎となるソケットでバイトが受信されなかった場合) に例外が発生します。
timeout
requests.get()が1秒であっても、戻るのに非常に長い時間がかかることがよくあります。この問題を解決するには、いくつかの方法があります。
1.TimeoutSauce
内部クラスを使用する
から: https://github.com/kennethreitz/requests/issues/1928#issuecomment-35811896
import requests from requests.adapters import TimeoutSauce
class MyTimeout(TimeoutSauce):
def __init__(self, *args, **kwargs):
if kwargs['connect'] is None:
kwargs['connect'] = 5
if kwargs['read'] is None:
kwargs['read'] = 5
super(MyTimeout, self).__init__(*args, **kwargs)
requests.adapters.TimeoutSauce = MyTimeout
このコードにより、読み取りタイムアウトを接続タイムアウトと同じに設定する必要があります。これは、Session.get() 呼び出しで渡すタイムアウト値です。(このコードを実際にテストしていないことに注意してください。そのため、簡単なデバッグが必要になる場合があります。GitHub ウィンドウに直接書き込んだだけです。)
2. kevinburke からのリクエストのフォークを使用します: https://github.com/kevinburke/requests/tree/connect-timeout
ドキュメントから: https://github.com/kevinburke/requests/blob/connect-timeout/docs/user/advanced.rst
次のように、タイムアウトに単一の値を指定する場合:
r = requests.get('https://github.com', timeout=5)
タイムアウト値は、接続タイムアウトと読み取りタイムアウトの両方に適用されます。値を個別に設定する場合は、タプルを指定します。
r = requests.get('https://github.com', timeout=(3.05, 27))
注:その後、変更はメインの Requests プロジェクトにマージされました。
3. evenlet
orsignal
を使用して、同様の質問で既に述べたように:
Timeout for python requests.get whole response