网站可以检测到您何时将 Selenium 与 chromedriver 一起使用吗?

Can a website detect when you are using Selenium with chromedriver?

提问人:Ryan Weinstein 提问时间:10/20/2015 最后编辑:Peter MortensenRyan Weinstein 更新时间:11/18/2023 访问量:456874

问:

我一直在用 Chromedriver 测试 Selenium,我注意到有些页面可以检测到您正在使用 Selenium,即使根本没有自动化。即使我只是通过 Selenium 和 Xephyr 使用 Chrome 手动浏览,我也经常收到一个页面,说检测到可疑活动。我已经检查了我的用户代理和我的浏览器指纹,它们都与普通的 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 页面中? 建议不应有办法检测何时使用 Web驱动程序。但这一证据表明并非如此。

该网站将指纹上传到他们的服务器,但我检查了一下,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。

JavaScript Python Google-Chrome 硒 硒 chromedriver 验证码 用户代理 2captcha recaptcha-v3 复选框 selenium4

评论

6赞 Mikko Ohtamaa 10/22/2015
@RyanWeinstein:这不是交通。我的猜测是 Selenium 需要公开一些可以在客户端 JavaScript 上检测到的 JavaScript 钩子。
7赞 Mikko Ohtamaa 10/22/2015
或者,如果它是流量,那么它就是一种流量模式......您浏览页面的速度太快。
8赞 Ryan Weinstein 10/22/2015
我的浏览速度不是太快。我只加载一个页面,并且通常使用鼠标和键盘浏览它。此外,Selenium需要公开钩子也没有意义,因为它实际上运行chrome.exe。它只是运行普通的 chrome,并允许您从中获取数据。还有其他想法吗?我在想也许这与饼干有关。这让我发疯了。
9赞 Learner 10/22/2015
本网站使用机器人检测技术,并使用来自不同 ips 的 CDN 提供内容,例如 , ,distillakamaitechnologies.com95.100.59.245104.70.243.6623.202.161.241
6赞 Brian Cain 10/24/2015
我在使用 Selenium 和 firefox 驱动程序时遇到了同样的问题。需要注意的有趣事情是,我正在通过 NAT 访问互联网的 VMWare 工作站虚拟机中运行 Selenium。主机能够访问 stubhub,而 VM 在使用 Selenium 时无法访问,甚至启动的浏览器实例 Selenium 也无法访问。我阻止了VM浏览器实例,stubhub仍然识别计算机并将其阻止。因此,它必须以某种方式执行浏览器和机器的指纹。

答:

7赞 Bassel Samman 10/24/2015 #1

听起来他们像是在 Web 应用程序防火墙后面。看看 modsecurity 和 OWASP 看看它们是如何工作的。

实际上,您要问的是如何进行机器人检测规避。这不是 Selenium WebDriver 的用途。它用于测试您的 Web 应用程序,而不会击中其他 Web 应用程序。这是可能的,但基本上,您必须查看 WAF 在其规则集中寻找的内容,如果可以的话,特别避免使用 selenium。即便如此,它可能仍然不起作用,因为您不知道他们正在使用什么 WAF。

您做了正确的第一步,即伪造用户代理。但是,如果这不起作用,那么 WAF 就已经到位,您可能需要变得更加棘手。

从其他答案中获取的观点。首先确保您的用户代理确实设置正确。也许让它击中本地 Web 服务器或嗅探流出的流量。

评论

0赞 Brian Cain 10/24/2015
我认为你走在正确的道路上。我用我的设置进行了测试,并将用户代理替换为一个有效的用户代理字符串,该字符串成功通过并收到相同的结果,stubhub阻止了该请求。
2赞 Bassel Samman 10/26/2015
这个话题非常广泛,我想说,如果你不理解它,你想理解它,这里不是正确的地方。从 owasp 开始。研究渗透测试和 Web 安全。另外,就像我之前说的,专门研究这个主题的 modsecurity 和 WAF。
1赞 Ryan Weinstein 10/27/2015
如果是HTTP标头问题,那么普通浏览器不会被阻止吗?HTTP 标头完全相同。另外,我用那个 github 链接到底在看什么?你试过用硒来上stubhub吗?有些事情非常非常不对劲。
1赞 Ryan Weinstein 10/28/2015
很抱歉造成混乱。我会调查的,如果你不想,你就不必再帮助我了。我的大部分经验都是在对系统应用程序进行编程,所以我不熟悉你所说的这些 modsecurity 规则。我会看一看并尝试教育自己。我不是想绕过任何东西,我只是想知道这些网站如何检测使用硒的用户。
2赞 Bassel Samman 10/28/2015
我也是一名开发人员:)。学习是我可以落后的事业。我不介意帮忙,我只是想明确表示,我不知道你的意图,也不能完全帮助你绕过他们的网站安全。不过,为了回答您的问题,他们检测到的不是硒。规则检测到可疑行为,并决定对违规客户采取适当措施。他们通过你没有做的事情而不是你正在做的事情来抓住你。在 repo 链接中,您可以签出此文件以获取 base_rules/modsecurity_crs_20_protocol_violations.conf 的想法
6赞 lfaraone 10/26/2015 #2

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

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

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

评论

4赞 Ryan Weinstein 10/26/2015
我已经使用过该网站,指纹与我的普通浏览器相同。此外,我没有自动化任何东西。我只是像往常一样浏览。
10赞 deamentiaemundi 10/28/2015 #3

