プロキシローテーター は何をしますか?
このスキルは、スクレイパーが複数のプロキシにリクエストを分散し、動作しなくなったプロキシへの過剰な負荷を防ぐために使用します。ローテーターは次の健全なプロキシを割り当て、失敗回数をカウントし、プロキシが頻繁に失敗した場合は一定のクールダウンウィンドウの間隔離し、その後再試行します。プロキシリストはユーザーが自分で用意する必要があり、スキル自体には含まれていません。
呼び出すべきタイミング
- ユーザーが「プロキシをローテーションして」「プロキシ間でリクエストを分散して」「IP禁止を回避したい」「別のプロキシでリトライして」と言った場合。
- 会話内のコードが多数のアウトバウンドリクエストを行い、それらをプロキシプール全体に分散する必要がある場合。
呼び出さないべきタイミング
- 単一の接続で十分な場合、またはターゲットが明示的にボリュームを許可している場合 – プロキシのローテーションは不必要な複雑さを追加します。
- 意図が明示的なブロックを回避したり、サービスを悪用することである場合 – ターゲットの利用規約の範囲内で使用してください。
具体的な例
ユーザー入力:
5つのプロキシがあります。ラウンドロビンで使用し、失敗し始めたものはスキップしてください。
出力:
import requests
from rotator import ProxyRotator
rot = ProxyRotator.from_env() # PROXY_POOL="http://h1:8080,socks5://h2:1080,..."
for url in urls:
p = rot.get() # 次の健全なプロキシ
try:
r = requests.get(url, proxies=p.as_dict(), timeout=15)
rot.report(p, ok=r.ok) # 結果をフィードバックし、プールが自己修復する
except Exception:
rot.report(p, ok=False) # 失敗が多すぎるとクールダウン中は隔離される
適用するパターン
- プロキシを環境変数またはgitignore対象のファイルから読み込む – 本番のプロキシURLや認証情報をコミットしないでください。
- 各リクエスト後に必ず
report(proxy, ok=...)を呼び出し、失敗したプロキシが自動的に隔離されるようにします。 max_failsとcooldownをターゲットに合わせて調整します。短いクールダウンは不安定なプロキシを回復させ、長いクールダウンは悪質なプロキシをドロップします。- 大規模なバッチの前に
health_checkを実行し、停止しているプロキシを事前に隔離します。 - 「健全なプロキシがありません」エラーを処理し、実行をクラッシュさせるのではなく、バックオフしてリトライします。
参考:assets/rotator.py。
出典
著者の自動化プロジェクトでの本番使用から抽出。v1.0.0。 関連項目:[[playwright-login-session]]、[[pipeline-orchestrator]]、[[cron-dispatch]]。
→ Trawlkit で完全な実行可能ボットを構築します。