【发布时间】:2019-05-22 02:02:15
【问题描述】:
我一直在用 Chromedriver 测试 Selenium,我注意到有些页面可以检测到您正在使用 Selenium,即使根本没有自动化。即使我只是通过 Selenium 和 Xephyr 使用 Chrome 手动浏览,我也经常得到一个页面,说检测到可疑活动。我检查了我的用户代理和浏览器指纹,它们都与普通的 Chrome 浏览器完全相同。
当我在普通 Chrome 中浏览这些网站时,一切正常,但在我使用 Selenium 的那一刻,我就被检测到了。
理论上,chromedriver 和 Chrome 在任何网络服务器上看起来应该完全一样,但它们可以通过某种方式检测到它。
如果你想要一些测试代码试试这个:
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 请求时,我注意到“假浏览器”请求通常在响应标头中包含“无缓存”。
这样的结果 Is there a way to detect that I'm in a Selenium Webdriver page from JavaScript 表明应该无法检测到您何时使用网络驱动程序。但这一证据表明并非如此。
该网站将指纹上传到他们的服务器,但我检查了 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。
【问题讨论】:
-
@RyanWeinstein:不是流量。我的猜测是 Selenium 需要公开一些 JavaScript 钩子,这些钩子可以在客户端 JavaScript 上检测到。
-
或者如果是流量,那就是流量模式……你浏览页面太快了。
-
我浏览的速度不是太快。我只加载一个页面,并使用鼠标和键盘正常浏览它。 Selenium 需要暴露钩子也没有任何意义,因为它实际上是在运行 chrome.exe。它只是运行普通的 chrome 并允许您从中获取数据。还有其他想法吗?我在想也许它与饼干有关。这让我发疯了。
-
该站点使用
distillbot 检测技术,并使用akamaitechnologies.comCDN 从不同的ips 提供内容,例如95.100.59.245,104.70.243.66,23.202.161.241 -
我在使用 Selenium 和 firefox 驱动程序时遇到了同样的问题。值得注意的是,我在通过 NAT 访问 Internet 的 VMWare 工作站虚拟机中运行 Selenium。宿主机可以访问 stubhub,而 VM 在使用 Selenium 时无法访问,甚至浏览器实例 Selenium 启动时也无法访问。我已经阻止了 VM 浏览器实例,并且 stubhub 仍然可以识别机器并将其阻止。所以它必须以某种方式执行浏览器和机器的指纹。
标签: javascript python google-chrome selenium selenium-chromedriver