
Una biblioteca de Python para utilizar el gran grupo de IPs de AWS API Gateway como proxy y generar IPs pseudo-infinitas para web scraping y ataques de fuerza bruta.
Orgullosamente patrocinado por Swiftproxy
Proxies residenciales de alto rendimiento con un grupo de más de 80 millones de IPs en más de 195 países — mejore las tasas de éxito de las solicitudes y reduzca los bloqueos de IP durante la recolección de datos a gran escala y la automatización de navegadores. Perfecto para usar con
requests-ip-rotator, Playwright, Selenium y otras herramientas de scraping.
Una biblioteca de Python para utilizar el gran grupo de IPs de AWS API Gateway como proxy para generar IPs pseudo-infinitas para web scraping y fuerza bruta.
Esta biblioteca permitirá al usuario evitar los límites de velocidad basados en IP para sitios y servicios.
Los encabezados X-Forwarded-For se aleatorizan y aplican automáticamente a menos que se proporcionen. Esto se debe a que, de lo contrario, AWS enviará la dirección IP real del cliente en este encabezado.
API Gateway de AWS envía sus solicitudes desde cualquier IP disponible — y como la infraestructura de AWS es tan grande, es casi seguro que sea diferente cada vez. Al usar API Gateway como proxy, podemos aprovechar esto para enviar solicitudes desde diferentes IPs cada vez. Tenga en cuenta que estas solicitudes pueden ser fácilmente identificadas y bloqueadas, ya que se envían con encabezados únicos de AWS (por ejemplo, "X-Amzn-Trace-Id").
Este paquete está en pypi, por lo que puede instalarlo mediante cualquiera de los siguientes métodos:
pip3 install requests-ip-rotatorpython3 -m pip install requests-ip-rotator
import requests
from requests_ip_rotator import ApiGateway
# Create gateway object and initialise in AWS
gateway = ApiGateway("https://site.com")
gateway.start()
# Assign gateway to session
session = requests.Session()
session.mount("https://site.com", gateway)
# Send request (IP will be randomised)
response = session.get("https://site.com/index.php", params={"theme": "light"})
print(response.status_code)
# Delete gateways
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)
Recuerde que si las puertas de enlace no se cierran mediante el método shutdown() cuando se utiliza el método #1, es posible que se le facture en el futuro.
API Gateway es gratuito para el primer millón de solicitudes por región, lo que significa que para la mayoría de los casos de uso esto debería ser completamente gratuito.
Al momento de escribir esto, AWS cobra aproximadamente $3 por millón de solicitudes después de superar el nivel gratuito.
Si sus solicitudes implican transmisión de datos, AWS cobraría una tarifa de transferencia de datos de $0.09 por GB.
Se recomienda configurar la autenticación mediante variables de entorno. Con awscli, puede ejecutar aws configure para hacerlo, o alternativamente, puede simplemente establecer las variables AWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY usted mismo siguiendo los pasos mencionados en este hilo.
Puede encontrar su ID de clave de acceso y secreto siguiendo el tutorial oficial de AWS.
La clase ApiGateway se puede crear con los siguientes parámetros opcionales:
from ip_rotator import ApiGateway, EXTRA_REGIONS, ALL_REGIONS
# Gateway to outbound HTTP IP and port for only two regions
gateway_1 = ApiGateway("http://1.1.1.1:8080", regions=["eu-west-1", "eu-west-2"])
# Gateway to HTTPS google for the extra regions pack, with specified access key pair
gateway_2 = ApiGateway("https://www.google.com", regions=EXTRA_REGIONS, access_key_id="ID", access_key_secret="SECRET")
A continuación, se debe iniciar un objeto ApiGateway mediante el método start.
Por defecto, si ya existe una ApiGateway para el sitio, usará el endpoint existente en lugar de crear uno nuevo.
Esto no requiere parámetros, pero acepta los siguientes:
# Starts new ApiGateway instances for site, or locates existing endpoints if they already exist.
gateway_1.start()
# Starts new ApiGateway instances even if some already exist.
gateway_2.start(force=True)
Las solicitudes se envían adjuntando el objeto ApiGateway a un objeto Session de requests.
El sitio proporcionado en mount debe coincidir con el sitio pasado en el constructor de ApiGateway.
import requests
# Posts a request to the site created in gateway_1. Will be sent from a random 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"})
# Send 127.0.0.1 as X-Forwarded-For header in outbound request (otherwise X-Forwarded-For is randomised).
session_1.post("http://1.1.1.1:8080/update.php", headers={"X-Forwarded-For", "127.0.0.1"})
# Execute Google search query from random IP
session_2 = requests.Session()
session_2.mount("https://www.google.com", gateway_2)
session_2.get("https://www.google.com/search?q=test")
Es importante cerrar los recursos de ApiGateway una vez que haya terminado con ellos, para evitar endpoints públicos colgantes que puedan generar cargos excesivos en su cuenta.
Esto se realiza mediante el método shutdown del objeto ApiGateway. Cerrará todos los recursos para las regiones especificadas en el constructor del objeto ApiGateway.
# This will shutdown all gateway proxies for "http://1.1.1.1:8080" in "eu-west-1" & "eu-west-2"
gateway_1.shutdown()
# This will shutdown all gatewy proxies for "https://www.google.com" for all regions in ip_rotator.EXTRA_REGIONS
gateway_2.shutdown()
Alternativamente, puede cerrar endpoints específicos de forma selectiva, si es necesario. Para ello, simplemente pase un array de endpoints al método shutdown(), por ejemplo:
# This will force start a new gateway (i.e. create new endpoints even if some exist on the region already), and then delete the first 3 of them only.
gateway_3 = ApiGateway("http://1.1.1.1:8082", regions=ALL_REGIONS)
endpoints = gateway_3.start(force=True)
gateway_3.shutdown(endpoints[:3])
Tenga en cuenta que cualquier puerta de enlace iniciada con el parámetro require_manual_deletion establecido en True no se eliminará mediante el método shutdown y deberá eliminarse manualmente a través de la CLI o el sitio web de AWS.
El código principal de creación y organización de la puerta de enlace fue adaptado de la extensión IPRotate Burp de RhinoSecurityLabs.
El concepto de reenvío del encabezado X-My-X-Forwarded-For fue conceptualizado originalmente por ustayready en su proxy fireprox.
| Nombre | Descripción | Requerido | Predeterminado |
|---|
| site | El sitio (sin la ruta) al que se enviarán las solicitudes. | True | |
| regions | Un array de regiones de AWS en las que configurar puertas de enlace. | False | ip_rotator.DEFAULT_REGIONS |
| access_key_id | ID de clave de acceso de AWS (sobrescribirá variables de entorno). | False | Depende de las variables de entorno. |
| access_key_secret | Secreto de clave de acceso de AWS (sobrescribirá variables de entorno). | False | Depende de las variables de entorno. |
| verbose | Incluir mensajes de estado y error. | False | True |
| Nombre | Descripción | Requerido | Predeterminado |
|---|
| endpoints | Array de endpoints preexistentes (por ejemplo, de una sesión anterior). | False | |
| force | Crear un nuevo conjunto de endpoints, incluso si ya existen algunos. | False | False |
| require_manual_deletion | Booleano que especifica si las ApiGateways deben persistir a las llamadas shutdown() | False | False |