https://github.com/ultrafunkamsterdam/undetected-chromedriver
Оптимизированный патч Selenium Chromedriver, который не запускает службы защиты от ботов, такие как Distill Network / Imperva / DataDome / Botprotect.io. Автоматически загружает двоичный файл драйвера и исправляет его.
pip install undetected-chromedriver
или, если вы любите приключения, установите напрямую через github.
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
Я буду устанавливать ограничения на систему отслеживания проблем. Им слишком долго злоупотребляли.
есть хорошие новости?
Да, я открыл Undetected-Discussions, который, я думаю, поможет нам лучше в долгосрочной перспективе.
ЭТОТ ПАКЕТ НЕ СКРЫВАЕТ и, повторяю, НЕ СКРЫВАЕТ ваш IP-адрес, поэтому при запуске из дата-центра (даже меньшего) велики шансы, что вы не пройдете! Кроме того, если у вас дома низкая репутация IP-адреса, вы не пройдете!
Запуск следующего кода из дома и из центра обработки данных.
import undetected_chromedriver as uc
driver = uc . Chrome ( headless = True , use_subprocess = False )
driver . get ( 'https://nowsecure.nl' )
driver . save_screenshot ( 'nowsecure.png' )
Большое обновление! будьте осторожны, поскольку это потенциально может сломать ваш код.
переписали механизм антиобнаружения вместо удаления и переименования переменных, мы просто сохраняем их, но в первую очередь предотвращаем их внедрение. Это защитит нас от обнаружения, по крайней мере, в ближайшем будущем.
переписано имя файла, чтобы предотвратить появление 1000 файлов {randomstring}_chromedriver.exe, вместо этого он просто называется undetected_chromedriver.exe
очистка удалила папку совместимости, файлов v2 и тестов
добавлен метод WebElement.click_safe(), который вы можете попробовать, если вас обнаружат после перехода по ссылке. Это не гарантированно сработает.
добавлен WebElement.children(self, tag=None, recursive=False), чтобы легко получать/находить дочерние узлы. пример:
body = driver.find_element('tag name', 'body')
# get the 6th child (any tag) of body, and grab all img's within (recursive).
images = body.children()[6].children('img', True)
srcs = list(map(lambda _:_.attrs.get('src'), images))
добавлен файл example.py, на который я могу указывать людям, когда задаю глупые вопросы (нет, на самом деле это довольно круто, каждый должен это увидеть)
добавлена поддержка лямбда-платформы
добавлена поддержка x86_32
добавлена поддержка системных отчетов как linux2
некоторый рефакторинг
use_subprocess теперь по умолчанию имеет значение True. слишком много людей не понимают многопроцессорность и name == ' main , и после тестирования кажется, что в Chrome 104+ это больше не имеет значения.
добавлен no_sandbox, для которого по умолчанию установлено значение True, и это без раздражающей панели «вы используете незащищенную командную строку...».
обновить образ Docker. теперь вы можете подключиться к своему контейнеру через vnc или rdp, чтобы увидеть фактическое окно браузера.
конечно, "обычный" режим тоже работает
эта версия might
сломать ваш код, проверьте перед обновлением!
добавлена новая логика антиобнаружения!
v2 стала основным модулем, поэтому ссылки на v2 больше не нужны. это означает, что теперь вы можете просто использовать:
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' )
для обратной совместимости v2 не удаляется, а привязывается к основному модулю.
Исправлено раздражающее «экран приветствия» на ОС, отличных от Windows. Для тех нагфетишистов, которые ❤ заставляют экраны приветствия и скармливают Google еще больше данных, используйте Chrome(suppress_welcome=False).
заменен executable_path
в конструкторе на browser_executable_path
, который не следует использовать, если только вы не являетесь крайним случаем (да, так и есть), который не может добавить свою пользовательскую папку установки Chrome в переменную среды PATH или у вас есть армия разных браузеров/версий и автоматический поиск возвращает неправильный браузер
«v1» (?) на данный момент перемещен в _compat.
версии с фиксированными зависимостями
Пользовательская обработка ChromeOptions удалена, поэтому она совместима с webdriver.chromium.options.ChromiumOptions
.
удалил Chrome.get() fu и восстановил «почти» оригинал:
with
больше не нужны, хотя ради обратной совместимости это все равно будет работать.успех теста на сегодняшний день: 100%
просто упомяну об этом в другой раз, поскольку некоторым людям трудно читать: безголовый все еще находится в стадии разработки. Поднимать вопросы нет необходимости
изменить поведение создания процесса, чтобы оно было полностью отделено
изменен метод .get(url), чтобы всегда использовать контекстный менеджер
изменен метод .get(url) для скрытого использования cdp.
... оператор with
больше не нужен..
todo: работа над асинхронизацией и селеном 4
Всякий раз, когда вы сталкиваетесь с испуганным
from session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
решение простое:
import undetected_chromedriver as uc
driver = uc . Chrome ( version_main = 95 )
Июль 2021 г.: в настоящее время занят внедрением Selenium 4 для undetected-chromedriver.
срочная новость: #255
Чтобы избежать ненужных волнений и поднятия проблем, обратите внимание на важное примечание в конце этого документа.
Буквально это все, что вам нужно сделать. Настройки включены, и исполняемый файл вашего браузера находится автоматически. Это также фрагмент, который я рекомендую использовать, если у вас возникнут проблемы.
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
Буквально это все, что вам нужно сделать. Если указанная папка не существует, создается НОВЫЙ профиль. Указанные таким образом каталоги данных не будут автоматически удалены при выходе.
import undetected_chromedriver as uc
options = uc . ChromeOptions ()
# setting profile
options . user_data_dir = "c: \ temp \ profile"
# use specific (older) version
driver = uc . Chrome (
options = options , version_main = 94
) # version_main allows to specify your chrome version instead of following chrome global version
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
Буквально это все, что вам нужно сделать. Теперь вы можете прослушать и подписаться на протокол devtools низкого уровня. Я только недавно узнал, что в будущем также планируется выпуск официального хромированного драйвера. Однако на данный момент я реализовал свой собственный. Так как мне это нужно было самому для расследования.