
Библиотека Python для использования большого пула IP-адресов AWS API Gateway в качестве прокси для создания псевдобесконечных IP-адресов для веб-скрапинга и брутфорса.
С гордостью спонсируется Swiftproxy
Высокопроизводительные резидентные прокси с пулом более 80 млн IP-адресов в 195+ странах — повысьте успешность запросов и снизьте количество блокировок по IP при масштабном сборе данных и автоматизации браузера. Идеально подходит для использования с
requests-ip-rotator, Playwright, Selenium и другими инструментами для парсинга.
Библиотека Python, использующая большой пул IP-адресов AWS API Gateway в качестве прокси для генерации псевдобесконечных IP-адресов для веб-скрапинга и брутфорса.
Эта библиотека позволяет пользователю обходить IP-ограничения скорости для сайтов и сервисов.
Заголовки X-Forwarded-For автоматически рандомизируются и применяются, если не указаны. В противном случае AWS будет отправлять истинный IP-адрес клиента в этом заголовке.
AWS ApiGateway отправляет запросы с любого доступного IP-адреса — и поскольку инфраструктура AWS настолько велика, почти гарантированно, что каждый раз он будет разным. Используя 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
# 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)
Пожалуйста, помните, что если шлюзы не будут завершены через метод shutdown() при использовании метода №1, в будущем может быть взимана плата.
API Gateway бесплатен для первого миллиона запросов на регион, что означает, что для большинства случаев использования это должно быть совершенно бесплатно.
На момент написания AWS взимает около $3 за миллион запросов после превышения бесплатного лимита.
Если ваши запросы включают потоковую передачу данных, AWS взимает плату за передачу данных в размере $0,09 за ГБ.
Рекомендуется настроить аутентификацию через переменные окружения. С помощью awscli вы можете выполнить aws configure, или же вы можете просто задать переменные AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY самостоятельно, следуя шагам, описанным в этой теме.
Вы можете найти свой идентификатор ключа доступа и секрет, следуя официальному руководству AWS.
Класс ApiGateway может быть создан со следующими необязательными параметрами:
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")
Затем объект ApiGateway необходимо запустить с помощью метода start.
По умолчанию, если ApiGateway уже существует для сайта, он будет использовать существующую конечную точку вместо создания новой.
Это не требует параметров, но принимает следующие:
# 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)
Запросы отправляются путем присоединения объекта ApiGateway к объекту Session библиотеки requests.
Сайт, указанный в mount, должен совпадать с сайтом, переданным в конструктор 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")
Важно завершить ресурсы ApiGateway после завершения работы с ними, чтобы избежать висящих публичных конечных точек, которые могут привести к излишним расходам на вашем аккаунте.
Это делается с помощью метода shutdown объекта ApiGateway. Он закроет все ресурсы для регионов, указанных в конструкторе объекта 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()
В качестве альтернативы вы можете выборочно завершить определенные конечные точки, если это необходимо. Для этого просто передайте массив конечных точек в метод shutdown(), например:
# 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])
Имейте в виду, что любые шлюзы, запущенные с параметром require_manual_deletion, установленным в True, не будут удалены через метод shutdown и должны быть удалены вручную через AWS CLI или веб-сайт.
Основной код создания и организации шлюза был адаптирован из расширения Burp IPRotate Burp Extension от RhinoSecurityLabs.
Концепция пересылки заголовка X-My-X-Forwarded-For была изначально предложена ustayready в его прокси fireprox.
| Имя | Описание | Обязательно | По умолчанию |
|---|
| site | Сайт (без пути), на который будут отправляться запросы. | Да | |
| regions | Массив регионов AWS для создания шлюзов. | Нет | ip_rotator.DEFAULT_REGIONS |
| access_key_id | Идентификатор ключа доступа AWS (переопределит переменные окружения). | Нет | Зависит от переменных окружения. |
| access_key_secret | Секретный ключ доступа AWS (переопределит переменные окружения). | Нет | Зависит от переменных окружения. |
| verbose | Включать сообщения о статусе и ошибках. | Нет | True |
| Имя | Описание | Обязательно | По умолчанию |
|---|
| endpoints | Массив уже существующих конечных точек (например, из предыдущей сессии). | Нет | |
| force | Создать новый набор конечных точек, даже если некоторые уже существуют. | Нет | False |
| require_manual_deletion | Логическое значение, указывающее, должны ли ApiGateway сохраняться при вызове shutdown. | Нет | False |