
Une bibliothèque Python pour utiliser le vaste pool d'IP d'AWS API Gateway comme proxy afin de générer des IP pseudo-infinies pour le web scraping et le brute forcing.
Fièrement sponsorisé par Swiftproxy
Proxies résidentiels haute performance avec un pool de plus de 80M d'IP dans plus de 195 pays — améliorez les taux de réussite des requêtes et réduisez les blocages IP lors de la collecte de données à grande échelle et de l'automatisation de navigateurs. Parfait pour une utilisation avec
requests-ip-rotator, Playwright, Selenium et autres outils de scraping.
Une bibliothèque Python pour utiliser le vaste pool d'IP d'AWS API Gateway comme proxy afin de générer des IP pseudo-infinies pour le web scraping et le brute forcing.
Cette bibliothèque permet à l'utilisateur de contourner les limites de débit basées sur l'IP pour les sites et services.
Les en-têtes X-Forwarded-For sont automatiquement randomisés et appliqués sauf s'ils sont fournis. En effet, sinon AWS enverrait la véritable adresse IP du client dans cet en-tête.
L'ApiGateway d'AWS envoie ses requêtes depuis n'importe quelle IP disponible — et comme l'infrastructure AWS est si vaste, elle est presque garantie d'être différente à chaque fois. En utilisant ApiGateway comme proxy, nous pouvons en tirer parti pour envoyer des requêtes depuis des IP différentes à chaque fois. Veuillez noter que ces requêtes peuvent être facilement identifiées et bloquées, car elles sont envoyées avec des en-têtes AWS uniques (par exemple "X-Amzn-Trace-Id").
Ce paquet est sur pypi, vous pouvez donc l'installer via l'une des méthodes suivantes :
pip3 install requests-ip-rotatorpython3 -m pip install requests-ip-rotator
import requests
from requests_ip_rotator import ApiGateway
# Crée un objet passerelle et l'initialise dans AWS
gateway = ApiGateway("https://site.com")
gateway.start()
# Associe la passerelle à une session
session = requests.Session()
session.mount("https://site.com", gateway)
# Envoie une requête (l'IP sera randomisée)
response = session.get("https://site.com/index.php", params={"theme": "light"})
print(response.status_code)
# Supprime les passerelles
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)
N'oubliez pas que si les passerelles ne sont pas arrêtées via la méthode shutdown() lors de l'utilisation de la méthode n°1, vous pourriez être facturé ultérieurement.
API Gateway est gratuit pour le premier million de requêtes par région, ce qui signifie que pour la plupart des cas d'utilisation, cela devrait être totalement gratuit.
Au moment de la rédaction, AWS facture environ 3 $ par million de requêtes après dépassement du niveau gratuit.
Si vos requêtes impliquent un flux de données, AWS facturera des frais de transfert de données à 0,09 $ par Go.
Il est recommandé de configurer l'authentification via des variables d'environnement. Avec awscli, vous pouvez exécuter aws configure pour ce faire, ou bien simplement définir vous-même les variables AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY en suivant les étapes mentionnées dans ce fil de discussion.
Vous pouvez trouver votre ID de clé d'accès et votre secret en suivant le tutoriel officiel AWS.
La classe ApiGateway peut être créée avec les paramètres optionnels suivants :
from ip_rotator import ApiGateway, EXTRA_REGIONS, ALL_REGIONS
# Passerelle vers l'IP HTTP sortante et le port pour seulement deux régions
gateway_1 = ApiGateway("http://1.1.1.1:8080", regions=["eu-west-1", "eu-west-2"])
# Passerelle vers HTTPS google pour le pack de régions supplémentaires, avec une paire de clés d'accès spécifiée
gateway_2 = ApiGateway("https://www.google.com", regions=EXTRA_REGIONS, access_key_id="ID", access_key_secret="SECRET")
Un objet ApiGateway doit ensuite être démarré à l'aide de la méthode start.
Par défaut, si une ApiGateway existe déjà pour le site, elle utilisera le point de terminaison existant au lieu d'en créer un nouveau.
Cela ne nécessite aucun paramètre, mais accepte les suivants :
# Démarre de nouvelles instances ApiGateway pour le site, ou localise les points de terminaison existants s'ils existent déjà.
gateway_1.start()
# Démarre de nouvelles instances ApiGateway même si certaines existent déjà.
gateway_2.start(force=True)
Les requêtes sont envoyées en attachant l'objet ApiGateway à un objet Session de requests.
Le site donné dans mount doit correspondre au site passé dans le constructeur ApiGateway.
import requests
# Envoie une requête POST vers le site créé dans gateway_1. Sera envoyée depuis une IP aléatoire.
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"})
# Envoie 127.0.0.1 comme en-tête X-Forwarded-For dans la requête sortante (sinon X-Forwarded-For est randomisé).
session_1.post("http://1.1.1.1:8080/update.php", headers={"X-Forwarded-For", "127.0.0.1"})
# Exécute une requête de recherche Google depuis une IP aléatoire
session_2 = requests.Session()
session_2.mount("https://www.google.com", gateway_2)
session_2.get("https://www.google.com/search?q=test")
Il est important d'arrêter les ressources ApiGateway une fois que vous avez terminé avec elles, afin d'éviter des points de terminaison publics non utilisés qui peuvent entraîner des frais supplémentaires sur votre compte.
Cela se fait via la méthode shutdown de l'objet ApiGateway. Elle fermera toutes les ressources pour les régions spécifiées dans le constructeur de l'objet ApiGateway.
# Cela arrêtera tous les proxys de passerelle pour "http://1.1.1.1:8080" dans "eu-west-1" & "eu-west-2"
gateway_1.shutdown()
# Cela arrêtera tous les proxys de passerelle pour "https://www.google.com" pour toutes les régions dans ip_rotator.EXTRA_REGIONS
gateway_2.shutdown()
Alternativement, vous pouvez sélectivement arrêter des points de terminaison spécifiques si nécessaire. Pour ce faire, passez simplement un tableau de points de terminaison à la méthode shutdown(), par exemple :
# Cela forcera le démarrage d'une nouvelle passerelle (c'est-à-dire créer de nouveaux points de terminaison même s'il en existe déjà dans la région), puis ne supprimera que les 3 premiers d'entre eux.
gateway_3 = ApiGateway("http://1.1.1.1:8082", regions=ALL_REGIONS)
endpoints = gateway_3.start(force=True)
gateway_3.shutdown(endpoints[:3])
Veuillez noter que toutes les passerelles démarrées avec le paramètre require_manual_deletion défini sur True ne seront pas supprimées via la méthode shutdown et doivent être supprimées manuellement via l'interface en ligne de commande AWS ou le site Web.
Le code de base pour la création et l'organisation des passerelles a été adapté de l'extension IPRotate Burp de RhinoSecurityLabs.
Le concept de transfert d'en-tête X-My-X-Forwarded-For a été initialement conceptualisé par ustayready dans son proxy fireprox.
| Nom | Description | Requis | Par défaut |
|---|
| site | Le site (sans chemin) vers lequel les requêtes seront envoyées. | True | |
| regions | Un tableau de régions AWS dans lesquelles configurer les passerelles. | False | ip_rotator.DEFAULT_REGIONS |
| access_key_id | ID de clé d'accès AWS (remplacera les variables d'environnement). | False | Dépend des variables d'environnement. |
| access_key_secret | Clé secrète d'accès AWS (remplacera les variables d'environnement). | False | Dépend des variables d'environnement. |
| verbose | Inclure les messages de statut et d'erreur. | False | True |
| Nom | Description | Requis | Par défaut |
|---|
| endpoints | Tableau de points de terminaison préexistants (par exemple de session précédente). | False | |
| force | Créer un nouvel ensemble de points de terminaison, même s'ils existent déjà. | False | False |
| require_manual_deletion | Booléen indiquant si les ApiGateway doivent persister après l'appel shutdown() | False | False |