Selenium — это мощная библиотека автоматизации работы браузера, позволяющая создавать ботов и скрипты, которые могут загружать веб-страницы и взаимодействовать с ними в браузере. Благодаря такому функционалу Selenium пользуется большой популярностью при парсинге веб-страниц.
В этом руководстве мы рассмотрим, как интегрировать прокси в наш веб-парсер на базе Python Selenium. Существует несколько типов прокси, которые можно использовать с Selenium. Мы рассмотрим интеграцию каждого.
Содержание
- Использование прокси-серверов в Selenium
- Использование аутентифицированных прокси в Selenium
- Интеграция API прокси-серверов
Использование прокси в 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».

НлнВ