Python で IP:ポートのプロキシ一覧を整理する
単純な IPv4 プロキシファイルを検証し、ポートを正規化して重複を除き、同じ IP の異なるポートは残します。
IPv4 の IP:port 項目を一行ずつ proxies.txt に記載します。すべて同じ既知のプロキシプロトコルに属している必要があります。無料プロキシ一覧から集める場合は、このテキスト入力を作る前にプロトコルを分けます。この整理処理は、認証情報入り URL、CSV の列、IPv6 アドレスを受け付けません。
標準ライブラリーだけを使うこのスクリプトを、同じディレクトリーに clean-proxies.py として保存します。
from ipaddress import IPv4Address
from pathlib import Path
seen = set()
cleaned = []
for number, raw in enumerate(
Path("proxies.txt").read_text(encoding="utf-8").splitlines(),
start=1,
):
text = raw.strip()
if not text:
continue
try:
host, port_text = text.rsplit(":", 1)
host = str(IPv4Address(host))
port = int(port_text)
if not 1 <= port <= 65535:
raise ValueError("port out of range")
except ValueError:
print(f"Skipping line {number}: invalid IPv4 endpoint")
continue
endpoint = (host, port)
if endpoint not in seen:
seen.add(endpoint)
cleaned.append(f"{host}:{port}")
output = "\n".join(cleaned)
Path("proxies-clean.txt").write_text(
output + ("\n" if output else ""),
encoding="utf-8",
)
print(f"Saved {len(cleaned)} endpoints")
そのディレクトリーから実行します。
uv run --no-project python clean-proxies.py
スキップ行の通知と proxies-clean.txt を確認します。入力ファイルはそのまま残ります。出力は初出順を保ち、アドレスと数値のポートの組で重複を除きます。203.0.113.10:8080 が二件、203.0.113.10:3128 が一件あれば、接続先は二件になります。十進ポート 08080 は 8080 に正規化されます。
文書用アドレスは形式の例にすぎません。有効な IPv4 構文にはプライベートや特殊用途のアドレスも含まれるため、整理済みでもインターネットから到達できるとは限りません。公開アドレスだけが必要なら、明示的なアドレス方針を追加します。
HTTP/SOCKS が混在する入力では、別ファイルか列にプロトコル情報を残し、ポート 1080 から推測しないでください。実際の形式が角括弧付き IPv6 なら対応するパーサーを使います。このスクリプトは推測せず、未対応の入力を拒否します。出力から可用性、匿名性、国、速度は分かりません。それらには条件を管理した接続テストが必要です。