クイックアンサー
プロキシでのRead timed out (ReadTimeout)とは何を意味していますか?
読み取りタイムアウトはクライアントが応答の次のバイトを待つ時間が設定された読み取りタイムアウトを超えたことを意味します。CrawlRelayのレジデンシャルプロキシ経由の場合、遅延は遅い対象か遅いホーム出口によることが多いです。接続タイムアウトと読み取りタイムアウトを別々に設定してください。HTMLページなら接続約10秒、読み取り30~60秒程度が目安で、タイムアウトしたリクエストは一度だけ新しい出口で再試行してください。
Read timed out (ReadTimeout)を一目で理解する
| エラー | Read timed out (ReadTimeout) |
|---|---|
| タイプ | クライアントのタイムアウトエラー |
| 送信元 | HTTPクライアントが読み取りタイムアウト内にデータを受け取れなかった場合 |
| 定義されている場所 | Client setting, no protocol status |
| 再試行しますか? | はい、新しい出口で1〜2回可能 |
| まず確認すること | 読み取りタイムアウトと対象の通常応答時間を比較してください |
Read timed out (ReadTimeout)とは何ですか?
クライアントは通常2つのタイマーを持っています。接続タイムアウトはプロキシへの接続が確立されるまでの待機時間を制限します。読み取りタイムアウトはリクエスト送信後のバイト間での待機時間を制限します。読み取りタイムアウトは接続成功後に応答が遅すぎることを示します。
明示的なタイムアウトを設定しないと、クライアントによっては永遠に待つ場合があります。Python requestsはデフォルトでタイムアウトがなく、リクエストが一つ止まるとワーカーが凍結します。
a read timeoutはPython、curl、Node.js、ブラウザではどのように表示されますか?
同じ失敗でもツールごとに異なる表示になります。ログ検索用のメッセージは以下の通りです:
- Python requests:
ReadTimeout: HTTPSConnectionPool(...): Read timed out. (read timeout=10) - httpx:
httpx.ReadTimeout - Node.js:
ETIMEDOUT、ESOCKETTIMEDOUT、または独自タイマーのAbortError - Playwright:
TimeoutError: page.goto: Timeout 30000ms exceeded
a read timeoutの原因は何ですか?
最も可能性が高いのは次の通りです:
- 遅い対象ページ(検索結果や重い動的ページなど)。
- 遅い出口:ホームのアップロード速度、Wi-Fi、混雑したモバイルセル。
- 大きなダウンロードを一括読み込みしている。
- ページの種類に対してタイムアウト設定が短すぎる。
- ネットワークアイドルを待つブラウザページで、トラッカーがずっと読み込み続ける場合。
a read timeoutを段階的に診断するには?
- プロキシなしでリクエストの時間を測り基準を得る。
- 最初のバイト取得時間と合計時間を別々にログに取る。
- 遅いURLの応答サイズをチェックする。
- ブラウザで利用中の
waitUntil条件を調べる。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URLa read timeoutをどう修正しますか?
- 両方のタイムアウトを設定する:接続は約10秒、読み取りはHTMLで30~60秒、大きなファイルはもっと長く。
- 大きい応答はストリームし、チャンクでディスクに書き込む。
- Playwrightではネットワークアイドルの代わりに
domcontentloadedを使う(HTMLのみ必要な場合)。 - ブラウザで不要な重いリソース(動画等)をブロックする。
- 新しい出口で1回だけ再試行し、それでもダメならURLを遅いキューに移す。
import httpx
proxy = "http://USERNAME:[email protected]:7777"
timeout = httpx.Timeout(connect=10.0, read=30.0, write=10.0, pool=10.0)
with httpx.Client(proxy=proxy, timeout=timeout) as client:
try:
r = client.get("https://api.ipify.org")
print(r.status_code, r.text)
except httpx.TimeoutException as exc:
print("timed out:", type(exc).__name__) # ConnectTimeout, ReadTimeout...a read timeoutの後に再試行すべきですか?
読み取りタイムアウトは新しい出口で1〜2回再試行してください。同じURLが繰り返しタイムアウトするなら、すべてのタイムアウトを延ばすよりも別の遅いキューで長いタイムアウトを与えたほうが良いです。重複副作用に注意し、GETなど安全に繰り返し可能なリクエストだけ再試行してください。
Read timed out (ReadTimeout)はCrawlRelayにどう関係しますか?
セッションIDなしのCrawlRelay新規接続は毎回異なるレジデンシャル出口を使うので、再試行は別のホーム接続もテストしています。遅い対象にはスティッキーセッションを短く保ってください。出口が遅いとセッション内の全リクエストが遅くなります。
ゲートウェイ:gw.crawlrelay.com、ポート7777(HTTP、HTTPSはCONNECT経由)、ポート7778(SOCKS5)。ユーザー名形式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。関連情報:504 Gateway Timeout · Connection reset · Concurrency guide。
Read timed out (ReadTimeout):開発者がよく尋ねる質問
プロキシを使ったスクレイピングのタイムアウト設定は?
HTMLページでの基準は接続約10秒、読み取り30秒から始めて自身の測定に応じて調整してください。JSON APIは通常速いですが、大きなファイルや遅い検索ページはもっと必要です。タイムアウトは明示的に設定してください。Python requestsはデフォルトではタイムアウトがありません。
タイムアウトは通信量に影響しますか?
タイムアウトまでに転送されたバイトのみ通信量としてカウントされます。最初のバイト取得でタイムアウトしたリクエストはほとんどデータを転送しません。途中でタイムアウトした大きなダウンロードはデータ転送しています。大きなファイルはストリームして可能なら途中から再開してください。
なぜタイムアウトは連続して発生しますか?
負荷がかかるとターゲットが遅くなることが多く、時にはご自身の負荷が原因の場合もあります。複数の出口から同時にバーストが発生するとターゲットが原因であり、単一のタイムアウトは一つの遅い出口を示します。バーストが始まるときはホストの同時実行量を下げてください。
他のプロキシエラーのリファレンス
HTTPステータスコード
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
ブラウザとクライアントのエラー
接続とTLSエラー
失敗ケースを網羅したドキュメント付きレジデンシャルプロキシ
$0.50/GB発のCrawlRelayレジデンシャルプロキシ、期限切れがないトラフィック。