当你用chromedriver使用Selenium时,网站能检测到吗?

我一直在用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时,我被禁止了。

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

是否有一种方法来检测I'm在硒Webdriver页面从JavaScript?< / >这样的结果表明,当你在使用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。

396946 次浏览

听起来他们就像是在网络应用防火墙后面。看看modsecurity和OWASP,看看它们是如何工作的。

实际上,您要问的是如何进行机器人检测逃避。这不是Selenium WebDriver的目的。它是用来测试你的web应用程序,而不影响其他web应用程序。这是可能的,但基本上,您必须查看WAF在其规则集中寻找什么,如果可以的话,特别避免使用selenium。即使这样,它仍然可能不起作用,因为您不知道他们使用的是什么WAF。

您做了正确的第一步,即伪造用户代理。如果这不能工作,那么WAF是合适的,你可能需要变得更棘手。

这一点来自其他答案。首先要确保正确地设置了用户代理。也许让它攻击本地网络服务器或嗅探流出的流量。

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

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

它还可以作为调试工具使用https://panopticlick.eff.org/之类的站点来检查您的浏览器有多独特;它还将帮助您验证是否有任何特定的参数表明您正在运行Selenium。

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

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

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

用下面的代码编写一个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>

尝试在Chrome的特定用户配置文件中使用Selenium。这样,您就可以作为特定用户使用它,并定义您想要的任何内容。当这样做时,它将作为“真正的”用户运行。用进程资源管理器查看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)

Chrome标签列表在这里

正如我们已经在问题和发布的答案中发现的那样,这里有一个名为“提炼Networks"的反网络抓取和机器人检测服务。而且,根据公司CEO的面试:

即使他们可以创造新的机器人,我们找到了一种识别的方法 硒是他们使用的一个工具,所以我们阻止硒不 不管他们在bot上迭代了多少次。我们现在正在做 使用Python和许多不同的技术。一旦我们发现了规律 从一种机器人中脱颖而出,然后我们对其进行逆向工程 他们使用的技术,并将其识别为恶意的

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

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

我决定把它作为一个答案,因为很明显:

当你用chromedriver使用selenium时,网站能检测到吗?

是的。


此外,我还没有尝试过较旧的Selenium和较旧的浏览器版本。从理论上讲,可以在某个特定的点上实现/添加一些东西到Selenium, Distil Networks机器人检测器目前依赖于这些东西。然后,如果是这种情况,我们可能会检测(是的,让我们检测检测器)在什么点/版本做出了相关的更改,查看更改日志和更改集,这可能会给我们更多的信息,关于在哪里查看以及他们使用什么来检测web驱动程序驱动的浏览器。这只是一个有待验证的理论。

在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 !+""

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

对于我来说,我使用Chrome浏览器,所以,所有我必须做的所做的是确保$cdc_不再作为文档变量存在,并且voilà(下载chromedriver源代码,修改chromedriver并在不同的名称下重新编译$cdc_)。

这是我在chromedriver中修改的函数:

文件# EYZ0:

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;
};

根据szx用户,也可以简单地在十六进制编辑器中打开chromedriver.exe,并手动进行替换,而无需实际进行任何编译。

# EYZ0

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

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

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

一些网站发现了这一点:

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

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

实验2

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

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

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

影响

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

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

替换cdc_字符串

您可以使用VimPerl来替换chromedriver中的cdc_字符串。# EYZ4。

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

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

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

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


使用Vim

vim /path/to/chromedriver

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

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

使用Perl

下面这行代码将所有出现的cdc_替换为dog_。归功于维克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、其他网络等检测您的站点。

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

但由于这是一个只有硒的问题,所以最好使用其他东西。硒应该让事情变得更容易,而不是更难。

混淆JavaScript结果

我已经检查了chromedriver源代码。这将向浏览器中注入一些JavaScript文件。
这个链接中的每个JavaScript文件都被注入到网页中: # EYZ0 < / p >

所以我使用反向工程和混淆十六进制编辑JavaScript文件。现在我确信不再使用JavaScript变量、函数名和固定字符串来揭示硒活动。但仍有一些站点和reCAPTCHA检测硒!

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

Chrome 'navigator'参数修改

我发现在“导航器”中有一些参数,简要地揭示使用chromedriver。

这些是参数:

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

所以我需要的是一个chrome扩展在网页上运行JavaScript。我使用文中提供的JavaScript代码创建了一个扩展,并使用另一篇文章将压缩后的扩展添加到我的项目中。# EYZ2

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

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

