Замена прокси во время выполнения цикла Selenium
Суть проблемы, есть парсер на Селениуме, который должен собрать данные о товаре (Цена, имя, наличие), все работает отлично, но при переходе на следующую страницу сайт блочит программу и выдает капчу, я бы прошел ее в ручную, но сайт грузит бесконечно долго и в итоге блочит мой прокси, возможно ли сделать так что бы после парсинга каждой страницы, перед переходом на следующую страницу автоматически менять прокси?
Вот результат выполнения программы:
Штатна магнітола Gazer CM5007-MD for Hyundai Elantra (MD) (2011-2016) 14 999 Есть в наличии
Штатна магнітола Gazer CM7015-YF for Hyundai Sonata (YF) (2010-2015) 25 999 Есть в наличии
Load: https://comfy.ua/ua/catalogsearch/result/index/?p=2&q=+Gazer&search_provider=anyquery&strategy=vectors%2Czero_queries_predictor
[!] Обнаружена капча!
[!] Обнаружена капча!
[!] Обнаружена капча!
[!] Обнаружена капча!
И после обновления страницы браузера выбивает информацию о блокировке прокси, что можно было бы сделать?
Вот полный код парсера:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'ipetrash'
import datetime as DT
import time
from typing import List, Tuple, Union
from pathlib import Path
from datetime import datetime
# pip install pandas
import pandas as pd
# pip install selenium
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException, TimeoutException
# TODO: Using logging instead print
# TODO: price must be decimal
def parse(url: str) -> List[Tuple[str, str, str]]:
options = Options()
# NOTE: на сайте была замечена капча, обойти ее сложно будет
# проще будет руками ее проходить, когда она возникнет
# options.add_argument('--headless')
items = []
driver = webdriver.Firefox(options=options)
cur_date = datetime.now().strftime("%d_%m_%Y")
wait = WebDriverWait(driver, timeout=10)
# Сайт замусорен и очень долго прогружается из-за различных ненужных запросов
# Поэтому добавим ограничение, чтобы на driver.get не ждать несколько минут, тем
# более товары уже присутствуют
driver.set_page_load_timeout(10)
try:
while True:
print('Load:', url)
try:
driver.get(url)
except TimeoutException:
print('Страница слишком долго грузится, парсим дальше, не дожидаясь окончания!')
# Если наткнулись на капчу
# TODO: использовать более явный способ определения капчи
while True:
try:
driver.find_element_by_css_selector("#main-iframe")
print('[!] Обнаружена капча!')
time.sleep(5)
except NoSuchElementException:
break
# Пробуем получить элементы
while True:
try:
# Добавляем в селекторе ограничение на data-product-url, чтобы не зацепить пустой элемент
items_el = wait.until(
EC.visibility_of_any_elements_located(
(By.CSS_SELECTOR, ".product-item[data-product-url]")
)
)
break
except TimeoutException:
pass
print(f'Найдено элементов: {len(items_el)}')
for item_el in items_el:
# print(item_el.get_attribute('outerHTML'))
name = item_el.find_element_by_css_selector('.product-item__name').text
price = item_el.find_element_by_css_selector('.price-box__content-i > .price-value').text
try: nal = item_el.find_element_by_css_selector('t-item.out-of-stock-item').text
except: nal = ('Есть в наличии ')
print(name, price, nal)
items.append((cur_date, name, price, nal))
# У сайт два элемента для пагинации, оба имеют одинаковые поисковые атрибуты, причем
# первый скрытый, поэтому недоступен для взаимодействия
try:
a_next_page_els = WebDriverWait(driver, timeout=2).until(
EC.visibility_of_any_elements_located(
(By.CSS_SELECTOR, '.pager__number_next:not(.disabled) > a[href]')
)
)
if not a_next_page_els:
break
except TimeoutException:
break
a_next_page = a_next_page_els[0]
url = a_next_page.get_attribute('href')
finally:
driver.quit()
return items
def save_goods(
file_name: Union[str, Path],
items: List[Tuple[str, str, str]],
encoding='utf-8'
):
df = pd.DataFrame(items, columns=['cur_date', 'Name', 'Price', 'Nal'])
df.to_csv(file_name, encoding=encoding)
if __name__ == '__main__':
url = "https://comfy.ua/ua/catalogsearch/result/index/?p=1&q=+Gazer&search_provider=anyquery&strategy=vectors%2Czero_queries_predictor"
items = parse(url)
print(f'Total goods: {len(items)}')
file_name = f'comfy_parser_{DT.datetime.now():%Y-%m-%d}.csv'
print(f'Saved to {file_name}')
save_goods(file_name, items)
Прокси планирую брать от сюда: https://hidemy.name/ru/proxy-list/countries/ukraine/