据说Firefox在使用Web驱动程序时会设置。这是根据旧规范之一(例如:archive.org),但我在规范中找不到它,除了附录中的一些非常模糊的措辞。window.navigator.webdriver === true

对它的测试是在文件fingerprint_test.js的硒代码中,其中末尾的注释说“目前仅在 firefox 中实现”,但我无法通过一些简单的 ing 来识别该方向的任何代码,无论是在当前的 (41.0.2) Firefox 发布树中还是在 Chromium 树中。grep

我还发现了 2015 年 1 月在 firefox 驱动程序 b82512999938 中关于指纹识别的旧提交的评论。该代码仍在昨天下载的 Selenium GIT-master 中,并带有一条评论,链接到当前 w3c webdriver 规范中措辞略有不同的附录。javascript/firefox-driver/extension/content/server.js

评论

2赞 speedplane 10/3/2017
我刚刚用 Firefox 55 测试了 webdriver,我可以确认这不是真的。变量未定义。window.navigator.webdriver
2赞 speedplane 3/5/2019
更新:我用 Firefox 65 进行了测试,这是真的:window.navigator.webdriver == true
4赞 PC3TJ 10/28/2015 #4

使用以下代码编写 HTML 页面。您将看到在 DOM 中 selenium 在 outerHTML 中应用了一个 webdriver 属性:

<html>
<head>
  <script type="text/javascript">
  <!--
    function showWindow(){
      javascript:(alert(document.documentElement.outerHTML));
    }
  //-->
  </script>
</head>
<body>
  <form>
    <input type="button" value="Show outerHTML" onclick="showWindow()">
  </form>
</body>
</html>

评论

4赞 Louis 10/28/2015
该属性仅在 Firefox 中添加。
1赞 m3nda 6/13/2017
并且可以将其从控制浏览器的 selenium 扩展中删除。无论如何它都会起作用。
20赞 Kobi K 10/29/2015 #5

尝试将 Selenium 与 Chrome 的特定用户配置文件一起使用。这样,您就可以将其用作特定用户并定义所需的任何内容。执行此操作时,它将以“真实”用户身份运行。使用一些进程资源管理器查看 Chrome 进程,您会看到标签的区别。

例如:

username = os.getenv("USERNAME")
userProfile = "C:\\Users\\" + username +
    "\\AppData\\Local\\Google\\Chrome\\User Data\\Default"

options = webdriver.ChromeOptions()
options.add_argument("user-data-dir={}".format(userProfile))
# Add any tag here you want.
options.add_experimental_option(
    "excludeSwitches",
    """
        ignore-certificate-errors
        safebrowsing-disable-download-protection
        safebrowsing-disable-auto-update
        disable-client-side-phishing-detection
    """.split()
)
chromedriver = "C:\Python27\chromedriver\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)

谷歌浏览器标签列表在这里

149赞 alecxe 10/29/2015 #6

正如我们已经在问题和发布的答案中发现的那样,这里有一个反网络抓取和一个名为“Distil Networks”(现在是“Imperva”)的机器人检测服务。而且,根据公司首席执行官的采访

尽管他们可以创建新的机器人,但我们还是想出了一种方法来识别 Selenium 是他们正在使用的工具,所以我们阻止了 Selenium no 无论他们在该机器人上迭代多少次。我们现在正在这样做 使用 Python 和许多不同的技术。一旦我们看到一个模式 从一种类型的机器人中出现,然后我们努力对 他们使用的技术并将其识别为恶意技术。

要了解他们究竟是如何检测硒的,需要时间和额外的挑战,但目前我们可以肯定地说:

  • 它与您使用 Selenium 采取的操作无关。导航到该网站后,您会立即被检测到并被禁止。我试图在操作之间添加人为的随机延迟,在页面加载后暂停 - 没有任何帮助
  • 这也不是关于浏览器指纹。我在多个浏览器中尝试了它,具有干净的配置文件而不是隐身模式,但没有任何帮助
  • 因为,根据采访中的暗示,这是“逆向工程”,我怀疑这是通过浏览器中执行的一些 JavaScript 代码完成的,这表明这是一个通过 Selenium WebDriver 自动执行的浏览器

我决定将其作为答案发布,因为很明显:

网站可以检测到您何时将硒与 chromedriver 一起使用吗?

是的。


此外,我还没有尝试过较旧的 Selenium 和较旧的浏览器版本。从理论上讲,在Distil Networks机器人检测器目前所依赖的某个时间点上,可能会有一些东西被实现/添加到Selenium中。然后,如果是这种情况,我们可能会检测(是的,让我们检测检测器)在什么时间点/版本进行了相关更改,查看更改日志和更改集,也许,这可以为我们提供更多关于在哪里查看以及他们使用什么来检测 webdriver 驱动的浏览器的信息。这只是一个需要检验的理论。

评论

