Как вращать прокси в Python

Освойте ротацию прокси в Python, чтобы преодолеть запреты IP-адресов и упростить процесс веб-скрептинга.
4 мин. чтения
How to Rotate Proxies in Python blog image

В этом руководстве о том, как вращать прокси в 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 клиентов. Компания предлагает широкий выбор типов прокси-серверов:

Создайте бесплатную учетную запись Bright Data сегодня, чтобы протестировать наши прокси и решения для скраппинга!

Кредитная карта не требуется