
1. 失敗カウント付きローテーション
import collections, itertools, requests
proxies = [l.strip() for l in open("proxies.txt") if l.strip()]
failures = collections.Counter()
pool = itertools.cycle(proxies)
def get(url, attempts=10):
for _ in range(attempts):
proxy = next(pool)
if failures[proxy] >= 3:
continue
try:
return requests.get(
url,
proxies={"http": f"http://{proxy}", "https": f"http://{proxy}"},
timeout=8,
)
except requests.RequestException:
failures[proxy] += 1
raise RuntimeError("pool exhausted")時間を節約するための注意点
プロキシごとに失敗回数を数え、繰り返し失敗するものを飛ばす — これが生のリストを使えるプールに変える要点です。これがないと、同じ死んだエントリのタイムアウトを払い続けることになります。公開間隔に合わせてファイルを更新し、その際にカウンタもリセットしてください。この失敗率を吸収できない本番用途では、運用されたローテーションエンドポイントのほうが適した道具です。
関連ガイド
公開スナップショットの利用範囲
無料の公開プロキシは不特定の第三者が運用し共有されています。パスワードやトークン、個人情報を送信しないでください。GitHub の利用規定に従い、スパム、攻撃、アクセス制御の回避、サイトポリシーに反する収集には使用しないでください。
無料の公開プロキシは不特定の第三者が運用し共有されています。パスワードやトークン、個人情報を送信しないでください。GitHub の利用規定に従い、スパム、攻撃、アクセス制御の回避、サイトポリシーに反する収集には使用しないでください。