0赞 alecxe 10/30/2015
@RyanWeinstein,我们没有实际的证据,我们只能推测和测试。现在,我想说他们有办法使用硒来检测我们。尝试尝试硒版本 - 这可能会给你一些线索。
1赞 Elliott de Launay 1/13/2016
这是否与临时端口的确定方式有关?该方法远离众所周知的范围。github.com/SeleniumHQ/selenium/blob/......
12赞 Jeffery ThaGintoki 2/21/2017
Easyjet 正在使用 distilnetwork 服务,是的,它可以阻止虚拟机器人,但不能阻止复杂的机器人,因为我们已经测试了它,每天有来自不同 IP 的 2000 多个请求(我们再次重复使用“相同”地址),所以基本上每个 IP 每天有 5-10 个请求,从中我可以看出所有这些机器人检测服务都只是为了开发和销售大约 45% 的工作算法, 我们使用的刮板很容易检测到,我可以阻止它,而 destilnetworks、squareshield 和其他人则不能,这促使我从不使用它们中的任何一个。
3赞 hoozecn 9/13/2018
我认为他们正在 chrome webdriver 中检测 navigator.webdriver。我试图在 intoli.com/blog/not-possible-to-block-chrome-headless 和 stackoverflow.com/questions/47297877/ 的帮助下使 navigator.webdriver = false...。它返回机器人检测页面,而不是 distilnetworks.com/distil_identify_cookie.html
1赞 mirekphd 7/15/2023
此后,他们将自己重新命名为 Imperva
29赞 aianitro 9/12/2016 #7

如何在 wellsfargo.com 上实现的示例:

