Блокировки в headless режиме во время работы с яндекс маркетом selenium Python
Час добрый
Давненько уже для личных целей собираю данные с яндекс маркета при помощи связки selenium + python, но возникла необходимость поставить данный парсер на сервер (убунту), в связи с чем возникла проблема:
Для работы селениума на серверах убунту требуется запускать вебдрайвер с headless атрибутом, из-за которого яндекс маркет блокирует подключение выдавая:
<h1 class="content__h1">Доступ к нашему сервису временно запрещён!</h1><p>Возможно, ваш компьютер заражён вредоносной программой, которая автоматически обращается к Яндексу.<br/>Рекомендуем вам проверить компьютер на вирусы или обратиться к администратору вашей сети.</p><p>Если у вас возникли проблемы или вы хотите задать вопрос нашей службе поддержки, пожалуйста, воспользуйтесь <a class="link" href="https://yandex.ru/support/smart-captcha/?unique_key=7b8cc3b0-28e43c2f-731433c2-5f0c6551" onclick="ym(15897442, 'reachGoal', 'support_complain', { 'req_id': '1662718233984152-12123538743980376554' }); return true;">формой обратной связи</a>.</p>
<p>7b8cc3b0-28e43c2f-731433c2-5f0c6551</p>
В принципе ничего неожиданного с учетом того что такая же система защиты у них стоит и для парсинга при помощи post/get запросов, однако есть ли способ обойти данное ограничение в headless режиме браузера? Без данного режима все работает идеально.
Использовать windows server не вариант, т.к. арендовать для такого парсера отдельный сервер не вижу смысла, а запускать каждый раз на запасном ноутбуке не сильно удобно.
Для примера накину код при котором будет возникать блокировка:
current_path = os.getcwd()
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument('--no-sandbox')
options.add_argument('headless')
options.add_argument(fr"user-data-dir={current_path}\Default")
driver = webdriver.Chrome(
executable_path=fr'drivers\chromedriver.exe',
options=options,
)
url = 'https://market.yandex.ru/catalog--televizory/26960210/list?hid=90639&local-offers-first=0'
'''
Иногда селениум не может определить статус загрузки страницы.
Для этого ставим паузу в 3 секунды (всегда хватало) и получаем исходники страницы
'''
try:
driver.get(url)
except Exception:
time.sleep(3)
page_source = driver.page_source
if 'Доступ к нашему сервису временно запрещён' in page_source:
print('[INFO] Доступ запрещен')
else:
print('[INFO] Страница успешно загружена')
Если запускать с headless режимом, то выдаст текст из if, но если удалить строку с headless/закомментировать ее, то выдаст принт из else