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».