Использование прокси в Selenium

Selenium – это мощная библиотека автоматизации работы браузера, позволяющая создавать ботов и скрипты, которые могут загружать веб-страницы и взаимодействовать с ними в браузере. Благодаря такому функционалу Selenium пользуется большой популярностью при парсинге веб-страниц.

В этом руководстве мы рассмотрим, как интегрировать прокси в наш веб-парсер на базе Python Selenium. Существует несколько типов прокси, которые можно использовать с Selenium. Мы рассмотрим интеграцию каждого.

Содержание

Использование прокси в Selenium

Первый и самый простой тип прокси для интеграции с Python Selenium – это простые HTTP-прокси (в виде IP-адреса), которые не требуют аутентификации. Например:

"11.456.448.110:8080"

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

Интеграция прокси с браузером Selenium Chrome

Чтобы интегрировать этот IP-адрес прокси в парсер Selenium, использующий браузер Chrome, нам достаточно задать аргумент --proxy-server в опциях WebDriver:

from selenium import webdriver

## Example Proxy
PROXY = "11.456.448.110:8080"

## Create WebDriver Options to Add Proxy
chrome_options = WebDriver.ChromeOptions()
chrome_options.add_argument(f'--proxy-server={PROXY}')
chrome = webdriver.Chrome(chrome_options=chrome_options)

## Make Request Using Proxy
chrome.get("http://httpbin.org/ip")

Теперь при запуске скрипта мы видим, что Selenium использует IP прокси-сервера:

{
    "origin": "11.456.448.110:8080"
}

Интеграция прокси с браузером Selenium Firefox

Чтобы интегрировать этот прокси-адрес в скрапер Selenium, использующий браузер Firefox, нам нужно использовать классы Proxy и ProxyType из библиотеки Selenium Webdriver:

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
 
## Define Proxy
proxy = Proxy({
    'proxyType': ProxyType.MANUAL,
    'httpProxy': "11.456.448.110:8080",
    'noProxy': ''
})

## Create Driver 
firefox_driver = webdriver.Firefox(proxy = proxy, executable_path=r"/root/geckodriver")
 
## Make Request Using Proxy
firefox_driver.get("http://httpbin.org/ip")

Теперь при запуске скрипта мы видим, что Selenium использует заданный прокси-адрес:

{
    "origin": "11.456.448.110:8080"
}
❗️ HTTP PROXY AUTHENTICATION
Этот метод хорошо работает, когда не нужно добавлять в прокси имя пользователя и пароль для аутентификации. Как использовать прокси с аутентификацией, мы рассмотрим в другом разделе.

Использование аутентифицированных прокси в Selenium

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

Очень часто коммерческие прокси-провайдеры продают доступ к своим прокси-пулам, предоставляя вам одну конечную точку прокси. Вы отправляете к ней запросы и аутентифицируете свою учетную запись с помощью имени пользователя и пароля.

"http://USERNAME:PASSWORD@proxy-server:8080"

Существует несколько способов решения этой задачи. Одним из самых простых является использование расширения Selenium Wire, которое упрощает использование прокси-серверов в Selenium.

Для начала необходимо установить Selenium Wire с помощью pip:

pip install selenium-wire

Затем обновите свой парсер, чтобы он использовал веб-драйвер seleniumwire вместо стандартного веб-драйвера selenium:

from seleniumwire import webdriver
from webdriver_manager.chrome import ChromeDriverManager

## Define Your Proxy Endpoints
proxy_options = {
    'proxy': {
        'http': 'http://USERNAME:PASSWORD@proxy-server:8080',
        'https': 'http://USERNAME:PASSWORD@proxy-server:8080',
        'no_proxy': 'localhost:127.0.0.1'
    }
}

## Set Up Selenium Chrome driver
driver = webdriver.Chrome(ChromeDriverManager().install(), 
                            seleniumwire_options=proxy_options)

## Send Request Using Proxy
driver.get('http://httpbin.org/ip')

Теперь при запуске скрипта мы видим, что Selenium использует нужный нам прокси адрес:

{
    "origin": "201.88.548.330:8080"
}

Интеграция API прокси-серверов

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

Однако эндпоинты API не очень хорошо интегрируются с безголовыми браузерами. И особенно – когда на сайте используются относительные ссылки. Дело в том, что Selenium пытается прикрепить относительный URL к конечной точке API прокси, а не к корневому URL сайта. В результате некоторые страницы загружаются некорректно.

Поэтому при написании кода с использованием Selenium рекомендуется по возможности использовать интеграцию с прокси-портом, а не с эндпоинтом API.

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

from seleniumwire import webdriver
from webdriver_manager.chrome import ChromeDriverManager

SCRAPEOPS_API_KEY = 'APIKEY'

## Define ScrapeOps Proxy Port Endpoint
proxy_options = {
    'proxy': {
        'http': f'http://scrapeops:{SCRAPEOPS_API_KEY}@proxy.scrapeops.io:5353',
        'https': f'http://scrapeops:{SCRAPEOPS_API_KEY}@proxy.scrapeops.io:5353',
        'no_proxy': 'localhost:127.0.0.1'
    }
}

## Set Up Selenium Chrome driver
driver = webdriver.Chrome(ChromeDriverManager().install(), 
                            seleniumwire_options=proxy_options)

## Send Request Using ScrapeOps Proxy
driver.get('http://quotes.toscrape.com/')

Заключение

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

Перевод статьи «Using Proxies With Python Selenium».

Оставьте комментарий

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