try {
 if (window.document.documentElement.getAttribute("webdriver")) return !+[]
} catch (IDLMrxxel) {}
try {
 if ("_Selenium_IDE_Recorder" in window) return !+""
} catch (KknKsUayS) {}
try {
 if ("__webdriver_script_fn" in document) return !+""

评论

20赞 ishandutta2007 8/23/2018
为什么最后一次尝试没有关闭?此外,你能解释一下你的答案吗?
261赞 Erti-Chris Eelmaa 12/19/2016 #8

基本上,Selenium 检测的工作方式是它们测试使用 Selenium 运行时出现的预定义 JavaScript 变量。机器人检测脚本通常在任何变量(在窗口对象上)中查找包含单词“selenium”/“webdriver”的任何内容,并记录名为 和 的变量。当然,所有这些都取决于您使用的浏览器。所有不同的浏览器都公开了不同的东西。$cdc_$wdc_

对我来说,我使用的是 Chrome,所以,我所要做的就是确保它不再作为文档变量存在,瞧(下载 chromedriver 源代码,修改 chromedriver 并以不同的名称重新编译。$cdc_$cdc_

这是我在chromedriver中修改的功能:

文件call_function.js

function getPageCache(opt_doc) {
  var doc = opt_doc || document;
  //var key = '$cdc_asdjflasutopfhvcZLmcfl_';
  var key = 'randomblabla_';
  if (!(key in doc))
    doc[key] = new Cache();
  return doc[key];
}

(注意注释。我所做的一切我都转向了。$cdc_randomblabla_

下面是伪代码,演示了机器人网络可能使用的一些技术:

runBotDetection = function () {
    var documentDetectionKeys = [
        "__webdriver_evaluate",
        "__selenium_evaluate",
        "__webdriver_script_function",
        "__webdriver_script_func",
        "__webdriver_script_fn",
        "__fxdriver_evaluate",
        "__driver_unwrapped",
        "__webdriver_unwrapped",
        "__driver_evaluate",
        "__selenium_unwrapped",
        "__fxdriver_unwrapped",
    ];

    var windowDetectionKeys = [
        "_phantom",
        "__nightmare",
        "_selenium",
        "callPhantom",
        "callSelenium",
        "_Selenium_IDE_Recorder",
    ];

    for (const windowDetectionKey in windowDetectionKeys) {
        const windowDetectionKeyValue = windowDetectionKeys[windowDetectionKey];
        if (window[windowDetectionKeyValue]) {
            return true;
        }
    };
    for (const documentDetectionKey in documentDetectionKeys) {
        const documentDetectionKeyValue = documentDetectionKeys[documentDetectionKey];
        if (window['document'][documentDetectionKeyValue]) {
            return true;
        }
    };

    for (const documentKey in window['document']) {
        if (documentKey.match(/\$[a-z]dc_/) && window['document'][documentKey]['cache_']) {
            return true;
        }
    }

    if (window['external'] && window['external'].toString() && (window['external'].toString()['indexOf']('Sequentum') != -1)) return true;

    if (window['document']['documentElement']['getAttribute']('selenium')) return true;
    if (window['document']['documentElement']['getAttribute']('webdriver')) return true;
    if (window['document']['documentElement']['getAttribute']('driver')) return true;

    return false;
};

根据答案,有多种方法可以删除它们。其中之一是简单地使用十六进制编辑器打开并删除所有出现的chromedriver.exe$cdc_

评论

46赞 Erti-Chris Eelmaa 12/20/2016
是的,它工作没有问题,请注意一个问题是,如果您在此更改之前落入“黑名单”,则很难摆脱。如果想摆脱现有的黑名单,需要实现假画布指纹识别、禁用 flash、更改 IP、更改请求头顺序(交换语言和 Accept 头)。一旦你落入黑名单,他们就有很好的措施来跟踪你,即使你改变了IP,即使你隐身打开了chrome,等等
13赞 szx 2/26/2018
我只是在十六进制编辑器中替换了 in,它起作用了!我还注意到,如果您最大化浏览器窗口(而不是使用预定义的大小),则检测它的频率会降低。$cdcxxxxchromedriver.exe
5赞 Nish 7/24/2018
这是在 Windows、OSX 还是 Linux 上?osx 上的十六进制编辑似乎不起作用。
9赞 Aymon Fournier 8/10/2018
使用 $zzz_zzzzzzzz_(相同数量的字符)进行十六进制编辑,但不起作用。
3赞 ishandutta2007 9/27/2019
@Erti-ChrisEelmaa 您是否知道任何无法检测到的开源分叉?
14赞 bryce 1/28/2017 #9

partial interface Navigator { readonly attribute boolean webdriver; };

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

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

直接摘自 2017 年 W3C 编辑的 WebDriver 草稿。这在很大程度上意味着,至少,Selenium驱动程序的未来迭代将是可识别的,以防止滥用。归根结底,如果没有源代码,很难说出究竟是什么原因导致了 chrome 驱动程序的可检测性。

评论

5赞 Corey Goldberg 11/28/2017
“没有源代码很难分辨”..好吧,源代码是免费提供的
8赞 bryce 3/20/2018
我的意思是没有相关网站的源代码。很难说他们在检查什么。
5赞 Nes 8/22/2017 #10

一些网站正在检测到这一点:

function d() {
try {
    if (window.document.$cdc_asdjflasutopfhvcZLmcfl_.cache_)
        return !0
} catch (e) {}

try {
    //if (window.document.documentElement.getAttribute(decodeURIComponent("%77%65%62%64%72%69%76%65%72")))
    if (window.document.documentElement.getAttribute("webdriver"))
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%53%65%6C%65%6E%69%75%6D%5F%49%44%45%5F%52%65%63%6F%72%64%65%72") in window)
    if ("_Selenium_IDE_Recorder" in window)
        return !0
} catch (e) {}

try {
    //if (decodeURIComponent("%5F%5F%77%65%62%64%72%69%76%65%72%5F%73%63%72%69%70%74%5F%66%6E") in document)
    if ("__webdriver_script_fn" in document)
        return !0
} catch (e) {}

评论

1赞 jerrypy 8/29/2017
这不适用于 Chrome 和 Firefox、selenium 3.5.0、ChromeDriver 2.31.488774、geckodriver 0.18.0
9赞 M3RS 4/12/2018 #11

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

实验 1

  1. 我从 Python 控制台使用 Selenium 打开浏览器和网页。
  2. 鼠标已经在特定位置,我知道一旦页面加载,就会出现一个链接。我从不移动鼠标。
  3. 我按了一下鼠标左键(这是从运行 Python 的控制台到浏览器的焦点所必需的)。
  4. 我再次按下鼠标左键(请记住,光标位于给定链接的上方)。
  5. 链接会正常打开,因为它应该打开。

实验 2

  1. 和以前一样,我从 Python 控制台打开带有 Selenium 的浏览器和网页。

  2. 这一次,我没有用鼠标单击,而是使用 Selenium(在 Python 控制台中)单击具有随机偏移量的相同元素。

  3. 链接没有打开,但我被带到了一个注册页面。

影响

  • 通过 Selenium 打开 Web 浏览器并不妨碍我看起来像人类
  • 像人类一样移动鼠标不一定是被归类为人类的必要条件
  • 通过带有偏移量的 Selenium 单击某些内容仍会发出警报

这似乎很神秘,但我想他们可以确定一个动作是否源自 Selenium,而他们并不关心浏览器本身是否是通过 Selenium 打开的。或者他们能否确定窗口是否有焦点?如果有人有任何见解,会很有趣。

评论

5赞 zeusalmighty 10/25/2018
我的信念是 Selenium 通过 javascript 将一些东西注入页面以查找和访问元素。我相信他们正在检测这种注射。
3赞 trixo 3/4/2020
你是对的,这个测试是 100% 有效的。我做过类似的测试,结果相同。我可以发送 Enter 选项卡或发送密钥。当我访问元素的那一刻,页面停止工作。因此,如果驱动程序将一些 javascript 注入浏览器。我们可以使用 chrome 扩展程序加密该 javascript,然后在下一页使用相同的扩展名进行解密。我将在几天后尝试查看它。
0赞 Nes 6/21/2020
你能提供一个链接来测试这种行为吗?我想研究此检测方法并创建旁路
0赞 Heartthrob_Rob 7/19/2020
我很想知道您是否可以在无头 chrome 中绕过它,因为这里支持扩展
0赞 V-cash 8/11/2021
它不是那样工作的。网站可以使用各种服务和方法来检测机器人。最好的方法是通过指纹检测硒。但还有很多其他的。
181赞 colossatr0n 8/31/2018 #12

替换cdc_字符串

你可以使用 VimPerl 来替换 .请参阅 @Erti-Chris Eelmaa 的答案,了解有关该字符串以及它如何成为检测点的更多信息cdc_chromedriver

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

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

我们的目标是改变字符串,它看起来像 .cdc_$cdc_lasutopfhvcZLmcfl

以下方法已在 上进行了测试。chromedriver version 2.41.578706


使用 Vim

vim -b /path/to/chromedriver

运行完上面的行后,您可能会看到一堆胡言乱语。执行以下操作:

  1. 通过键入 替换 的所有实例 。cdc_dog_:%s/cdc_/dog_/g
    • dog_只是一个例子。您可以选择任何内容,只要它与搜索字符串具有相同数量的字符(例如,),否则将失败。cdc_chromedriver
  2. 要保存更改并退出,请键入并按 。:wq!return
    • 如果需要退出而不保存更改,请键入并按 。:q!return

该选项预先告诉 vim 以二进制文件的形式打开文件,这样它就不会弄乱(缺少)行尾之类的东西(尤其是在文件末尾)。-b


使用 Perl

以下行将所有匹配项替换为 。感谢 Vic Seedoubleyewcdc_dog_

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

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


结束语

要验证是否已替换所有匹配项,请执行以下操作:cdc_

grep "cdc_" /path/to/chromedriver

如果未返回任何输出,则替换成功。

转到更改并双击它。终端窗口应打开。如果在输出中未看到,则表示已成功更改驱动程序。chromedriverkilled

确保更改的二进制文件的名称为 ,并且原始二进制文件已从其原始位置移动或重命名。chromedriverchromedriver


我对这种方法的经验

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

评论

1赞 colossatr0n 11/12/2018
@LekaBaper 感谢您的提醒。我使用的 chromedriver 版本是 2.41.578706 版。
3赞 Ahmed Memon 6/24/2019
即使我在不同网络上的新物理计算机上使用此 chromedriver.exe 修改也无法正常工作。
2赞 Walid Bousseta 7/22/2019
它给出一个错误说,这个版本不能在这个电脑上工作:(
10赞 Kodiologist 11/15/2019
请注意,chromedriver 人员已声明此问题无法修复,因此您可以预期必须无限期地使用分叉或编辑二进制文件。bugs.chromium.org/p/chromedriver/issues/detail?id=3220
4赞 openwonk 6/15/2020
顶级域名;在十六进制编辑器中打开二进制文件,将字符串开头的字符串更改为相同长度的其他字符串,然后保存并运行修改后的二进制文件。$cdc
5赞 pguardiario 12/2/2018 #13

在我看来,使用 Selenium 最简单的方法是拦截发回浏览器指纹的 XHR

但是,由于这是一个仅含硒的问题,因此最好只使用其他东西。Selenium应该让这样的事情变得更容易,而不是更难。

评论

0赞 Tai 12/4/2018
硒还有哪些其他选择?
2赞 pguardiario 12/4/2018
我想请求将是主要的 python 选项。如果您发送的请求与浏览器发送的请求完全相同,您将显示为普通浏览器。
0赞 V-cash 8/11/2021
实际上,如果目标网站使用 javascript 来执行您需要访问/执行的某些事情,则必须使用 selenium。否则,您应该使用 request,因为它要快得多。我认为问题是找到一些类似于硒的其他铬化机/解决方案。我听说过phantomJS,我会尝试的。
0赞 pguardiario 8/12/2021
@V-cash - 这些天我推荐 python 剧作家,欺骗请求变得越来越困难。
0赞 V-cash 8/25/2021
@pguardiario - 你的意思是你只使用 python,而没有 requests 模块吗?如果这是正确的,你怎么做?
25赞 ShayanKM 12/5/2018 #14

混淆 JavaScript 结果

我已经检查了 chromedriver 源代码。这会将一些 JavaScript 文件注入浏览器。
此链接中的每个 JavaScript 文件都注入到网页中:https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/js/

因此,我使用了逆向工程,并通过十六进制编辑对JavaScript文件进行了混淆。现在我确信不再使用 JavaScript 变量、函数名称和固定字符串来发现硒活性。但仍然有一些网站和 reCAPTCHA 检测到 Selenium!

也许他们会检查由 chromedriver JavaScript 执行引起的修改:)

Chrome“导航器”参数修改

我发现“navigator”中有一些参数可以简要地发现 chromedriver 的使用。

这些是参数:

  • “navigator.web驱动程序”在非自动模式下,它是“未定义的”。在自动模式下,这是“真的”。
  • “navigator.plugins”在无头 Chrome 中,它的长度为 0。所以我添加了一些假元素来愚弄插件长度检查过程。
  • "navigator.languages“设置为默认的 chrome 值 '[”en-US“, ”en“, ”es“]'。

因此,我需要的是一个在网页上运行 JavaScript 的 chrome 扩展程序。我使用文章中提供的 JavaScript 代码制作了一个扩展,并使用另一篇文章将压缩扩展添加到我的项目中。我已经成功地更改了值,但仍然没有任何变化!

我没有找到其他类似的变量,但这并不意味着它们不存在。仍然 reCAPTCHA 检测到 chromedriver,因此应该有更多的变量需要更改。下一步应该是对我不想做的检测器服务进行逆向工程。

现在我不确定是否值得在这个自动化流程上花费更多时间或寻找替代方法!

评论

0赞 Fandango68 5/11/2021
这是在可能通过十六进制编辑器删除$cdc条目之上吗?
10赞 FDG 1/28/2019 #15

除了 Erti-Chris Eelmaa 的精彩回答之外 - 很烦人,而且它是只读的。即使将它的值更改为 ,它仍然具有 。这就是为什么仍然可以检测到由自动化软件驱动的浏览器的原因。window.navigator.webdriverfalsetrue

MDN网络

该变量由 chrome 中的标志管理。chromedriver 会使用该标志启动 Chrome,Chrome 会将 .你可以在这里找到它。您需要将标志添加到“排除开关”中。例如(Go):--enable-automationwindow.navigator.webdrivertrue

package main

import (
    "github.com/tebeka/selenium"
    "github.com/tebeka/selenium/chrome"
)

func main() {

caps := selenium.Capabilities{
    "browserName": "chrome",
}

chromeCaps := chrome.Capabilities{
    Path:            "/path/to/chrome-binary",
    ExcludeSwitches: []string{"enable-automation"},
}
caps.AddChrome(chromeCaps)

wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", 4444))
}
9赞 Adi Ohana 4/3/2019 #16

我发现的另一件事是,一些网站使用检查用户代理的平台。如果值包含:“HeadlessChrome”,则使用无头模式时行为可能很奇怪。

解决方法是覆盖用户代理值,例如在 Java 中:

chromeOptions.addArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");
1赞 Juliagu 5/3/2019 #17

我发现像这样更改 JavaScript“键”变量:

//Fools the website into believing a human is navigating it
((JavascriptExecutor)driver).executeScript("window.key = \"blahblah\";");

当将 Selenium WebDriver 与 Google Chrome 一起使用时,适用于某些网站,因为许多网站会检查此变量以避免被 Selenium 抓取。

2赞 Serhii Matvienko 1/10/2020 #18

您可以尝试使用参数“enable-automation”

var options = new ChromeOptions();

// hide selenium
options.AddExcludedArguments(new List<string>() { "enable-automation" });

var driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options);

但是,我想警告一下,此功能已在 ChromeDriver 79.0.3945.16 中修复。 因此,您可能应该使用旧版本的 chrome。

此外,作为另一种选择,您可以尝试使用 InternetExplorerDriver 而不是 Chrome。至于我,IE在没有任何黑客攻击的情况下根本不会阻止。

有关更多信息,请尝试查看此处:

Selenium webdriver:修改 navigator.webdriver 标志以防止 selenium 检测

无法在 Chrome v76 中隐藏“Chrome 正在被自动化软件控制”信息栏

54赞 undetected Selenium 6/23/2020 #19

关于检测到由 Selenium 控制的 ChromeDriver 驱动的网站,已经进行了大量分析和讨论。这是我的两分钱:

根据文章,使用用户代理为不同的浏览器提供不同的网页或服务的浏览器检测通常不是最好的想法之一。网络旨在让每个人都可以访问,无论用户使用哪种浏览器或设备。有一些最佳实践可以开发一个网站,以根据功能可用性逐步增强自身,而不是针对特定的浏览器。

然而,浏览器和标准并不完美,仍然存在一些边缘情况,即某些网站仍然检测到浏览器,并且浏览器是否由 Selenium 控制的 WebDriver 驱动。可以通过不同的方式检测浏览器,一些常用的机制如下:

您可以在 recaptcha 3 如何知道我正在使用 selenium/chromedriver 中找到相关的详细讨论?

  • Headless Chrome UserAgent 中检测术语 HeadlessChrome

您可以在 Linux 上使用无头 Chrome 的访问被拒绝页面中找到相关的详细讨论,而有头的 Chrome 通过 Python 使用 Selenium 在 Windows 上工作

您可以在无法使用 Selenium 自动执行 Chase 站点登录中找到相关的详细讨论

  • 使用 AkamaiBot Manager 服务

您可以在使用 Selenium 和 Python 传递值时,动态下拉列表不会填充有关 https://www.nseindia.com/ 的自动建议中找到相关的详细讨论

  • 使用 Datadome 中的 Bot Protection 服务

您可以在使用 DataDome 的网站在使用 Selenium 和 Python 抓取时被验证码阻止中找到相关的详细讨论

但是,使用来检测浏览器看起来很简单,但实际上要做好它有点困难。

注意:在这一点上,值得一提的是:使用用户代理嗅探很少是一个好主意。总有更好、更广泛兼容的方法来解决某个问题。


浏览器检测的注意事项

检测浏览器背后的想法可以是以下任一:

  • 尝试解决某些特定变体或特定版本的 Web 浏览器中的特定错误。
  • 尝试检查是否存在某些浏览器尚不支持的特定功能。
  • 尝试根据所使用的浏览器提供不同的 HTML。

通过UserAgents进行浏览器检测的替代方案

浏览器检测的一些替代方法如下:

  • 实现测试以检测浏览器如何实现功能的 API,并从中确定如何使用它。一个例子是正则表达式中的 Chrome 未标记实验性后视支持。
  • 采用渐进式增强的设计技术,包括分层开发网站,使用自下而上的方法,从更简单的层开始,并在连续的层中改进网站的功能,每个都使用更多功能。
  • 采用自上而下的优雅降级方法,在这种方法中,我们使用我们想要的所有功能构建最好的网站,然后对其进行调整以使其在较旧的浏览器上运行。

溶液

为了防止检测到 Selenium 驱动的 WebDriver,利基方法将包括以下提到的方法之一/所有:

  • 使用fake_useragent模块在测试套件的每次执行中轮换 UserAgent,如下所示:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from fake_useragent import UserAgent
    
    options = Options()
    ua = UserAgent()
    userAgent = ua.random
    print(userAgent)
    options.add_argument(f'user-agent={userAgent}')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\ChromeDriver\chromedriver_win32\chromedriver.exe')
    driver.get("https://www.google.co.in")
    driver.quit()
    

您可以在 如何在 Selenium 中更改 Google Chrome 用户代理?

  • 使用 through execute_cdp_cmd() 在每个测试中轮换 UserAgent,如下所示:Network.setUserAgentOverride

    from selenium import webdriver
    
    driver = webdriver.Chrome(executable_path=r'C:\WebDrivers\chromedriver.exe')
    print(driver.execute_script("return navigator.userAgent;"))
    # Setting user agent as Chrome/83.0.4103.97
    driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'})
    print(driver.execute_script("return navigator.userAgent;"))
    

您可以在如何使用 Selenium 和 Python 更改用户代理中找到相关的详细讨论

  • 将 for webdriver 的属性值更改为 undefined,如下所示:navigator

    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
      "source": """
        Object.defineProperty(navigator, 'webdriver', {
          get: () => undefined
        })
      """
    })
    

您可以在 Selenium webdriver 中找到相关的详细讨论:修改 navigator.webdriver 标志以防止 selenium 检测

  • 更改 navigator.plugins、navigator.languagesWebGL发际线特征缺失图像等的值。

您可以在 是否有不可检测的 selenium webdriver 版本中找到相关的详细讨论?

您可以在 如何使用 Selenium 和 python 绕过 Google 验证码?


处理 reCAPTCHA

在处理 时,单击与文本 I'm not a robot 关联的,提取和使用 .data-sitekey

您可以在如何使用 Selenium 和 Python 请求以编程方式识别 ReCaptcha V2 的 32 位 data-sitekey 以编程方式获取有效响应中找到相关的详细讨论?


TL的;博士

您可以在以下方面找到一种尖端解决方案来规避 webdriver 检测:

评论

5赞 horaceT 12/29/2020
我在 bloomberg.com 上测试了您的 python 代码。仍然将我识别为机器人。
1赞 Adriendod 5/9/2022
将 webdriver 的 navigator 的属性值更改为 undefined 对我有用!
1赞 Smart Manoj 6/14/2022
过时了 stackoverflow.com/a/70133896
0赞 Zubair Khakwani 10/31/2022
您能否帮助解决此问题中提到的问题 stackoverflow.com/questions/74251814/...
15赞 Usman Gani 1/21/2021 #20

它适用于某些网站,请从导航器中删除属性 webdriver

from selenium import webdriver
driver = webdriver.Chrome()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source":
        "const newProto = navigator.__proto__;"
        "delete newProto.webdriver;"
        "navigator.__proto__ = newProto;"
    })
6赞 V-cash 8/11/2021 #21

答:是

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

通常,硒提供的数据足以检测到它。

您可以在此类网站中检查浏览器指纹

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

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

你可以用options()改变一些指纹,比如用户代理等,自己看结果。

你可以尝试通过多种方式避免这种检测,我建议使用这个库:undetected_chromedriver:

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

import undetected_chromedriver.v2 as uc

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

评论

0赞 grantr 10/9/2021
如果你看一下代码,你会看到他已经自动实现了这个线程中涵盖的所有方面,包括十六进制编辑 chromedriver。
0赞 V-cash 10/11/2021
我认为他没有尝试过无法检测到的 chromedriver 或使用硒的替代品。我最近学到的另一件事,我不知道我是否完全理解,但似乎 selenium 实际上不会进行点击,它“模拟”它们发出 HTTP 请求。这是检测硒的重要方法,因为人类会进行真正的点击
0赞 grantr 10/11/2021
这实际上很有趣 - 也许最好使用 javascript 执行来“点击”?沿着同一个线程,我注意到在一个站点上,特别是如果我使用 driver.refresh(),我会立即被标记。可能与您描述的机制相同?
1赞 V-cash 10/15/2021
在这种情况下,我不确定为什么会发生这种情况,但您可以将 cookie 保存到 pickle 文件中,然后再次加载 cookie,然后加载 driver.get(url) ,而不是使用 driver.refresh()。如果您对如何加载cookie有疑问,请查看此链接:https://stackoverflow.com/questions/15058462/how-to-save-and-load-cookies-using-python-selenium-webdriver
1赞 Herahadi An 10/16/2021 #22

