
Uma biblioteca Python para utilizar o grande pool de IPs do AWS API Gateway como proxy para gerar IPs pseudo-infinitos para web scraping e brute forcing.
Orgulhosamente patrocinado por Swiftproxy
Proxies residenciais de alto desempenho com um pool de mais de 80 milhões de IPs em mais de 195 países — melhore as taxas de sucesso de requisições e reduza bloqueios de IP durante a coleta de dados em larga escala e automação de navegadores. Perfeito para uso com
requests-ip-rotator, Playwright, Selenium e outras ferramentas de scraping.
Uma biblioteca Python para utilizar o grande pool de IPs do AWS API Gateway como um proxy e gerar IPs pseudo-infinitos para web scraping e ataques de força bruta.
Esta biblioteca permitirá que o usuário contorne limitações de taxa baseadas em IP para sites e serviços.
Os cabeçalhos X-Forwarded-For são automaticamente randomizados e aplicados, a menos que sejam fornecidos. Isso ocorre porque, caso contrário, a AWS enviaria o endereço IP real do cliente neste cabeçalho.
O ApiGateway da AWS envia suas requisições a partir de qualquer IP disponível — e como a infraestrutura da AWS é tão grande, é quase garantido que seja diferente a cada vez. Ao usar o ApiGateway como proxy, podemos aproveitar isso para enviar requisições de IPs diferentes a cada vez. Observe que essas requisições podem ser facilmente identificadas e bloqueadas, pois são enviadas com cabeçalhos AWS exclusivos (por exemplo, "X-Amzn-Trace-Id").
Este pacote está no pypi, então você pode instalá-lo por qualquer um dos seguintes 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)
Lembre-se de que, se os gateways não forem desligados pelo método shutdown() ao usar o método #1, você poderá ser cobrado no futuro.
O API Gateway é gratuito para o primeiro milhão de requisições por região, o que significa que, para a maioria dos casos de uso, isso deve ser completamente gratuito.
No momento da redação deste texto, a AWS cobra aproximadamente US$ 3 por milhão de requisições após exceder o nível gratuito.
Se suas requisições envolverem streaming de dados, a AWS cobrará uma taxa de transferência de dados de US$ 0,09 por GB.
Recomenda-se configurar a autenticação por meio de variáveis de ambiente. Com awscli, você pode executar aws configure para fazer isso, ou, alternativamente, você pode simplesmente definir você mesmo as variáveis AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY seguindo as etapas mencionadas neste tópico.
Você pode encontrar seu ID da chave de acesso e segredo seguindo o tutorial oficial da AWS.
A classe ApiGateway pode ser criada com os seguintes parâmetros opcionais:
from ip_rotator import ApiGateway, EXTRA_REGIONS, ALL_REGIONS
# Gateway para IP HTTP de saída e porta para apenas duas regiões
gateway_1 = ApiGateway("http://1.1.1.1:8080", regions=["eu-west-1", "eu-west-2"])
# Gateway para HTTPS google no pacote de regiões extras, com par de chaves de acesso especificado
gateway_2 = ApiGateway("https://www.google.com", regions=EXTRA_REGIONS, access_key_id="ID", access_key_secret="SECRET")
Um objeto ApiGateway deve ser iniciado usando o método start.
Por padrão, se um ApiGateway já existir para o site, ele usará o endpoint existente em vez de criar um novo.
Isso não requer parâmetros, mas aceita os seguintes:
# Inicia novas instâncias do ApiGateway para o site, ou localiza endpoints existentes se já existirem.
gateway_1.start()
# Inicia novas instâncias do ApiGateway mesmo que algumas já existam.
gateway_2.start(force=True)
As requisições são enviadas anexando o objeto ApiGateway a um objeto Session do requests.
O site fornecido em mount deve corresponder ao site passado no construtor do ApiGateway.
import requests
# Envia uma requisição POST para o site criado no gateway_1. Será enviada de um IP aleatório.
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"})
# Envia 127.0.0.1 como cabeçalho X-Forwarded-For na requisição de saída (caso contrário, X-Forwarded-For é randomizado).
session_1.post("http://1.1.1.1:8080/update.php", headers={"X-Forwarded-For", "127.0.0.1"})
# Executa consulta de pesquisa no Google a partir de IP aleatório
session_2 = requests.Session()
session_2.mount("https://www.google.com", gateway_2)
session_2.get("https://www.google.com/search?q=test")
É importante desligar os recursos do ApiGateway quando você terminar de usá-los, para evitar endpoints públicos pendentes que podem gerar cobranças excessivas em sua conta.
Isso é feito através do método shutdown do objeto ApiGateway. Ele fechará todos os recursos para as regiões especificadas no construtor do objeto ApiGateway.
# Isto desligará todos os proxies de gateway para "http://1.1.1.1:8080" em "eu-west-1" e "eu-west-2"
gateway_1.shutdown()
# Isto desligará todos os proxies de gateway para "https://www.google.com" para todas as regiões em ip_rotator.EXTRA_REGIONS
gateway_2.shutdown()
Alternativamente, você pode desligar endpoints específicos seletivamente, se necessário. Para fazer isso, basta passar um array de endpoints para o método shutdown(), por exemplo:
# Isto forçará a inicialização de um novo gateway (ou seja, criará novos endpoints mesmo que alguns já existam na região) e então excluirá apenas os 3 primeiros deles.
gateway_3 = ApiGateway("http://1.1.1.1:8082", regions=ALL_REGIONS)
endpoints = gateway_3.start(force=True)
gateway_3.shutdown(endpoints[:3])
Lembre-se de que quaisquer gateways iniciados com o parâmetro require_manual_deletion definido como True não serão excluídos pelo método shutdown e devem ser excluídos
manualmente através da CLI da AWS ou do site.
O código principal de criação e organização do gateway foi adaptado da extensão Burp IPRotate da RhinoSecurityLabs.
O conceito de encaminhamento do cabeçalho X-My-X-Forwarded-For foi originalmente concebido por ustayready em seu proxy fireprox.
| Nome | Descrição | Obrigatório | Padrão |
|---|
| site | O site (sem caminho) para o qual as requisições serão enviadas. | Sim | |
| regions | Um array de regiões AWS para configurar os gateways. | Não | ip_rotator.DEFAULT_REGIONS |
| access_key_id | ID da Chave de Acesso AWS (substituirá variáveis de ambiente). | Não | Depende de variáveis de ambiente. |
| access_key_secret | Segredo da Chave de Acesso AWS (substituirá variáveis de ambiente). | Não | Depende de variáveis de ambiente. |
| verbose | Incluir mensagens de status e erro. | Não | True |
| Nome | Descrição | Obrigatório | Padrão |
|---|
| endpoints | Array de endpoints pré-existentes (por exemplo, de sessão anterior). | Não | |
| force | Criar um novo conjunto de endpoints, mesmo que alguns já existam. | Não | False |
| require_manual_deletion | Booleano que especifica se os ApiGateways devem persistir às chamadas shutdown() | Não | False |