Как использовать прокси-серверы для ротации IP-адресов в Python

Узнайте, как использовать прокси-серверы в Python для ротации IP-адресов при скрейпинге веб-страниц, где найти надежные прокси и как избежать блокировки веб-сайтов.
2 min read
Python IP rotation

Ротация IP-адресов с использованием прокси-серверов необходима при скрейпинге веб-страниц, особенно при работе с современными веб-сайтами, которые могут налагать ограничения. Распределение запросов по нескольким IP-адресам очень важно, чтобы избежать блокировки или ограничения скорости. Ротация IP-адресов затрудняет отслеживание веб-сайтами и ограничение вашей деятельности по скрейпингу. Это повышает эффективность и надежность процесса скрейпинга веб-страниц, позволяя более эффективно извлекать данные. Использование прокси-серверов и ротируемых IP-адресов при скрейпинге веб-страниц позволяет избежать банов и штрафов по IP-адресу, преодолеть ограничения скорости и получить доступ к контенту с географическими ограничениями.

В этой статье объясняется, как внедрить прокси-серверы в рабочий процесс скрейпинга веб-страниц для ротации используемых IP-адресов. Вы узнаете, где найти эффективные прокси, каковы советы по ротации IP-адресов и как избежать блокировки целевым веб-сайтом.

Ротация IP-адресов с помощью Python

В  обычном процессе скрейпинга с помощью Python библиотека Python, например Requests или Scrapy, используется для доступа к веб-сайту и анализа его содержимого. Затем содержимое веб-сайта можно отфильтровать по информации, которую хотите извлечь. Ниже приведен пример типичного процесса скрейпинга:


import requests

url = 'http://example.com'

# Make requests 
response = requests.get(url)
print(response.text)

Этот процесс предоставляет вам необходимую информацию и подходит для однократного использования или случаев, когда вам нужно извлечь данные только один раз. Однако в данном процессе для отправки запросов используется IP-адрес вашей системы, что может вызвать проблемы при повторных или постоянных запросах в виде ограничения доступа к веб-сайту через некоторое время.

Вот результаты процесса скрейпинга, взятого в качестве примера:

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", 
…

В большинстве библиотек Python, таких как Requests или Scrapy, предназначенных для скрейпинга или отправки веб-запросов, есть возможность сменить IP-адрес, используемый при выполнении этих запросов. Однако, чтобы воспользоваться этой возможностью, вам нужен список или источник действительных IP-адресов. Эти источники могут быть бесплатными или платными, например прокси-серверы Bright Data.

Работоспособность платных вариантов гарантирована, и они предоставляют полезные инструменты для управления вашими прокси-серверами и их ротации, чтобы избежать простоев в процессе скрейпинга. Например, у Bright Data есть несколько категорий прокси-севреров по разным ценам в зависимости от сценария использования, масштабируемости и гарантии разблокированного доступа к запрошенным данным:

Прокси-сервисы Bright Data для беспроблемного скрейпинга данных

Используя бесплатные прокси-серверы, вы можете создать список на Python, содержащий действительные прокси-серверы, которые можно менять в процессе скрейпинга:


proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]

При этом все, что вам нужно, — это механизм ротации, который выбирает разные IP-адреса из списка при выполнении нескольких запросов. В Python это будет похоже на следующую функцию:

import random
import requests

def scraping_request(url):

   ip = random.randrange(0, len(proxies))
   
   ips = {"http": proxies[ip], "https": proxies[ip]}
   response = requests.get(url, proxies=ips)
   print(f"Proxy currently being used: {ips['https']}")
   return response.text

Этот код выбирает случайный прокси-сервер из вашего списка при каждом вызове. Прокси-сервер используется для запросов скрейпинга.

Включение случая ошибки при обработке недействительных прокси-серверов приведет к тому, что весь код скрейпинга будет выглядеть следующим образом:

import random
import requests

proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]
def scraping_request(url):

   ip = random.choice(proxies)
   try:
      response = requests.get(url, proxies={"http": ip, "https": ip})
      if response.status_code == 200:   
         print(f"Proxy currently being used: {ip}")
   ip = random.randrange(0, len(proxies))
   
   ips = {"http": proxies[ip], "https": proxies[ip]}
   response = requests.get(url, proxies=ips)
   try:

      if response.status_code == 200:   
         print(f"Proxy currently being used: {ips['https']}")
         print(response.text)   

      elif response.status_code == 403:
         print("Forbidden client")

      elif response.status_code == 429:
         print("Too many requests")
         
   except Exception as e:
      print(f"An unexpected error occurred: {e}")

                
scraping_request("http://example.com")

Вы также можете использовать этот список ротируемых прокси-серверов для выполнения запросов с помощью любого другого фреймворка для скрейпинга, например Scrapy.

Скрейпинг с помощью Scrapy

При использовании Scrapy вам необходимо установить библиотеку и создать необходимые артефакты проекта, прежде чем вы сможете успешно сканировать веб-страницы.

Вы можете установить Scrapy с помощью менеджера пакетов pip в вашей среде с поддержкой Python:

pip install Scrapy

После установки вы можете создать проект Scrapy с некоторыми файлами шаблонов в текущем каталоге с помощью следующих команд:

scrapy startproject sampleproject

cd sampleproject

scrapy genspider samplebot example.com

Эти команды также создают базовый файл кода, который можно доработать с помощью механизма ротации IP-адресов.

Откройте файл sampleproject/spiders/samplebot.pysamplebot.py и обновите его, добавив следующий код:


import scrapy
import random

proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]
ip = random.randrange(0, len(proxies))
   
class SampleSpider(scrapy.Spider):
    name = "samplebot"
    allowed_domains = ["example.com"]
    start_urls = ["https://example.com"]
    
    def start_requests(self):
        for url in self.start_urls:
            proxy = random.choice(proxies)
            yield scrapy.Request(url, meta={"proxy": f"http://{proxy}"})

    request = scrapy.Request(
        "http://www.example.com/index.html",
        meta={"proxy": f"http://{ip}"}
    )
    def parse(self, response):
        # Log the proxy being used in the request
        proxy_used = response.meta.get("proxy")
        self.logger.info(f"Proxy used: {proxy_used}") 
        print(response.text)

Выполните следующую команду в верхней части каталога проекта, чтобы запустить этот скрипт скрейпинга:

scrapy crawl samplebot
Запуск скрипта

Советы по ротации IP-адресов

Веб-скрейпинг превратился в форму конкуренции между веб-сайтами и скрейперами: скрейперы придумывают новые методы и методики получения необходимых данных, а веб-сайты находят новые способы блокировки доступа скрейперов.

Ротация IP-адресов — это метод, направленный на обход ограничений, установленных веб-сайтами. Чтобы максимально повысить эффективность ротации IP-адресов и свести к минимуму вероятность блокировки целевым веб-сайтом, учитывайте следующие советы:

  • Обеспечьте наличие большого и разнообразного пула прокси-серверов: При использовании ротации IP-адресов необходим значительный пул прокси-серверов с большим количеством прокси-серверов и широким спектром IP-адресов. Такое разнообразие помогает обеспечить правильную ротацию и снижает риск чрезмерного использования прокси-серверов, что может привести к ограничениям скорости и банам. Рассмотрите возможность использования нескольких поставщиков прокси-серверов с разными диапазонами IP-адресов и местоположением. Кроме того, подумаайте об изменении времени и интервалов между запросами с помощью разных прокси-серверов, чтобы лучше имитировать естественное поведение пользователей.
  • Используйте надежные механизмы обработки ошибок: в процессе скрейпинга веб-страниц вы можете столкнуться с рядом ошибок из-за временных проблем с подключением, заблокированных прокси-серверов или изменений на целевом веб-сайте. Внедряя обработку ошибок в свои скрипты, вы можете обеспечить бесперебойное выполнение процесса скрейпинга, выявляя и обрабатывая распространенные исключения, такие как ошибки соединения, тайм-ауты и ошибки статуса HTTP. Рассмотрите возможность установки автоматических выключателей, чтобы временно приостановить процесс скрейпинга в случае возникновения большого количества ошибок в течение короткого периода времени.
  • Проверьте свои прокси-серверы перед использованием: перед развертыванием скрипта скрейпинга в рабочей среде используйте образец пула прокси-сереверов, чтобы протестировать функциональность ротации IP-адресов и механизмы обработки ошибок в различных сценариях. Вы можете использовать примеры веб-сайтов для моделирования реальных условий и убедиться, что ваш скрипт справится с этими ситуациями.
  • Контролируйте производительность и эффективность прокси-серверов: Регулярно контролируйте производительность своих прокси-серверов для выявления любых проблем, таких как медленное время отклика или частые сбои. Вам следует отслеживать показатель успешности работы каждого прокси-сервера, чтобы выявлять неэффективные прокси-серверы. Поставщики прокси-серверов, такие как Bright Data , предлагают инструменты для проверки работоспособности и производительности своих прокси-серверов. Отслеживая производительность прокси-серверов, вы можете быстро переключиться на более надежные прокси-серверы и удалить неэффективные прокси-серверы из своего ротационного пула.

Веб-скрейпинг — это итеративный процесс, и веб-сайты могут изменить свою структуру и шаблоны ответов или принять новые меры для предотвращения взлома. Регулярно контролируйте процесс скрейпинга и адаптируйтесь к любым изменениям, чтобы сохранить эффективность мер скрейпинга.

Заключение

В этой статье мы рассмотрели ротацию IP-адресов и способы ее внедрения в процесс скрейпинга с помощью Python. Вы также получили несколько практических советов по поддержанию эффективности процесса скрейпинга с помощью Python.

Bright Data — это универсальная платформа для решений по скрейпингу веб-страниц. Она предоставляет высококачественные и этичные прокси-серверы, браузер для скрейпинга веб-страниц, IDE для разработки и процессов скрейпинга-ботов, готовые к использованию наборы данных и несколько инструментов для ротации и управления прокси во время скрейпинга.