我一直在用Chromedriver测试Selenium,我注意到一些页面可以检测到你正在使用Selenium,即使根本没有自动化。甚至当我手动使用Chrome通过Selenium和Xephyr浏览时,我经常会看到一个页面说检测到可疑活动。我已经检查了我的用户代理和浏览器指纹,它们都与正常的Chrome浏览器完全相同。

当我在普通的Chrome浏览器中浏览这些网站时,一切都很好,但当我使用Selenium时,我被检测到。

理论上,chromedriver和Chrome在任何web服务器上看起来应该是完全一样的,但不知何故它们可以检测到它。

如果你想要一些测试代码,试试这个:

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=1, size=(1600, 902))
display.start()
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-extensions')
chrome_options.add_argument('--profile-directory=Default')
chrome_options.add_argument("--incognito")
chrome_options.add_argument("--disable-plugins-discovery");
chrome_options.add_argument("--start-maximized")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.delete_all_cookies()
driver.set_window_size(800,800)
driver.set_window_position(0,0)
print 'arguments done'
driver.get('http://stubhub.com')

如果你在stubhub周围浏览,你会在一两个请求内被重定向和“阻止”。我一直在研究这个问题,但我不知道他们是如何判断用户正在使用Selenium的。

他们是怎么做到的?

我在Firefox中安装了Selenium IDE插件,当我在普通的Firefox浏览器中只使用附加插件访问stubhub.com时,我被禁止了。

当我使用Fiddler查看来回发送的HTTP请求时,我注意到“假浏览器”的请求经常在响应头中有“无缓存”。

是否有一种方法可以从JavaScript检测我是否在Selenium Webdriver页面中?建议当你在使用网络驱动程序时没有办法检测。但这些证据表明情况并非如此。

该网站将指纹上传到他们的服务器上,但我检查了一下,Selenium的指纹与使用Chrome时的指纹是相同的。

这是他们发送到服务器上的指纹载荷之一:

{"appName":"Netscape","platform":"Linuxx86_64","cookies":1,"syslang":"en-US","userlang":"en-
US","cpu":"","productSub":"20030107","setTimeout":1,"setInterval":1,"plugins":
{"0":"ChromePDFViewer","1":"ShockwaveFlash","2":"WidevineContentDecryptionMo
dule","3":"NativeClient","4":"ChromePDFViewer"},"mimeTypes":
{"0":"application/pdf","1":"ShockwaveFlashapplication/x-shockwave-
flash","2":"FutureSplashPlayerapplication/futuresplash","3":"WidevineContent
DecryptionModuleapplication/x-ppapi-widevine-
cdm","4":"NativeClientExecutableapplication/x-
nacl","5":"PortableNativeClientExecutableapplication/x-
pnacl","6":"PortableDocumentFormatapplication/x-google-chrome-
pdf"},"screen":{"width":1600,"height":900,"colorDepth":24},"fonts":
{"0":"monospace","1":"DejaVuSerif","2":"Georgia","3":"DejaVuSans","4":"Trebu
chetMS","5":"Verdana","6":"AndaleMono","7":"DejaVuSansMono","8":"LiberationM
ono","9":"NimbusMonoL","10":"CourierNew","11":"Courier"}}

它在Selenium和Chrome中是相同的。

vpn只用于一次使用,但在加载第一个页面后就会被检测到。显然,正在运行一些JavaScript代码来检测Selenium。


当前回答

随着硒隐身的可用性,逃避硒驱动的ChromeDriver启动谷歌chrome浏览上下文的检测已经变得更加容易。


selenium-stealth

selenium-stealth是一个Python包,用于防止被探测。这个程序试图使python selenium更加隐秘。然而,目前硒隐身只支持硒铬。

目前硒隐身可以提供的特性:

具有隐身功能的硒隐身通过了所有公共机器人测试。 用硒隐身硒可以做到谷歌账号登录。 硒隐身有助于保持正常的reCAPTCHA v3评分


安装

硒隐身在PyPI上可用,因此您可以按照以下方式安装pip:

pip install selenium-stealth

Selenium4兼容代码

Code Block: 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("start-maximized") # Chrome is controlled by automated test software options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) s = Service('C:\\BrowserDrivers\\chromedriver.exe') driver = webdriver.Chrome(service=s, options=options) # Selenium Stealth settings stealth(driver, languages=["en-US", "en"], vendor="Google Inc.", platform="Win32", webgl_vendor="Intel Inc.", renderer="Intel Iris OpenGL Engine", fix_hairline=True, ) driver.get("https://bot.sannysoft.com/") Browser Screenshot:


Tl;博士

你可以在下面找到一些相关的详细讨论:

当你用chromedriver使用Selenium时,网站能检测到吗? 如何自动登录到一个网站,这是检测我的尝试登录使用硒隐身 未检测到的Chromedriver没有正确加载

其他回答

部分接口导航器{只读属性布尔webdriver;};

Navigator接口的webdriver IDL属性必须返回webdriver-active标志的值,初始值为false。

此属性允许网站确定用户代理受WebDriver控制,并可用于帮助减轻拒绝服务攻击。

直接摘自2017年W3C WebDriver编辑草案。这在很大程度上意味着,至少Selenium驱动程序的未来迭代将是可识别的,以防止误用。最终,如果没有源代码,就很难判断到底是什么原因导致chrome驱动程序被检测到。

答:是的

有些网站会通过浏览器的指纹和其他数据来检测硒,还有一些网站会根据行为来检测硒,不仅根据你做了什么,还根据你没有做什么。

通常用硒提供的数据就足以检测它。

你可以在像这样的网站上查看浏览器指纹

https://bot.sannysoft.com
https://fingerprintjs.github.io/fingerprintjs/
https://antoinevastel.com/bots/

尝试使用您的用户浏览器,然后尝试使用selenium,您将看到差异。

您可以使用options()更改一些指纹,如用户代理和其他,自己查看结果。

你可以尝试用很多方法来避免这种检测,我建议使用以下库:

https://github.com/ultrafunkamsterdam/undetected-chromedriver

import undetected_chromedriver.v2 as uc

否则你可以尝试使用硒的替代品。我听说过PhantomJS,但并没有尝试。

即使你发送了所有正确的数据(例如,Selenium没有显示为扩展,你有一个合理的分辨率/位深,等等),也有许多服务和工具可以分析访问者的行为,以确定参与者是用户还是自动化系统。

例如,访问一个网站,然后立即通过将鼠标直接移动到相关按钮上来执行一些操作,在不到一秒钟的时间内,这是用户实际上不会做的事情。

它也可能是一个有用的调试工具,使用网站,如https://panopticlick.eff.org/,以检查您的浏览器有多独特;它还将帮助您验证是否有任何特定的参数表明您正在运行Selenium。

替换cdc_ string

您可以使用Vim或Perl来替换chromedriver中的cdc_ string。查看@Erti-Chris Eelmaa的回答,了解更多关于字符串的信息,以及它是如何成为探测点的。

使用Vim或Perl可以避免重新编译源代码或使用十六进制编辑器。

在尝试编辑原始chromedriver之前,请确保复制它。

我们的目标是修改cdc_字符串,它看起来类似于$cdc_lasutopfhvcZLmcfl。

下面的方法在chromedriver版本2.41.578706上进行了测试。


使用Vim

vim /path/to/chromedriver

运行上面的代码行之后,您可能会看到一堆胡言乱语。做以下几点:

通过输入:%s/cdc_/dog_/g将cdc_的所有实例替换为dog_。 Dog_只是一个例子。你可以选择任何东西,只要它有相同数量的字符作为搜索字符串(例如,cdc_),否则chromedriver将失败。 要保存修改并退出,输入:wq!然后按回车键。 如果您需要在不保存更改的情况下退出,请键入:q!然后按回车键。


使用Perl

下面这行代码将所有cdc_事件替换为dog_。Vic Seedoubleyew:

perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver

确保替换字符串(例如,dog_)与搜索字符串(例如,cdc_)具有相同的字符数,否则chromedriver将失败。


结束

验证所有出现的cdc_已被替换:

grep "cdc_" /path/to/chromedriver

如果没有返回输出,则替换成功。

转到修改过的chromedriver,双击它。这时应该会打开一个终端窗口。如果您在输出中没有看到killed,那么您已经成功修改了驱动程序。

确保更改后的chromedriver二进制文件的名称为chromedriver,并且原始二进制文件要么从原始位置移动,要么重命名。


我使用这种方法的经验

我之前在尝试登录时在网站上被检测到,但在用相等大小的字符串替换cdc_后,我能够登录。就像其他人说的那样,如果你已经被检测到,即使使用了这种方法,你也可能会因为其他很多原因被屏蔽。因此,您可能需要尝试访问使用VPN、其他网络等检测您的站点。

我所看到的机器人检测似乎更复杂,或者至少与我在下面阅读的答案不同。

实验1

我从Python控制台用Selenium打开浏览器和网页。 鼠标已经在一个特定的位置,我知道一旦页面加载,就会出现一个链接。我从不移动鼠标。 我按一次鼠标左键(这对于将焦点从运行Python的控制台转移到浏览器是必要的)。 我再次按下鼠标左键(记住,光标在给定链接的上方)。 链接正常打开,就像它应该的那样。

实验2

像以前一样,我从Python控制台打开一个浏览器和带有Selenium的web页面。 这一次,我不再使用鼠标单击,而是使用Selenium(在Python控制台中)单击带有随机偏移量的同一元素。 链接没有打开,但我被带到一个注册页面。

影响

通过Selenium打开网页浏览器并不妨碍我看起来像人类 像人类一样移动鼠标并不一定要被归类为人类 通过Selenium点击带有偏移量的内容仍然会引起警报

这看起来很神秘,但我猜他们可以确定一个操作是否起源于Selenium,而他们并不关心浏览器本身是否是通过Selenium打开的。或者他们能确定窗口是否有焦点吗?如果有人有什么见解,我会很有趣。