我有同样的问题,并通过以下配置(在 C# 中)解决了问题

options.AddArguments("start-maximized");
options.AddArguments("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36");

options.AddExcludedArgument("enable-automation"); // For hiding chrome being controlled by automation..
options.AddAdditionalCapability("useAutomationExtension", false);

// Import cookies
options.AddArguments("user-data-dir=" + userDataDir);

options.AddArguments("profile-directory=" + profileDir);
31赞 undetected Selenium 11/27/2021 #23

随着 Selenium Stealth 的出现,逃避了 Selenium 驱动的 ChromeDriver 的检测,启动 浏览上下文变得更加容易。


硒隐形

selenium-stealth 是一个用于防止检测的 Python 包。这个程序试图使python硒更加隐蔽。但是,截至目前,selenium-stealth 仅支持 Selenium Chrome。

目前selenium-stealth可以提供的功能:

  • 带有隐身功能的 Selenium-Stealth 通过了所有公共机器人测试。

  • 使用 selenium-stealth selenium 可以做谷歌帐户登录。

  • selenium-stealth 有助于维持正常的 reCAPTCHA v3 分数


安装

Selenium-stealth 在 PyPI 上可用,因此您可以使用 pip 进行安装,如下所示:

pip install selenium-stealth

兼容代码

  • 代码块:

    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/")
    
  • 浏览器截图:

bot_sannysoft_com


TL的;博士

您可以在以下位置找到一些相关的详细讨论:

评论

0赞 Andreas L. 10/30/2022
这与未检测到的 chromedriver 相比如何?
2赞 Rahul Chauhan 2/16/2023
我尝试了这个解决方案,但对我不起作用。他们检测到我正在使用某个机器人
0赞 mirekphd 7/15/2023
可悲的是,它不再被积极维护(最后一次提交是从 2020 年开始的)。
0赞 undetected Selenium 7/15/2023
@mirekphd 同意:)写下这个答案的时间线,Chromium 团队自己也被震撼了;)
17赞 svinec 4/3/2022 #24

