При парсинге данных возникают ситуации, когда нужно получить доступ к сайту с помощью драйвера selenium. Так как на странице сайта в коде выполняются скрипты, которые добавляют в код данные, доступ к которым с помощью обычных запросов получить просто не получиться. Но, все может быть немного печальнее. К примеру, страница может находиться за CDN, такой как Cloudflare, с включенной проверкой браузера. В этом случае обычный драйвер selenium доступ к странице не получит, так как будет определено, что используется автоматизированное тестовое ПО. Но, даже в этих случаях выход есть. Давайте посмотрим, как можно обойти данную проверку с помощью отключения определенных опций в браузере, а также рассмотрим уже модифицированную версию драйвера для Chrome, в которой уже из коробки отключены данные опции. Но, обо всем по порядку.
Для начала, чтобы убедиться, что доступа к сайту у браузера под управлением Chrome все же нет, создадим простой код, который будет загружать драйвер и переходить на защищенную страницу.
Что потребуется?
Для данного кода потребуется установить selenium. Для этого пишем в терминале команду:
Загрузка сайта с включенными опциями автоматизации
После того, как будет установлена нужная библиотека, импортируем в скрипт нужные модули. А понадобится нам модуль os, для получения пути к драйверу; time, для того, чтобы установить небольшую паузу перед закрытием; platform, для определения операционной системы, чтобы в зависимости от этого подгружать нужный драйвер.
Из библиотеки selenium импортируем webdriver, а также из selenium.webdriver.chrome.service — Service, для передачи драйверу нужных параметров. В частности, в данном коде передается путь к вебдрайверу, а также параметр log_path, в котором можно указать путь для сохранения логов. В данном случае логи сохраняются в null.
Ну и перейдем на нужную страницу, подождем 10 секунд и закроем браузер.
Страница, на которую переходит браузер, как раз находится под защитой Cloudflare. Доступ получить к сайту не получилось. Нам было предложено подтвердить, что мы люди. То есть, браузер проверку не прошел и было определено автоматизированное ПО.
Использование selenium-stealth для попытки обхода защиты
Некоторое время назад данный проект выручал во многих случаях. Но в данном случае все не так хорошо и радужно. Попробуем получить доступ к сайту с его помощью.
Что потребуется?
Установить selenium, а также надстройку selenium-stealth, которая и предназначена для скрытия следов автоматизации. Для их установки пишем в терминале команду:
Теперь проделаем те же операции, которые мы выполняли при использовании обычного драйвера. С одним небольшим отличием. Здесь в скрипт нужно будет импортировать установленный selenium-stealth, к также из selenium.webdriver.chrome.options импортировать Options, для того, чтобы иметь возможность передавать в браузер различные опции, такие как «безголовость» и прочие. В нашем случае, передать нужно будет опции для отключения автоматизации. Но, давайте по порядку. Импортируем библиотеки в скрипт.
Создаем экземпляр класса Options и передаем туда необходимые параметры.
После этого создаем объект класса браузера, куда передаем путь к драйверу и установленные нами опции.
Теперь выполняем функцию из модуля selenium_stealth, которая устанавливает заголовки, язык отображения и прочие параметры.
Ну, а дальше снова попытаемся получить доступ к станице за Cloudflare.
И снова неудача. К сожалению, стелс модуль с данной задачей не справился, что отображено на скриншоте ниже. Браузер все также определяется под управлением автоматизированного ПО.
Отключение опций с помощью выполнения скрипта в драйвере
Данный способ был представлен на канале Python Today, за что ему большое спасибо. Для того, чтобы обойти защиту проверки браузера на использование автоматизированного ПО, необходимо отключить некоторые опции, которые присутствуют в браузере под управлением Selenium, а вот в оригинальном браузере вы их не найдете.
Вот эти самые опции. Посмотреть их довольно просто. Для этого запускаем браузер под управлением вебдрайвера, нажимаем «F12», чтобы попасть в инструменты разработчика. Затем переходим в консоль и пишем: window.cdc. И тут вы увидите параметры, которые считываются защитой от автоматизированного ПО.
К примеру, при запуске обычного браузера и попытке найти там то же самое, ничего найдено не было.
Теперь пора переходить к практике.
Что потребуется?
Кроме того, что установить selenium, сторонних библиотек в данном коде больше устанавливать не нужно. Пишем в терминале для его установки:
Теперь импортируем нужные библиотеки в скрипт.
Как видите, здесь также импортируется класс Options, а значит, мы будем передавать в браузер параметры. В данном случае передадим параметр для отключения автоматизации. Однако, на всякий случай на канале представлены еще два дополнительных параметра, которые можно отключить при необходимости.
Указываем путь к драйверу и передаем опции и путь в объект браузера.
Теперь необходимо выполнить скрипт для удаления параметров, о которых мы говорили выше из текущего сеанса. Для этого выполняем скрипт:
После этого, пытаемся зайти на защищенную станицу.
И, все получается. Отключение опции и удаление методов window в данном случае помогло. Доступ к странице мы получили.
Как видим, метод рабочий и его можно брать на вооружение при парсинге вот таких вот, защищенных сайтов.
Получение доступа с помощью undetected-chromedriver
Ну и еще один метод, который использует в разы меньше кода. На этот раз мы будет пытаться получить доступ к защищенному сайту с помощью библиотеки undetected-chromedriver. Разработчик данной библиотеки пошел дальше и создал библиотеку которая уже подгружает нужный драйвер и тут же его модифицирует с установкой определенных профилей. Более того, если у вас уже установлен selenium, можно указать версию вебдрайвера, и она также будет модифицирована в undetected. Для установки библиотеки пишем в терминале:
И на этом — все. Больше ничего устанавливать не нужно. Драйвер selenium, как я уже писал выше будет подтянут автоматически.
Теперь, когда библиотека установлена, импортируем в скрипт все, что необходимо для его работы.
Вот и все. Как видите, только библиотека и time, только лишь для того, чтобы установить паузу до закрытия браузера.
При использовании данной библиотеки указывать путь к вебдрайверу нет необходимости, он будет найден автоматически. Все, что требуется в этом случае, это создать объект вебдрайвера.
И после этого перейдем на защищенный сайт. Кстати, сайт который мы использовали в течении всей данной статьи был сделан разработчиком библиотеки специально для того, чтобы тестировать защиту. Как он пишет, на нем включено все, что только можно включить.
Как показано ниже, на скриншоте, доступ к сайту был получен успешно.
Ну и так как используется драйвер selenium, его можно также импортировать в скрипт и выполнять с его помощью все те операции поиска и кликов, которые вы делали в обычном selenium.
Такой вот получился небольшой обзор. Как видите, использование тех или иных методов позволяет получить доступ даже к сайта с защитой от автоматизированного ПО. И по крайней мере, два метода здесь являются рабочими. Какой из них использовать — решать вам, это уже дело предпочтений. Но я использую undetected-chromedriver, который при том же результате, что в коде с Python Today позволяет использовать меньше кода.
А на этом, пожалуй, все.
Спасибо за внимание. Надеюсь, данная информация будет вам полезна
Для начала, чтобы убедиться, что доступа к сайту у браузера под управлением Chrome все же нет, создадим простой код, который будет загружать драйвер и переходить на защищенную страницу.
Что потребуется?
Для данного кода потребуется установить selenium. Для этого пишем в терминале команду:
pip install selenium
Загрузка сайта с включенными опциями автоматизации
После того, как будет установлена нужная библиотека, импортируем в скрипт нужные модули. А понадобится нам модуль os, для получения пути к драйверу; time, для того, чтобы установить небольшую паузу перед закрытием; platform, для определения операционной системы, чтобы в зависимости от этого подгружать нужный драйвер.
Из библиотеки selenium импортируем webdriver, а также из selenium.webdriver.chrome.service — Service, для передачи драйверу нужных параметров. В частности, в данном коде передается путь к вебдрайверу, а также параметр log_path, в котором можно указать путь для сохранения логов. В данном случае логи сохраняются в null.
Python:
import os
import time
from platform import system
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
os.path.join(os.getcwd(), 'driver', 'chromedriver')
driver = webdriver.Chrome(service=Service(log_path=os.devnull, executable_path=exec_path))
Ну и перейдем на нужную страницу, подождем 10 секунд и закроем браузер.
Python:
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()
Страница, на которую переходит браузер, как раз находится под защитой Cloudflare. Доступ получить к сайту не получилось. Нам было предложено подтвердить, что мы люди. То есть, браузер проверку не прошел и было определено автоматизированное ПО.
Python:
import os
import time
from platform import system
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
os.path.join(os.getcwd(), 'driver', 'chromedriver')
driver = webdriver.Chrome(service=Service(log_path=os.devnull, executable_path=exec_path))
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()
Использование selenium-stealth для попытки обхода защиты
Некоторое время назад данный проект выручал во многих случаях. Но в данном случае все не так хорошо и радужно. Попробуем получить доступ к сайту с его помощью.
Что потребуется?
Установить selenium, а также надстройку selenium-stealth, которая и предназначена для скрытия следов автоматизации. Для их установки пишем в терминале команду:
pip install selenium selenium-stealth
Теперь проделаем те же операции, которые мы выполняли при использовании обычного драйвера. С одним небольшим отличием. Здесь в скрипт нужно будет импортировать установленный selenium-stealth, к также из selenium.webdriver.chrome.options импортировать Options, для того, чтобы иметь возможность передавать в браузер различные опции, такие как «безголовость» и прочие. В нашем случае, передать нужно будет опции для отключения автоматизации. Но, давайте по порядку. Импортируем библиотеки в скрипт.
Python:
import os
import time
from platform import system
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium_stealth import stealth
Создаем экземпляр класса Options и передаем туда необходимые параметры.
Python:
options = Options()
# options.add_argument("--headless")
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
После этого создаем объект класса браузера, куда передаем путь к драйверу и установленные нами опции.
Python:
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
os.path.join(os.getcwd(), 'driver', 'chromedriver')
driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))
Теперь выполняем функцию из модуля selenium_stealth, которая устанавливает заголовки, язык отображения и прочие параметры.
Python:
stealth(driver=driver,
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/83.0.4103.53 Safari/537.36',
languages=["ru-RU", "ru"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
run_on_insecure_origins=True,
)
Ну, а дальше снова попытаемся получить доступ к станице за Cloudflare.
Python:
driver.get('https://nowsecure.nl')
time.sleep(20)
driver.close()
driver.quit()
И снова неудача. К сожалению, стелс модуль с данной задачей не справился, что отображено на скриншоте ниже. Браузер все также определяется под управлением автоматизированного ПО.
Python:
import os
import time
from platform import system
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium_stealth import stealth
options = Options()
# options.add_argument("--headless")
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
os.path.join(os.getcwd(), 'driver', 'chromedriver')
driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))
stealth(driver=driver,
user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/83.0.4103.53 Safari/537.36',
languages=["ru-RU", "ru"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
run_on_insecure_origins=True,
)
driver.get('https://nowsecure.nl')
time.sleep(20)
driver.close()
driver.quit()
Отключение опций с помощью выполнения скрипта в драйвере
Данный способ был представлен на канале Python Today, за что ему большое спасибо. Для того, чтобы обойти защиту проверки браузера на использование автоматизированного ПО, необходимо отключить некоторые опции, которые присутствуют в браузере под управлением Selenium, а вот в оригинальном браузере вы их не найдете.
Вот эти самые опции. Посмотреть их довольно просто. Для этого запускаем браузер под управлением вебдрайвера, нажимаем «F12», чтобы попасть в инструменты разработчика. Затем переходим в консоль и пишем: window.cdc. И тут вы увидите параметры, которые считываются защитой от автоматизированного ПО.
Python:
window.cdc_adoQpoasnfa76pfcZLmcfl_Array
window.cdc_adoQpoasnfa76pfcZLmcfl_Promise
window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol
К примеру, при запуске обычного браузера и попытке найти там то же самое, ничего найдено не было.
Теперь пора переходить к практике.
Что потребуется?
Кроме того, что установить selenium, сторонних библиотек в данном коде больше устанавливать не нужно. Пишем в терминале для его установки:
pip install selenium
Теперь импортируем нужные библиотеки в скрипт.
Python:
import os
import time
from platform import system
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
Как видите, здесь также импортируется класс Options, а значит, мы будем передавать в браузер параметры. В данном случае передадим параметр для отключения автоматизации. Однако, на всякий случай на канале представлены еще два дополнительных параметра, которые можно отключить при необходимости.
Python:
options = Options()
# options.add_argument("--headless")
# options.add_experimental_option("excludeSwitches", ["enable-automation"])
# options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")
Указываем путь к драйверу и передаем опции и путь в объект браузера.
Python:
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
os.path.join(os.getcwd(), 'driver', 'chromedriver')
driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))
Теперь необходимо выполнить скрипт для удаления параметров, о которых мы говорили выше из текущего сеанса. Для этого выполняем скрипт:
Python:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
'source': '''
delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
'''
})
После этого, пытаемся зайти на защищенную станицу.
Python:
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()
И, все получается. Отключение опции и удаление методов window в данном случае помогло. Доступ к странице мы получили.
Как видим, метод рабочий и его можно брать на вооружение при парсинге вот таких вот, защищенных сайтов.
Python:
import os
import time
from platform import system
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
options = Options()
# options.add_argument("--headless")
# options.add_experimental_option("excludeSwitches", ["enable-automation"])
# options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")
exec_path = os.path.join(os.getcwd(), 'driver', 'chromedriver.exe') if system() == "Windows" else \
os.path.join(os.getcwd(), 'driver', 'chromedriver')
driver = webdriver.Chrome(options=options, service=Service(log_path=os.devnull, executable_path=exec_path))
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
'source': '''
delete window.cdc_adoQpoasnfa76pfcZLmcfl_Array;
delete window.cdc_adoQpoasnfa76pfcZLmcfl_Promise;
delete window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol;
'''
})
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()
Получение доступа с помощью undetected-chromedriver
Ну и еще один метод, который использует в разы меньше кода. На этот раз мы будет пытаться получить доступ к защищенному сайту с помощью библиотеки undetected-chromedriver. Разработчик данной библиотеки пошел дальше и создал библиотеку которая уже подгружает нужный драйвер и тут же его модифицирует с установкой определенных профилей. Более того, если у вас уже установлен selenium, можно указать версию вебдрайвера, и она также будет модифицирована в undetected. Для установки библиотеки пишем в терминале:
pip install undetected-chromedriver
И на этом — все. Больше ничего устанавливать не нужно. Драйвер selenium, как я уже писал выше будет подтянут автоматически.
Теперь, когда библиотека установлена, импортируем в скрипт все, что необходимо для его работы.
Python:
import time
import undetected_chromedriver as uc
Вот и все. Как видите, только библиотека и time, только лишь для того, чтобы установить паузу до закрытия браузера.
При использовании данной библиотеки указывать путь к вебдрайверу нет необходимости, он будет найден автоматически. Все, что требуется в этом случае, это создать объект вебдрайвера.
Python:
driver = uc.Chrome()
И после этого перейдем на защищенный сайт. Кстати, сайт который мы использовали в течении всей данной статьи был сделан разработчиком библиотеки специально для того, чтобы тестировать защиту. Как он пишет, на нем включено все, что только можно включить.
Python:
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()
Как показано ниже, на скриншоте, доступ к сайту был получен успешно.
Ну и так как используется драйвер selenium, его можно также импортировать в скрипт и выполнять с его помощью все те операции поиска и кликов, которые вы делали в обычном selenium.
Python:
import time
import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get('https://nowsecure.nl')
time.sleep(10)
driver.close()
driver.quit()
Такой вот получился небольшой обзор. Как видите, использование тех или иных методов позволяет получить доступ даже к сайта с защитой от автоматизированного ПО. И по крайней мере, два метода здесь являются рабочими. Какой из них использовать — решать вам, это уже дело предпочтений. Но я использую undetected-chromedriver, который при том же результате, что в коде с Python Today позволяет использовать меньше кода.
А на этом, пожалуй, все.
Спасибо за внимание. Надеюсь, данная информация будет вам полезна
Вложения
Последнее редактирование модератором: