
AWS API Gatewayの大規模なIPプールをプロキシとして利用し、擬似的に無限のIPを生成してウェブスクレイピングやブルートフォース攻撃を行うPythonライブラリ。
Swiftproxy の誇り高きスポンサー
高性能なレジデンシャルプロキシ。80M+ IPプールを195か国以上で展開 — 大規模データ収集やブラウザ自動化におけるリクエスト成功率を向上させ、IPブロックを削減します。
requests-ip-rotator、Playwright、Selenium、その他のスクレイピングツールとの併用に最適です。
AWS API Gatewayの大規模IPプールをプロキシとして利用し、擬似的な無限IPを生成してWebスクレイピングやブルートフォース攻撃を行うためのPythonライブラリです。
このライブラリを使用することで、IPベースのレート制限を回避できます。
X-Forwarded-Forヘッダーは自動的にランダム化され、指定がない限り適用されます。指定しない場合、AWSはクライアントの実際のIPアドレスをこのヘッダーに送信するためです。
AWSのApiGatewayは利用可能な任意のIPからリクエストを送信します。AWSインフラが非常に大規模であるため、毎回異なるIPになることがほぼ保証されています。ApiGatewayをプロキシとして使用することで、これを活用して毎回異なるIPからリクエストを送信できます。ただし、これらのリクエストは独自のAWSヘッダー(例:X-Amzn-Trace-Id)を伴うため、容易に識別・ブロックされる可能性があることに注意してください。
このパッケージはpypiに公開されているため、以下のいずれかの方法でインストールできます:
pip3 install requests-ip-rotatorpython3 -m pip install requests-ip-rotator
import requests
from requests_ip_rotator import ApiGateway
# ゲートウェイオブジェクトを作成し、AWSで初期化
gateway = ApiGateway("https://site.com")
gateway.start()
# ゲートウェイをセッションに割り当て
session = requests.Session()
session.mount("https://site.com", gateway)
# リクエストを送信(IPはランダム化されます)
response = session.get("https://site.com/index.php", params={"theme": "light"})
print(response.status_code)
# ゲートウェイを削除
gateway.shutdown()
import requests
from requests_ip_rotator import ApiGateway
with ApiGateway("https://site.com") as g:
session = requests.Session()
session.mount("https://site.com", g)
response = session.get("https://site.com/index.php")
print(response.status_code)
方法1を使用する場合、shutdown() メソッドでゲートウェイをシャットダウンしないと、将来的に課金される可能性があるので注意してください。
API Gatewayはリージョンあたり最初の100万リクエストまでは無料です。そのため、ほとんどのユースケースでは完全に無料で利用できるはずです。 本稿執筆時点では、無料枠を超えた場合、AWSは100万リクエストあたり約3ドルを請求します。 リクエストにデータストリームが含まれる場合、AWSはデータ転送料金として1GBあたり0.09ドルを請求します。
環境変数による認証設定を推奨します。awscli を使用して aws configure を実行するか、またはこのスレッドの手順に従って AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY 変数を自分で設定することもできます。
アクセスキーIDとシークレットは、公式AWSチュートリアルに従って見つけることができます。
ApiGatewayクラスは以下のオプションパラメータで作成できます:
from ip_rotator import ApiGateway, EXTRA_REGIONS, ALL_REGIONS
# 2つのリージョンのみにゲートウェイを設定(アウトバウンドHTTP IPとポート)
gateway_1 = ApiGateway("http://1.1.1.1:8080", regions=["eu-west-1", "eu-west-2"])
# 追加リージョンパックでHTTPS googleへのゲートウェイ、指定されたアクセスキーペアを使用
gateway_2 = ApiGateway("https://www.google.com", regions=EXTRA_REGIONS, access_key_id="ID", access_key_secret="SECRET")
ApiGatewayオブジェクトは start メソッドを使用して開始する必要があります。
デフォルトでは、サイトに対して既存のApiGatewayが存在する場合、新しいものを作成せずに既存のエンドポイントを使用します。
このメソッドはパラメータを必要としませんが、以下のオプションを受け付けます:
# サイトに新しいApiGatewayインスタンスを開始、または既存のエンドポイントがあればそれを見つける。
gateway_1.start()
# 既存のエンドポイントがあっても、新しいApiGatewayインスタンスを開始。
gateway_2.start(force=True)
リクエストはApiGatewayオブジェクトをrequests.Sessionオブジェクトにアタッチして送信します。
mount で指定するサイトは、ApiGateway コンストラクタに渡したサイトと一致している必要があります。
import requests
# gateway_1で作成したサイトにPOSTリクエストを送信。ランダムなIPから送信される。
session_1 = requests.Session()
session_1.mount("http://1.1.1.1:8080", gateway_1)
session_1.post("http://1.1.1.1:8080/update.php", headers={"Hello": "World"})
# アウトバウンドリクエストにX-Forwarded-Forヘッダーとして127.0.0.1を送信(指定しない場合はランダム化される)。
session_1.post("http://1.1.1.1:8080/update.php", headers={"X-Forwarded-For", "127.0.0.1"})
# ランダムIPからGoogle検索クエリを実行
session_2 = requests.Session()
session_2.mount("https://www.google.com", gateway_2)
session_2.get("https://www.google.com/search?q=test")
ApiGatewayリソースは使用後は必ずシャットダウンし、ダングリングなパブリックエンドポイントが残ってアカウントに余計な課金が発生するのを防ぎましょう。
これはApiGatewayオブジェクトの shutdown メソッドで行います。ApiGatewayオブジェクトのコンストラクタで指定されたリージョンのすべてのリソースをクローズします。
# "http://1.1.1.1:8080" の "eu-west-1" と "eu-west-2" にあるすべてのゲートウェイプロキシをシャットダウン
gateway_1.shutdown()
# "https://www.google.com" の ip_rotator.EXTRA_REGIONS にあるすべてのゲートウェイプロキシをシャットダウン
gateway_2.shutdown()
必要に応じて、特定のエンドポイントのみを選択的にシャットダウンすることもできます。その場合は、shutdown() メソッドにエンドポイントの配列を渡します。例:
# 新しいゲートウェイを強制開始(リージョンに既存のエンドポイントがあっても新しいものを作成)、その後最初の3つだけを削除。
gateway_3 = ApiGateway("http://1.1.1.1:8082", regions=ALL_REGIONS)
endpoints = gateway_3.start(force=True)
gateway_3.shutdown(endpoints[:3])
require_manual_deletion パラメータを True に設定して開始されたゲートウェイは、shutdown メソッドでは削除されません。AWS CLIまたはWebサイトから手動で削除する必要があります。
コアとなるゲートウェイ作成と整理のコードは、RhinoSecurityLabsのIPRotate Burp Extensionから応用されました。 X-My-X-Forwarded-Forヘッダー転送の概念は、ustayready氏のfireproxプロキシで最初に考案されました。
| 名前 | 説明 | 必須 | デフォルト |
|---|
| site | リクエストの送信先サイト(パスを除く)。 | はい | |
| regions | ゲートウェイをセットアップするAWSリージョンの配列。 | いいえ | ip_rotator.DEFAULT_REGIONS |
| access_key_id | AWSアクセスキーID(環境変数を上書きします)。 | いいえ | 環境変数に依存します。 |
| access_key_secret | AWSアクセスキーシークレット(環境変数を上書きします)。 | いいえ | 環境変数に依存します。 |
| verbose | ステータスメッセージとエラーメッセージを含めるかどうか。 | いいえ | True |
| 名前 | 説明 | 必須 | デフォルト |
|---|
| endpoints | 既存のエンドポイントの配列(例:前回のセッションから)。 | いいえ | |
| force | 既存のエンドポイントが存在しても、新しいエンドポイントのセットを作成する。 | いいえ | False |
| require_manual_deletion | Apigatewayが shutdown() 呼び出し後も持続するかどうかを指定するブール値。 | いいえ | False |