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
我将对问题跟踪器进行限制。它已经被滥用太久了。
有什么好消息吗?
是的,我已经打开了未检测到的讨论,我认为从长远来看这将帮助我们更好。
这个包不会,我再说一遍,不会隐藏您的 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
cleanup 删除了 compat、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 ,我可以在提出愚蠢问题时指出人们(不,它实际上很酷,每个人都应该看到它)
添加了对 lambda 平台的支持
添加了对 x86_32 的支持
添加了对报告为 linux2 的系统的支持
一些重构
use_subprocess 现在默认为 True。太多人不理解 multiprocessing 和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 操作系统上“欢迎屏幕”的烦人问题。对于那些喜欢欢迎屏幕并向谷歌提供更多数据的恋物癖者,请使用 Chrome(suppress_welcome=False)。
在构造函数中替换了executable_path
,以支持browser_executable_path
,除非您是边缘情况(是的,您是),无法将自定义chrome安装文件夹添加到PATH环境变量,或者拥有大量不同的浏览器/版本,否则不应使用该路径并且自动查找返回错误的浏览器
“v1”(?)暂时移至 _compat。
固定依赖版本
ChromeOptions 自定义处理已删除,因此它与webdriver.chromium.options.ChromiumOptions
兼容。
删除 Chrome.get() fu 并恢复到“几乎”原始状态:
with
语句,尽管为了向后兼容它仍然可以工作。迄今为止测试成功率:100%
只是再次提一下,因为有些人很难阅读: headless 仍然是 WIP。提出问题是没有必要的
将流程创建行为更改为完全分离
更改 .get(url) 方法以始终使用 contextmanager
更改了 .get(url) 方法以在后台使用 cdp。
... with
语句不再需要了..
todo:致力于异步化和 selenium 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 年 7 月:目前正忙于为 unDetected-chromedriver 实现 selenium 4
新闻快报:#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 协议。我最近才发现,官方 chromedriver 的未来版本也在计划中。不过我现在实现了自己的。因为我自己需要它来进行调查。