Работа с прокси в Selenium очень проста, намного проще, чем в requests, где мы создавали словарь, прописывали в ключах схемы, и затем передавали его в запросе.
Мы можем узнать свой IP на сайте 2ip.ru. Выполните код ниже, чтобы увидеть к принт в консоли с вашим IP адресом.
import time from selenium import webdriver from selenium.webdriver.common.by import By url = 'https://2ip.ru/' with webdriver.Chrome() as browser: browser.get(url) time.sleep(5) print(browser.find_element(By.ID, 'd_clip_button').find_element(By.TAG_NAME, 'span').text) time.sleep(5)
Теперь модифицируем данный код, чтобы запрос отправлялся через прокси.
Прокси должен быть вида IP:PORT
import time from selenium import webdriver from selenium.webdriver.common.by import By proxy = 'ххх.ххх.ххх.ххх:80' url = 'https://2ip.ru/' chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--proxy-server=%s' % proxy) with webdriver.Chrome(options=chrome_options) as browser: browser.get(url) print(browser.find_element(By.ID, 'd_clip_button').find_element(By.TAG_NAME, 'span').text) time.sleep(5)
Посмотрите внимательно на код и определите отличия между этими двумя примерами.
Первое, что мы сделали, — передали параметр ‘—proxy-server=%s’ % proxy методу .add_argument() в класс дополнительных опций .ChromeOptions() и передали сам прокси, который лежал в переменной proxy. Если этот прокси еще живой, можете запустить этот код у себя в IDE. Если прокси умер, то приобретите надёжный прокси, и запустите код с ним.
Подобно requests, мы можем установить timeout= для загрузки страницы, после истечению которого произойдет, либо закрытие окна, либо переход к следующему прокси.
from selenium import webdriver from selenium.webdriver.common.by import By proxy_list = ['8.210.83.33:80', '199.60.103.28:80', '103.151.246.38:10001', '199.60.103.228:80', '199.60.103.228:80', '199.60.103.28:80', ] for PROXY in proxy_list: try: chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--proxy-server=%s' % PROXY) url = 'https://2ip.ru/' with webdriver.Chrome(options=chrome_options) as browser: browser.get(url) print(browser.find_element(By.ID, 'd_clip_button').find_element(By.TAG_NAME, 'span').text) browser.set_page_load_timeout(5) proxy_list.remove(PROXY) except Exception as _ex: print(f"Превышен timeout ожидания для - {PROXY}") continue
В этом примере есть список прокси proxy_list, по которому мы итерируемcя в цикле for, передавая на каждой итерации в переменную PROXY следующий IP из этого списка. Мы применили конструкцию try/except, чтобы наш скрипт не падал с ошибкой, и продолжал работать. Если не обернуть код в try/except, мы после каждого истекшего timeout= мы будем получать ошибку: Message: unknown error: net::ERR_TUNNEL_CONNECTION_FAILED.
timeout в Selenium применяется методом .set_page_load_timeout(5) где цифра 5 длительность в секундах.
p.s. Если вы найдёте работающий прокси, то этот код напечатает вам его в консоль = )
Proxy с авторизацией
Для настройки прокси с авторизацией вам потребуется отдельно установить расширение seleniumwire.
Установка:
pip install selenium-wire
Импорт:
from seleniumwire import webdriver
Пример реализации:
import time from selenium.webdriver.common.by import By from seleniumwire import webdriver options = {'proxy': { 'http': "socks5://D2Frs6:75JjrW@194.28.210.39:9867", 'https': "socks5://D2Frs6:75JjrW@194.28.210.39:9867", }} url = 'https://2ip.ru/' with webdriver.Chrome(seleniumwire_options=options) as browser: browser.get(url) print(browser.find_element(By.ID, 'd_clip_button').find_element(By.TAG_NAME, 'span').text) time.sleep(5)
Как вы можете заметить, структура кода почти не изменилась: мы использовали options=options, а теперь используем seleniumwire_options=options, в словаре options, лежит прокси с авторизацией, и нам не нужно использовать метод добавления аргумента .add_argument().
Когда вы покупаете прокси в магазине, они могут иметь два вида авторизации:
по логину и паролю;
по вашему IP адресу.
Вы можете выбрать удобный для вас способ. Если ваш провайдер выдает динамический IP, который меняется при каждой перезагрузке ПК или роутера, то лучше выбрать авторизацию по логину и паролю, если IP статический, то лучше выбрать авторизацию по IP.