我所要做的就是:

my_options = webdriver.ChromeOptions()
my_options.add_argument( '--disable-blink-features=AutomationControlled' )

更多信息:这与网站 skyscanner.com 有关。过去,我已经能够刮掉它。是的,它确实检测到了浏览器自动化,并给了我一个验证码来按住按钮。我曾经能够手动完成验证码,然后搜索航班,然后抓取。但是这一次,在完成验证码后,我一次又一次地得到相同的验证码,似乎无法逃脱它。我尝试了一些最流行的建议来避免自动化被检测到,但它们不起作用。然后我找到了这篇文章,它确实有效,通过消除过程,我发现它只采用了上面的选项来绕过他们的浏览器自动化检测。现在我什至没有得到验证码,其他一切似乎都正常工作。

我当前运行的版本:

  • 操作系统: Windows 7 64 bit
  • Python 3.8.0 (tags/v3.8.0:fa919fd, 2019-10-14) (MSC v.1916 64 位 (AMD64)) on win32
  • 浏览器:Chrome版本100.0.4896.60(官方) Build) (64 位)
  • 硒 4.1.3
  • Chrome驱动程序 100.0.4896.60 chromedriver_win32.zip 930ff33ae8babeaa74e0dd1ce1dae7ff

评论

4赞 Michael Mintz 9/25/2022 #25

