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

Ниже перечислены основные сценарии использования прокси в Python 3 скрапинге:

Защита от блокировки IP: многие сайты ограничивают частоту обращений с одного IP. Если лимит превышен, адрес могут временно или навсегда заблокировать. Прокси помогает распределить трафик и снизить этот риск.

Повышение скорости сбора: прокси позволяют запускать несколько соединений параллельно и быстрее собирать нужные данные.

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

Итог простой: прокси IP играют важную роль в Python 3 скрапинге. При этом важно выбирать надежных провайдеров и соблюдать правила безопасности и условия использования сайтов.

Подготовка

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

В моем примере локально запущено прокси-приложение: оно поднимает HTTP-прокси на порту 7890, то есть прокси имеет адрес 127.0.0.1:7890. Дополнительно на порту 7891 поднимается SOCKS-прокси, то есть 127.0.0.1:7891. После настройки такого прокси локальный IP меняется на IP сервера, к которому подключено приложение.

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

После настройки прокси для проверки удобно использовать http://httpbin.org/get. В ответе будет поле origin с IP клиента, по которому легко понять, подменился ли ваш исходный IP на IP прокси.

Теперь разберем, как настраивать прокси в популярных библиотеках для запросов и браузерной автоматизации.

Где получить прокси для Python 3 скрапинга

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

Лучший статический прокси IP для США

IPRoyal — провайдер прокси с хорошим балансом цены и качества, а его резидентские решения особенно удобны для задач по сбору данных и автоматизации.

Обзор IPRoyal
Самый дешевый статический прокси

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

Обзор Proxy-Seller
Лучший вариант по цене

Shifter.io — известный провайдер прокси, ориентированный на приватность, стабильность и удобную работу с автоматизацией.

Обзор Shifter.io

2. urllib

Сначала разберем самый базовый вариант, `urllib`, и посмотрим, как в нем настраивается прокси. Код выглядит так:

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = '127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 opener = build_opener(proxy_handler)
 try:
    response = opener.open('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Результат выполнения будет таким:

 {
  "args": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Host": "httpbin.org",
    "User-Agent": "Python-urllib/3.7",
    "X-Amzn-Trace-Id": "Root=1-60e9a1b6-0a20b8a678844a0b2ab4e889"
  },
  "origin": "210.173.1.204",
  "url": "https://httpbin.org/get"
 }
 

Здесь прокси настраивается через `ProxyHandler`. В него передается словарь, где ключи обозначают протокол, а значения содержат адрес прокси. В адресе обязательно нужно указывать схему, например http:// или https://. Если целевой URL использует HTTP, будет задействован прокси из ключа `http`; если HTTPS, то из ключа `https`. В этом примере оба ключа указывают на HTTP-прокси, поэтому и HTTP, и HTTPS-запросы будут проходить через один и тот же прокси-сервер.

После создания объекта `ProxyHandler` его нужно передать в `build_opener()`, чтобы получить opener с уже настроенной прокси-маршрутизацией. Затем достаточно вызвать у этого opener метод `open()`, чтобы отправить запрос на нужный адрес.

В ответе возвращается JSON, а поле `origin` показывает IP клиента. Если там указан IP прокси, а не ваш реальный IP, значит прокси настроен правильно и помогает скрывать исходный адрес.

Если прокси требует авторизацию, настройка будет такой:

 from urllib.error import URLError
 from urllib.request import ProxyHandler, build_opener

 proxy = 'username:password@127.0.0.1:7890'
 proxy_handler = ProxyHandler({
    'http': 'http://' + proxy,
    'https': 'http://' + proxy
 })
 opener = build_opener(proxy_handler)
 try:
    response = opener.open('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Меняется только переменная `proxy`: перед адресом прокси нужно добавить логин и пароль для авторизации. Например, если имя пользователя `foo`, а пароль `bar`, строка прокси будет выглядеть так: foo:bar@127.0.0.1:7890.

Если используется прокси типа SOCKS5, настройка будет такой:

 import socks
 import socket
 from urllib import request
 from urllib.error import URLError

 socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 7891)
 socket.socket = socks.socksocket
 try:
    response = request.urlopen('https://httpbin.org/get')
    print(response.read().decode('utf-8'))
 except URLError as e:
    print(e.reason)
 

Для этого нужен модуль `socks`, который можно установить такой командой:

 pip3 install PySocks