В этом руководстве о том, как вращать прокси в Python, вы узнаете:
- Что такое прокси-серверы и зачем их использовать
- Что такое ротация прокси и почему она может вам понадобиться
- Как вращать прокси-серверы в Python
- Общие ограничения при вращении прокси в Python
Давайте погрузимся!
Что такое прокси?
Прокси-сервер – это сервер, который выступает в роли посредника между пользователем и сетевым ресурсом в Интернете. Таким образом, можно считать, что прокси – это посредник, который пересылает запросы и ответы между сторонами.
Зачем использовать прокси в Python?
Когда вы отправляете запрос на веб-сайт с помощью прокси-сервера, запрос сначала проходит через прокси-сервер. Затем прокси пересылает ваш запрос на сайт, получает ответ и отправляет его обратно вам. Этот процесс маскирует ваш IP-адрес для адресата, создавая впечатление, что запрос исходит от прокси-сервера, а не от вашего устройства.
Типичная причина, по которой вы хотите использовать прокси, – это автоматизация веб-запросов или веб-скраппинг. В этом сценарии Python является одним из лучших языков для веб-скреппинга благодаря обширным библиотекам и большому активному сообществу.
Что такое ротация прокси и зачем она нужна?
Если вы делаете слишком много запросов с одного IP-адреса, сайты могут заблокировать вас через ограничение скорости или прямой запрет IP-адреса. Именно здесь на помощь приходит ротация прокси через прокси-серверы.
Систематическое переключение между различными прокси-серверами при выполнении веб-запросов – один из лучших способов реализовать ротацию IP-адресов. Эта процедура поможет вам обойти распространенные методы защиты от скаппинга и обеспечит следующие преимущества:
- Избегайте блокировки IP-адресов: Распределяйте запросы по нескольким IP-адресам, чтобы веб-сайтам было сложнее обнаружить и заблокировать вашу деятельность по скраппингу.
- Обход ограничений скорости: Веб-сайты часто устанавливают лимиты запросов на один IP-адрес в течение определенного периода времени. Ротация прокси поможет вам продолжить поиск даже после достижения этих лимитов на одном IP.
- Доступ к контенту с географическими ограничениями: Некоторые веб-сайты отображают различный контент в зависимости от географического положения. Ротация прокси с прокси из разных стран позволяет получить доступ к контенту, специфичному для конкретного местоположения.
Как вращать прокси в Python: 3 подхода
Теперь, когда вы знаете, что такое прокси и зачем их вращать, приготовьтесь к пошаговым урокам на Python. В следующих параграфах вы узнаете, как вращать прокси в Python, используя различные подходы и библиотеки.
Целевым сайтом для всех скриптов будет конечная точка /ip
из проекта HTTPBin. Эта специальная конечная точка возвращает IP-адрес вызывающего пользователя, что делает ее идеальной для проверки того, вращается ли IP, видимый сервером.
Пора вращать прокси в Python!
Требования
Чтобы повторить уроки по ротации прокси с помощью Python, на вашей машине должен быть установлен Python 3.7 или выше.
Пререквизиты
Предположим, что вы назвали главную папку своего проекта proxy_rotation/
. По завершении этого шага папка будет иметь следующую структуру:
proxy_rotation/
├── requests_file.py
├── async.py
├── scrapy_rotation/
└── venv/
Где:
requests.py
иasync.py
– это Python-файлы, в которых хранится логика ротации прокси Requests и AIOHTTP соответственно.scrapy_rotation/
– это папка, содержащая проект Scrapy. Вы создадите и инстанцируете его позже.venv/
содержит виртуальное окружение
Вы можете создать каталог виртуальной среды venv/
следующим образом:
python -m venv venv
Чтобы активировать его, в Windows выполните команду:
venv\Scripts\activate
Аналогично, в macOS и Linux выполните команду:
source venv/bin/activate
В качестве последнего условия вам необходимо получить список прокси-серверов. Для этой статьи вы можете использовать наш бесплатный список прокси.
Как ротировать прокси в Python с помощью запросов
В этом разделе урока вы узнаете, как вращать прокси в Python с помощью Requests.
Шаг #1: Установка зависимостей
В активированной виртуальной среде установите Requests с помощью:
pip install requests
Шаг № 2: Определите логику вращения
Чтобы повернуть прокси в Python с помощью Requests, напишите следующий код в файле requests_file.py:
import random
import requests
# Define a list of proxies and return a random one
def get_random_proxy():
proxies = [
"http://PROXY_1:PORT_X",
"http://PROXY_2:PORT_Y",
"http://PROXY_3:PORT_X",
# Add more proxies here...
]
# Randomly pick a proxy
return random.choice(proxies)
for i in range(3):
proxy_url = get_random_proxy()
proxies = {
"http": proxy_url,
"https": proxy_url,
}
response = requests.get("https://httpbin.io/ip", proxies=proxies)
print(response.text)
Где:
- Функция
get_random_proxy()
сохраняет список прокси, который вы получили, и возвращает случайный прокси с помощью методаrandom.choice()
. - В цикле
for
выполняется итерация по рандомизированному списку прокси и выполняется фактический запрос с помощью методаrequests.get()
. Для получения дополнительной информации читайте наше руководство по использованию прокси с Python Requests.
Шаг № 3: Запуск сценария
Чтобы запустить скрипт, выполните команду:
python requests_file.py
Ниже приведен ожидаемый ответ:
{
"origin": "PROXY_3:PORT_K"
}
{
"origin": "PROXY_1:PORT_N"
}
{
"origin": "PROXY_2:PORT_P"
}
Замечательно! Выходные IP-адреса вашего скрипта были повернуты так, как нужно.
Как ротировать прокси в Python с помощью AIOHTTP
Основное ограничение рандомизированного подхода с использованием библиотеки Requests заключается в том, что он использует один прокси за раз. Это означает, что вам нужно дождаться завершения каждого запроса, прежде чем будет использован следующий прокси.
Чтобы избежать этого ограничения, вы можете использовать AIOHTTP. Эта библиотека позволяет выполнять асинхронные запросы, тем самым используя несколько прокси одновременно неблокируемым способом. Другими словами, она позволяет менять прокси из вашего списка, делая асинхронные, параллельные запросы к целевому серверу. Посмотрите на AIOHTTP в действии в нашем руководстве по асинхронному веб-скрапингу.
В следующем разделе показано, как вращать прокси в Python с помощью AIOHTTP.
Шаг #1: Установка зависимостей
В активированной виртуальной среде установите AIOHTTP с помощью:
pip install aiohttp
Шаг № 2: Определите логику вращения
Чтобы повернуть прокси в Python с помощью AIOHTTP, напишите следующий код в файле async.py:
import asyncio
import aiohttp
# Define a list of proxies
proxies_list = [
"http://PROXY_1:PORT_X",
"http://PROXY_2:PORT_Y",
"http://PROXY_3:PORT_X",
# Add more proxies here...
]
async def fetch_ip(session, proxy_address, attempt):
print(f"Attempt {attempt} using proxy: {proxy_address}")
async with session.get("https://httpbin.io/ip", proxy=proxy_address) as response:
json_response = await response.json()
print(f"Response from httpbin.io/ip (Attempt {attempt}):")
print(f"IP Address: {json_response.get('origin', 'Unknown')}")
print("-" * 40)
return json_response
async def main():
async with aiohttp.ClientSession() as session:
tasks = []
num_attempts = 3
for i in range(num_attempts):
# Rotate proxies using the modulus operator.
proxy_address = proxies_list[i % len(proxies_list)]
tasks.append(fetch_ip(session, proxy_address, i + 1))
# Run all requests concurrently
await asyncio.gather(*tasks)
# Launch the script
asyncio.run(main())
Этот код выполняет следующие действия:
- Функция
fetch_ip()
управляет запросами, принимая сессию, прокси и номер попытки. В частности, она отправляетGET-запрос
на целевой сайт и печатает ответ. - Функция
main()
:Polylang placeholder не изменяется
Шаг № 3: Запуск сценария
Чтобы запустить скрипт, выполните команду:
python async.py
Это ожидаемый ответ:
Attempt 1 using proxy: http://PROXY_1:PORT_X
Attempt 2 using proxy: http://PROXY_2:PORT_Y
Attempt 3 using proxy: http://PROXY_3:PORT_Z
Response from httpbin.io/ip (Attempt 3):
IP Address: xxx.xxx.xxx.xxx
----------------------------------------
Response from httpbin.io/ip (Attempt 1):
IP Address: yyy.yyy.yyy.yyy
----------------------------------------
Response from httpbin.io/ip (Attempt 2):
IP Address: zzz.zzz.zzz.zzz
----------------------------------------
Потрясающе! IP-адреса ротируются, как и ожидалось.
Как вращать прокси-серверы с помощью Python Scrapy
В предыдущей статье мы рассказали о возможности ротации прокси в Python с помощью Scrapy, используя scrapy-rotating-proxies
.
В этом разделе вы узнаете, как это сделать!
Шаг #1: Установка зависимостей
В активированной виртуальной среде установите необходимые библиотеки:
pip install scrapy scrapy-rotating-proxies
Шаг №2: Создайте новый проект Scrapy
В главной папке вашего репозитория(proxy_rotation/
) создайте новый проект Scrapy с помощью этой команды:
scrapy startproject scrapy_rotation
Это создаст новую подпапку scrapy_rotation/
, которая будет иметь следующую структуру:
scrapy_rotation/
├── scrapy_rotation/
│ ├── __init__.py
│ ├── items.py # Defines the data structure for scraped items
│ ├── middlewares.py # Custom middlewares
│ ├── pipelines.py # Handles post-processing of scraped data
│ ├── settings.py # Project settings
│ └── spiders/ # Folder for all spiders
└── scrapy.cfg # Scrapy configuration file
Из основной папки(proxy_rotation/
) переместитесь в папку scrapy_rotation/
:
cd scrapy_rotation
Теперь вы можете создать нового паука, указывающего на целевой сайт, выполнив команду:
scrapy genspider rotation http://httpbin.io/ip
Этот скрипт также создает файл rotation.py
в папке spiders/
.
Шаг № 3: Определите логику вращения
Логикой ротации прокси можно управлять, изменив файл settings.py
со следующими настройками:
# Enable the rotating proxies middleware
DOWNLOADER_MIDDLEWARES = {
"rotating_proxies.middlewares.RotatingProxyMiddleware": 610,
"rotating_proxies.middlewares.BanDetectionMiddleware": 620,
}
# List of proxies to rotate
ROTATING_PROXY_LIST = [
"http://PROXY_1:PORT_X",
"http://PROXY_2:PORT_Y",
"http://PROXY_3:PORT_Z",
# Add more proxies as needed
]
# Configure retry settings
RETRY_TIMES = 5 # Number of retries for failed requests
RETRY_HTTP_CODES = [500, 502, 503, 504, 408] # HTTP codes to retry
Ротацией прокси здесь управляет опция rotating_proxies.middlewares.RotatingProxyMiddleware: 610
в DOWNLOADER_MIDDLEWARES
. В частности, эта опция выбирает прокси из списка ROTATING_PROXY_LIST
и назначает его на каждый запрос.
Кроме того, опция rotating_proxies.middlewares.BanDetectionMiddleware: 620
позволяет скреперу определять, был ли IP запрещен или заблокирован целевым сайтом. Если запрос не проходит по этой причине, промежуточное ПО повторит запрос с новым прокси. Таким образом, эта опция работает в тесном сотрудничестве с RotatingProxyMiddleware
, чтобы обеспечить автоматическое избегание запрещенных прокси.
Теперь в файле rotation.py
в папке spiders/
вы можете написать следующее:
import scrapy
class IpSpider(scrapy.Spider):
name = "ip_spider"
start_urls = ["http://httpbin.io/ip"]
def parse(self, response):
# Extract and print the IP address from the response
ip = response.json().get("origin")
self.log(f"IP Address: {ip}")
Этот класс инстанцирует всего паука и печатает ответ на каждый запрос.
Шаг #4: Запуск сценария
Чтобы запустить скрипт, нужно использовать имя класса IpSpider()
– ip_spider
:
scrapy crawl ip_spider
Данные, возвращаемые Scrapy через CLI, особенно полны. Поэтому, если все прошло нормально, среди прочей информации вы найдете что-то вроде этого:
2025-02-18 14:55:17 [rotating_proxies.expire] DEBUG: Proxy <http://PROXY_1:PORT_X> is GOOD
2025-02-18 14:55:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://httpbin.io/robots.txt> (referer: None)
2025-02-18 14:55:24 [rotating_proxies.middlewares] INFO: Proxies(good: 1, dead: 0, unchecked: 2, reanimated: 0, mean backoff time: 0s)
Ограничения описанных выше подходов к ротации прокси в Python
Вышеупомянутые методы вращения прокси полезны, но они имеют некоторые ограничения:
- Они требуют, чтобы вы вручную получали и управляли списком прокси-серверов.
- Они включают в себя шаблонный код.
- Они все равно могут привести к запрету IP-адресов, если вы не используете качественные прокси-серверы.
Если вы ищете более эффективный и действенный способ управления ротацией прокси в Python, Bright Data предлагает одни из лучших ротационных прокси на рынке. Всего один URL-адрес прокси позволяет интегрировать их в HTTP-клиент или библиотеку скраппинга. Это избавит вас от необходимости использовать шаблонный код и управлять ротацией вручную.
Другими ключевыми преимуществами такого подхода являются:
- Автоматическая ротация IP-адресов с настраиваемыми “липкими” IP-адресами
- Доступ к 150 million+ миллионам жилых IP-адресов
- Контроль геолокации над местоположением прокси-сервера
- Поддержка протоколов HTTP, HTTPS и SOCKS
Упростите управление прокси-серверами – откройте для себя наши автоповоротные прокси-серверы!
Заключение
В этой статье вы узнали, как вращать прокси в Python с помощью трех разных библиотек: Requests, AIOHTTP и Scrapy. Как было показано в приведенных выше разделах, этот процесс не сложен и требует всего нескольких строк кода.
Однако у такого подхода есть несколько недостатков:
- Код состоит из множества шаблонов, что делает ваш скрипт менее удобным для сопровождения.
- Вам нужно управлять и предоставлять доступ к большому списку прокси-серверов.
К счастью, вы можете пропустить все эти хлопоты с помощью автоповорачивающихся прокси-серверов Bright Data – более эффективного решения для поворота прокси-серверов в Python.
Bright Data управляет лучшими прокси-серверами в мире, обслуживая компании из списка Fortune 500 и более 20 000 клиентов. Компания предлагает широкий выбор типов прокси-серверов:
- Прокси для дата-центров – более 770 000 IP-адресов дата-центров.
- Резидентные прокси – более 150 million+ резидентных IP в более чем 195 странах.
- Прокси-провайдеры – более 700 000 IP-адресов провайдеров.
- Мобильные прокси – более 7 миллионов мобильных IP-адресов.
Создайте бесплатную учетную запись Bright Data сегодня, чтобы протестировать наши прокси и решения для скраппинга!
Кредитная карта не требуется