Chromium 开发人员最近在 2021 年添加了第二个无头模式,该模式不再添加到用户代理字符串中。查看 https://bugs.chromium.org/p/chromium/issues/detail?id=706008#c36HeadlessChrome

他们后来在 2023 年为 Chrome 109 重命名了该选项 -> https://github.com/chromium/chromium/commit/e9c516118e2e1923757ecb13e6d9fff36775d1f4

较新的标志现在将允许您在新的无头模式下获得 Chrome 的全部功能,您甚至可以在其中运行扩展程序,适用于 Chrome 109 及更高版本。(如果使用 Chrome 96 到 108,请使用较旧的选项。--headless=new--headless=chrome

用法:(Chrome 109 及更高版本):

options.add_argument("--headless=new")

用法:(Chrome 96 到 Chrome 108):

options.add_argument("--headless=chrome")

这种新的无头模式使 Chromium 浏览器的工作方式与常规模式一样,这意味着它们不会像旧无头模式下的 Chrome 那样容易被检测到。

将其与其他工具(例如未检测到的 chromedriver)结合使用,以最大限度地规避 Selenium 检测。


您还可以使用 SeleniumBase 提供的反检测机制:

pip install seleniumbase,然后使用以下命令运行:python

from seleniumbase import Driver
import time

driver = Driver(uc=True)
driver.get("https://nowsecure.nl/#relax")
time.sleep(6)
driver.quit()

此脚本绕过通常会阻止 selenium 的站点上的检测。

SeleniumBase 也有其他格式和自己的 API:

from seleniumbase import SB

with SB(uc=True) as sb:
    sb.open("https://nowsecure.nl/#relax")
    sb.sleep(3)
    if not sb.is_text_visible("OH YEAH, you passed!", "h1"):
        sb.get_new_driver(undetectable=True)
        sb.open("https://nowsecure.nl/#relax")
        sb.sleep(3)
    sb.assert_text("OH YEAH, you passed!", "h1", timeout=3)

(这是一个绕过 Cloudflare 检测的示例脚本,就像上面的脚本一样。

0赞 puchu 5/12/2023 #26

可以使您的 Web 浏览器和驱动程序不可见。但你需要明白,web浏览器和驱动开发者总是承受着很大的压力:总部想要合法,所以他们接受特殊的检测机制。因此,您永远不会从包装盒中收到隐形浏览器和驱动程序。解决方案如下:

  1. 您应该通过删除所有可以透明的内容来修补 Web 浏览器、驱动程序和 selenium 本身。
  2. 不要与任何人分享您的补丁。如果您要发布补丁,它们将被新的检测机制击败。
  3. 您应该实现自动测试,以比较普通浏览器环境和修补的浏览器 + 驱动程序环境。从任何可能的角度来看,它都应该是相同的。不要发布测试。
  4. 您应该通过迁移到下一个版本的 Web 浏览器、驱动程序和 selenium 来维护您的补丁。
  5. 当测试失败时,您应该维护您的测试并更新补丁。

是否可以保护您的网站免受机器人的侵害?一般来说,是的,但唯一好的解决方案是验证码。不尊重、环境、独特的行为等。请不要指望补丁会是毛茸茸的玩具,如、等。navigatorjseventundetected-chromedriverselenium-stealth

您应该始终记住,检测意味着您想要来自客户端未知应用程序的某些内容。客户可以通过修补自己的应用程序来删除所有内容,您不知道他(或他的员工)对 Web 浏览器和驱动程序源代码了解多少。如果他的员工参与了开源 Web 浏览器开发,你就没有机会发现他。

举个例子(这个问题中提到的东西):

  1. navigator.web驱动程序
  2. cdc_
  3. 无头Chrome
  4. 语言
  5. __webdriver

此列表中的所有内容都可以在 5 分钟内隐藏/删除,但还有更多其他副作用可能会背叛机器人。