【发布时间】:2019-01-17 03:08:29
【问题描述】:
我问这个是因为我知道this thread 和this thread 以及其他关于同一主题的人,但是每个人在第一个线程中转发的解决方案不再有效。所以请不要将其标记为已关闭,因为第一个线程存在。答案来自 2016 年,您可以看到更多最近遇到的问题。
我正在使用 Selenium 进行一些轻型网络抓取。我正在与之交互的一个网站清楚地检测到我的浏览器是自动化的(但奇怪的是,只要我也在访问我所在区域之外的网站版本,但它既不在这里也不在那里)。
第一个线程中的解决方案建议使用下载的 chromedriver from here 并对其进行修改。它说要删除其中包含“$cdc$”的变量的提及。所以我执行以下操作。从该站点下载 v2.41,解压缩。此版本允许我通过 br = webdriver.Chrome('./chromedriver') 将 Chrome 与 Selenium 一起使用,但具有自动化检测问题。所以,我cp这个来修改chromedriver。
在 chromedriver-modified 中,我用 vim 打开它并搜索 $cdc。我在 1934 行左右的链接线程中发现了一个类似(但略有不同)的功能:
function getPageCache(opt_doc, opt_w3c) {
var doc = opt_doc || document;
var w3c = opt_w3c || false;
// var key = '$cdc_asdjflasutopfhvcZLmcfl_';
var key = 'xxxx_asdjflasutopfhvcZLmcfl_';
// var key = 'randomblahhh_';
if (w3c) {
if (!(key in doc))
doc[key] = new CacheWithUUID();
return doc[key];
} else {
if (!(key in doc))
doc[key] = new Cache();
return doc[key];
}
}
我尝试将这个变量替换为随机变量(randomblahhh_ var)和仅替换 $cdc 前 4 个字符的变量,因为我在该线程的 cmets 中看到了这两个建议(我不知道变量的某种格式在这里是否很重要。
两者都不起作用。我的意思是当我尝试使用chromedriver-modified 运行它时,webdriver 甚至都不会启动:
>>> from selenium import webdriver
>>> br = webdriver.Chrome(executable_path='./chromedriver-modified')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/selenium/webdriver/chrome/webdriver.py", line 68, in __init__
self.service.start()
File "/usr/lib/python3/dist-packages/selenium/webdriver/common/service.py", line 96, in start
self.assert_process_still_running()
File "/usr/lib/python3/dist-packages/selenium/webdriver/common/service.py", line 109, in assert_process_still_running
% (self.path, return_code)
selenium.common.exceptions.WebDriverException: Message: Service ./chromedriver-modified unexpectedly exited. Status code was: -11
我在谷歌上搜索并弄清楚此状态代码的含义时遇到了麻烦。事实上,我发现this unanswered reddit thread 有同样的问题。
第一个线程也提到了 $wdc 变量,但我在 chromedriver 中没有提到它们。
也只是为了抢占可能的建议:我几乎 100% 确信它会检测到我正在使用自动浏览器,因为它是自动的,不是因为鼠标点击速度或任何事物。如果我用 selenium 启动浏览器,然后手动完成其余的工作,它仍然会导致问题。
编辑:我正在使用来自 Ubuntu 存储库 google-chrome-stable 的 Chrome v68。老实说,我不需要专门使用 Chrome,但我找到的答案似乎围绕它而不是 Firefox。
edit2:最后一条评论——我在第一个链接线程中注意到有些人正在“重新编译”:
对我来说,我使用的是 chrome,所以,我所要做的就是确保 $cdc_ 不再作为文档变量存在,瞧(下载 chromedriver源码,修改chromedriver重新编译$cdc_ 用不同的名字。)
我不确定这意味着什么——他们是在重新编译 Chrome 本身吗?我所做的只是更改 chromedriver 文件中的变量。
【问题讨论】:
-
当然你需要在编辑完源代码后构建chromedriver
-
@CoreyGoldberg 感谢您的回复。我这里还是有点困惑——如果我编辑了什么 chromedrive 源代码,当我正常使用它时它是何时/何地构建的?
-
@CoreyGoldberg 我发现this thread 可能是正确的,但很明显,OP 是在询问构建 chromedriver,而答案是在谈论构建 chromium。
-
嘿@GrundleMoof,你有想过这个吗?我自己只找到了一次 $cdc 实例,没有 $wdc 密钥。也许之前的对话是关于旧版本的 chromedriver?我还听说,一旦你在黑名单上,你就不会摆脱它——即使你现在做的一切都是正确的。这可能是你撞到的墙吗?
-
我已更改 $cdc 但网站仍在检测中,我正在尝试 gosugamers.net
标签: python selenium selenium-webdriver selenium-chromedriver