此外,Erti-Chris Eelmaa的伟大回答 -有讨厌的window.navigator.webdriver,它是只读的。即使您将它的值更改为false,它仍然会有true。这就是为什么由自动化软件驱动的浏览器仍然可以被检测到。

MDN

该变量在chrome中由--enable-automation标志管理。chromedriver启动Chrome, Chrome将window.navigator.webdriver设置为true。你可以找到在这里。您需要添加“排除切换”;国旗。例如():

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))
}

我还发现一些网站使用了一个检查用户代理的平台。如果该值包含:"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");

我发现改变JavaScript的“键”;这样的变量:

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

当使用Selenium WebDriver和谷歌Chrome时,可以在一些网站上使用,因为许多网站都会检查这个变量,以避免被Selenium刮擦。

你可以尝试使用参数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在没有任何hack的情况下根本不会阻塞。

想要了解更多信息,请看看这里:

硒webdriver:修改导航器。阻止硒检测的Webdriver标志

无法隐藏"Chrome正被自动化软件控制"Chrome v76

关于一个被控制的ChromeDriver驱动的网站,已经有很多分析和讨论。以下是我的观点:

根据文章使用用户代理进行浏览器检测为不同的浏览器提供不同的网页或服务通常不是最好的想法之一。无论用户使用哪种浏览器或设备,网络都应该对所有人开放。这里列出了开发网站的最佳实践,以便根据功能可用性而不是针对特定的浏览器逐步增强自己。

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

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

  • 无头Chrome用户代理中检测术语HeadlessChrome

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

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

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

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

然而,使用来检测浏览器看起来很简单,但实际上要做到这一点有点困难。

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


浏览器检测的注意事项

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

  • 试图解决一个特定的错误在某些特定的变种或特定版本的网络浏览器。
  • 试图检查某些浏览器还不支持的特定功能是否存在。
  • 尝试根据所使用的浏览器提供不同的HTML。

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

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

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

解决方案

为了防止驱动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()
    

您可以在方法改变谷歌Chrome用户代理在硒?中找到相关的详细讨论

  • 旋转UserAgent在每个测试使用Network.setUserAgentOverrideexecute_cdp_cmd()如下:

    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;"))
    

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

  • 修改webdriver的navigator财产值为undefined,如下所示:

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

您可以在Selenium webdriver:修改导航器。Webdriver标志,以防止硒检测中找到相关的详细讨论

  • 改变navigator.pluginsnavigator.languagesWebGL发际线的特性丢失的图像的值,等等。

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

您可以在如何绕过谷歌验证码与硒和python?中找到相关的详细讨论


处理reCAPTCHA

在处理而不是单击与文本我不是机器人相关联的时,提取和使用data-sitekey可能更容易获得身份验证。

您可以在如何识别ReCaptcha V2的32位数据-站点密钥,以编程方式使用Selenium和Python请求获得有效的响应?中找到相关的详细讨论


tl;博士

你可以找到一个先进的解决方案,以逃避网络驱动检测:

它适用于一些网站,从导航器中删除属性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;"
})

答:是的

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

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

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

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,但并没有尝试。

我也有同样的问题,用下面的配置解决了这个问题(用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);

随着< em > < >强硒隐形< /强> < / em >的可用性,逃避驱动ChromeDriver发起 浏览内容的检测变得更加容易。


selenium-stealth

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

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

  • selenium-stealth with stealth通过了所有公共机器人测试。

  • 用硒隐身硒可以做谷歌账号登录。

  • 硒隐身有助于维持正常的reCAPTCHA v3评分


安装

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

pip install selenium-stealth

兼容代码

  • < p >代码块:

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

bot_sannysoft_com


tl;博士

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

我所要做的就是

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

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

我目前正在运行的版本:

  • 操作系统:Windows 7 64位
  • win32上的Python 3.8.0 (tags/v3.8.0:fa919fd, 2019-10-14) (MSC v.1916 64位(AMD64))
  • 浏览器:Chrome版本100.0.4896.60(官方 李构建)(64位)< / >
  • 4.1.3硒
  • ChromeDriver 100.0.4896.60 chromedriver_win32.zip 930ff33ae8babeaa74e0dd1ce1dae7ff

Chromium开发人员最近在2021年添加了2日无头模式,不再HeadlessChrome添加到用户代理字符串中。看到# EYZ3

新的--headless=chrome标志将允许你在新的无头模式下获得Chrome的全部功能,你甚至可以在其中运行扩展。

用法:

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

这种新的无头模式使Chrome浏览器像普通模式一样工作,这意味着它们不像旧版无头模式的Chrome浏览器那样容易被检测到。

将其与其他工具(如undetected-chromedriver)结合使用,以最大限度地逃避硒检测。