プロキシは5つの情報、すなわちスキーム、ユーザー名、パスワード、ホスト、ポートから成り立っています。プロバイダー、ツール、フォーラムはこれらの要素を異なる順序で並べており、あるツールで動作するプロキシが別のツールでは単に貼り付けた形式が違うというだけで失敗することがあります。このガイドでは、よくあるレイアウト、どのツールがどの形式を期待するか、そしてレジデンシャルプロキシで私たちが最も頻繁に見かける間違いを避ける方法を紹介します。
5つの一般的なレイアウト
ダッシュボードのProxy Generatorが生成できる5つの形式で、同じShifterのプロキシを示します。ユーザー名にはターゲティングとセッションの情報が含まれているため、想定より長くなっています。
| 形式 | 例 |
|---|---|
scheme://user:pass@host:port | http://customer-USERNAME-sid-a1-ttl-60:PASSWORD@p.shifter.io:443 |
user:pass@host:port | customer-USERNAME-sid-a1-ttl-60:PASSWORD@p.shifter.io:443 |
host:port:user:pass | p.shifter.io:443:customer-USERNAME-sid-a1-ttl-60:PASSWORD |
user:pass:host:port | customer-USERNAME-sid-a1-ttl-60:PASSWORD:p.shifter.io:443 |
host:port@user:pass | p.shifter.io:443@customer-USERNAME-sid-a1-ttl-60:PASSWORD |
最初の形式はWeb標準で定義された本物のURLであり、ツールがこれを受け付ける場合は常に最も安全な選択です。他の形式は慣例です。これらが存在するのは、多くの一括ツールがプレーンテキストのリスト(1行につき1プロキシ)をインポートするためで、各ツールが独自の順序を採用したからです。
どのツールがどの形式を期待するか
curl。 URL形式を-xに渡します。スキームを省略すると、curlはhttp://と見なします。資格情報を-U username:passwordで分離しておくこともでき、これによりエンコードの問題を避けられます。完全な例についてはcurlとPostmanのセットアップのガイドをご覧ください。
Python requestsとScrapy。 どちらもURL形式を受け付けます。requestsでは、辞書のキーがウェブサイトのスキームを指定し、値がプロキシを指定するため、両方とも通常はhttp://プロキシを指すことになります。
proxy = "http://customer-USERNAME:PASSWORD@p.shifter.io:443"
proxies = {"http": proxy, "https": proxy}
Playwright。 各要素を個別のフィールドとして受け取ります。スキーム、ホスト、ポートを含むserverに加え、usernameとpasswordです。自分で分割しておけば、エンコードの問題をすべて回避できます。
PuppeteerとChrome。 --proxy-serverフラグはホストとポートのみを受け取ります。資格情報はpage.authenticate()で渡します。
ブラウザプロファイル管理ツールや一括処理ツール。 多くはhost:port:user:pass形式のリストをインポートし、中にはリストがどの順序かを尋ねるものもあります。数百行を貼り付ける前にインポート画面を確認してください。
スキームが表すのはプロキシであり、ウェブサイトではない
これは私たちが目にする最も一般的な間違いです。HTTPSのウェブサイトをスクレイピングしている顧客がプロキシの前にhttps://と書いてしまい、すべてのリクエストがTLSエラーで失敗します。
スキームはクライアントがプロキシとどう通信するかを示すものです。HTTPSのウェブサイトには、CONNECTメソッドを使ったhttp://プロキシを通じてアクセスします。クライアントはプロキシにトンネルを開くよう要求し、その後そのトンネルを通してウェブサイトとTLSを実行します。ウェブサイトへの接続はエンドツーエンドで暗号化されたままです。https://p.shifter.io:443と書くと、クライアントはゲートウェイ自体に対してTLSを開始しようとしますが、私たちのゲートウェイはそれを提供していないため、ハンドシェイクが失敗します。HTTPサイトでもHTTPSサイトでもhttp://を使うか、ツールがSOCKSを優先する場合はsocks5://を使ってください。
SOCKSの場合、もう一つ選択肢があります。socks5://はウェブサイトの名前を自分のマシンで解決し、socks5h://は名前をプロキシに送って解決させます。DNSルックアップがどこで行われるかを気にする場合は、DNSリークを防ぐガイドをお読みください。
特殊文字は形式を壊す
各形式はいくつかの文字を予約しています。
- URL形式: ユーザー名やパスワード内の
@、:、/、#、?、%はパーセントエンコードする必要があります。p@ss:wordのようなパスワードはp%40ss%3Awordになります。 - コロン区切り形式: パスワード内のコロンは後続のすべてのフィールドをずらしてしまい、ツールが誤ったホストやポートを読み取ります。
Shifterのユーザー名のターゲティング部分とセッション部分は文字、数字、ダッシュ、アンダースコアのみを使用します(例:city-new_york)。そのため、どの形式でも安全です。記号を含むパスワードを設定する場合は、エンコードを施したURL形式か、フィールドが分かれているツールを使うのが確実な方法です。
形式間の変換
あるツールがある形式を渡してきて、自分のコードが別の形式を求めている場合は、行を手作業で編集するのではなく、リストを変換してください。この Python関数は、5つのレイアウトのいずれもURL形式に変換し、資格情報をエンコードします。
from urllib.parse import quote
def to_proxy_url(line: str, scheme: str = "http") -> str:
line = line.strip()
if "://" in line:
return line
if "@" in line:
left, right = line.split("@", 1)
if left.rsplit(":", 1)[-1].isdigit():
hostport, creds = left, right # host:port@user:pass
else:
creds, hostport = left, right # user:pass@host:port
user, password = creds.split(":", 1)
host, port = hostport.rsplit(":", 1)
else:
parts = line.split(":")
if len(parts) != 4:
raise ValueError(f"unrecognised proxy line: {line}")
if parts[1].isdigit():
host, port, user, password = parts # host:port:user:pass
else:
user, password, host, port = parts # user:pass:host:port
return f"{scheme}://{quote(user, safe='')}:{quote(password, safe='')}@{host}:{port}"
print(to_proxy_url("p.shifter.io:443:customer-USERNAME:PASSWORD"))
# http://customer-USERNAME:PASSWORD@p.shifter.io:443
この関数はポート番号を見つけることで順序を判断するため、ユーザー名やパスワードがすべて数字の場合はレイアウトを区別できません。その場合は、リストを渡した相手にどの順序を使っているか確認してください。
ISPプロキシも同じ形式を使う
ISPプロキシも、ホストが異なるだけで同じルールに従います。すべてのISPプロキシはisp.shifter.io:443を通じて接続するため、host:port:user:pass形式の行はisp.shifter.io:443:USERNAME:PASSWORDとなります。各プロキシはプロキシごとに個別のIPとポートではなく、ユーザー名によって区別されます。これはip:port:user:pass形式のリストに慣れている人には意外に映るかもしれません。
プロキシが接続できないときの簡易チェック
- 407 Proxy Authentication Required: プロキシには到達できたが、資格情報が受け入れられなかったということです。ユーザー名とパスワードの欠落や入れ替わり、エンコードされていない記号がないか確認してください。残りの対処法は407トラブルシューティングガイドで扱っています。
- すぐにTLSやハンドシェイクのエラーが出る: おそらくプロキシの前に
https://と書いています。http://に変更してください。 - すべてのリクエストでConnection refusedやタイムアウトが発生する: ホストかポートが間違っています。コロン区切りの行が誤った順序で読み取られていることがよくある原因です。
- curlでは動作するが自分のツールでは失敗する: そのツールは別のレイアウトを期待しています。行を変換するか、フィールドを個別に入力してください。
ダッシュボードでは、Proxy Generatorでコピーする前にプロトコルと形式を選択でき、リスト全体を同じ形式のCSVとしてダウンロードすることもできます。最初に正しい形式を選ぶことで、これらのエラーのほとんどを避けられます。
出典と参考資料
- RFC 3986, Uniform Resource Identifier: Generic Syntax: rfc-editor.org
- curl, the —proxy option: curl.se
- Requests, proxies: requests.readthedocs.io
- Playwright, HTTP proxy: playwright.dev