Способы ротации прокси в Python

Пишем код на Python по ротации IP-адресов, используя библиотеку requests и фреймворк Scrapy.

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


В этой статье вы узнаете как:


  1. настроить прокси-сервера для библиотеки Python - "Requests"
  2. настроить ротацию прокси двумя способами:
  • используя библиотеку запросов - Requests
  • используя фреймворк Scrapy

Библиотека Requests

Простая HTTP-библиотека для Python. Она позволяет очень легко отправлять запросы HTTP/1.1 без необходимости вручную добавлять строки запроса к URL-адресам или кодировать данные в POST. Чтобы установить библиотеку, выполните эту команду в терминале:

python -m pip install requests

Фреймворк Scrapy

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

Scrapy поставляется с middleware, которое позволяет удобно работать с ротирующимися прокси. Чтобы установить модуль для ротации прокси, выполните команду:

pip install scrapypip install scrapy-rotating-proxies

Настройка прокси-серверов для Requests

  1. Сначала импортируйте библиотеку requests, затем создайте прокси-словарь для сопоставления протоколов - HTTP и HTTPS с URL-адресом прокси. Далее, получите ответ, используя метод requests.get, чтобы сделать запрос на URL-адрес с помощью прокси-словаря. Например:
import requests 

proxies = {'http': 'http://210.130.40.10:3568', 'https': 'http://210.130.40.10:2560'}
response = requests.get('http://site.ru', proxies=proxies)

Использование сессий

Если нужно создать сессию и одновременно использовать прокси-сервер для запроса страницы, то в этом случае вам сначала нужно создать новый объект сессии и добавить к нему прокси, а затем, отправить запрос через объект сеанса:


По существу `requests.get` использует `requests.Session` под капотом.

import requests

s = requests.Session()
s.proxies = {
  "http": "http://200.30.20.10:8000",
  "https": "http://200.30.20.10:8000",
}
r = s.get("http://sute.ru")

Ротация прокси

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


Теперь давайте перейдем к части "как". В этом подразделе показаны два способа ротации прокси:


1. Написание логики ротации прокси с помощью библиотеки requests

2. Ротация прокси в python с использованием Scrapy

Ротация прокси с использованием библиотеки requests

Сначала в коде, показанном ниже, мы создаем словарь пула прокси. Затем случайным образом выберите прокси-сервер для нашего запроса. Если прокси работает правильно, мы можем получить доступ к данному сайту. Если произошла ошибка подключения, то удалим этот прокси из списка и повторим запрос с этим же URL-адресом с другим прокси-сервером.

import requests

s = requests.Session()
s.proxies = {
  "http": "http://200.30.20.10:8000",
  "https": "http://200.30.20.10:8000",
}
r = s.get("http://sute.ru")

Ротация прокси в Python с помощью Scrapy

В settings.py

  1. добавьте список таких прокси:
ROTATING_PROXY_LIST = [
  'Proxy_IP:port',
  'Proxy_IP:port',
  # ...
]

Или, если необходимо загрузить прокси из файла, то:

ROTATING_PROXY_LIST_PATH = 'listofproxies.txt'

Включите в middleware:

DOWNLOADER_MIDDLEWARES = {
  # ...
  'rotating_proxies.middlewares.RotatingProxyMiddleware': 800,
  'rotating_proxies.middlewares.BanDetectionMiddleware': 800,
  # ...
}

Вот и все! Теперь все ваши запросы будут автоматически маршрутизироваться случайным образом через прокси.


Примечание: Иногда прокси, которые вы пытаетесь использовать, блокируются. В этом случае вы мало что можете с этим поделать, кроме как удалить его из пула и повторить попытку с помощью другого прокси-сервера. Но если прокси не заблокированы, вам просто нужно немного подождать, прежде чем снова использовать их.

Нужен парсинг сайтов?