我问这个是因为我知道这个线程 and 这个线程,以及其他关于同一主题的问题,但每个人在第一个线程中转发的解决方案不再有效。因此,请不要将其标记为已关闭,因为第一个线程已存在。答案是 2016 年的,你可以看到最近的评论遇到了麻烦。
我正在使用 Selenium 进行一些简单的网络抓取。我正在与之交互的一个网站清楚地检测到我的浏览器是自动化的(但奇怪的是,只有当我还访问我所在区域之外的网站版本时才关心,但这既不在这里也不在那里)。
第一个线程中的解决方案建议下载 chromedriver从这里并修改它。它说要去掉其中包含“$cdc$”的变量。所以我执行以下操作。从该站点下载 v2.41,解压缩它。这个版本允许我通过 Selenium 使用 Chromebr = webdriver.Chrome('./chromedriver')
,但存在自动化检测问题。所以我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) 以及仅替换前 4 个字符的内容$cdc
一,因为我在该线程的评论中看到了建议(我不知道变量的某些格式在这里是否重要。
两者都不起作用。我的意思是当我尝试运行它时chromedriver-modified
,网络驱动程序甚至不会启动:
>>> 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
我在谷歌上搜索并弄清楚这个状态代码的含义时遇到了麻烦。事实上,我发现这个未回复的 Reddit 话题有同样的问题。
第一个线程还提到了 $wdc 变量,但我在 chromedriver 中没有发现它们。
只是为了抢占可能的建议:我几乎 100% 有信心它检测到我正在使用自动浏览器,因为它是自动化的,not因为诸如鼠标点击速度之类的东西。如果我使用 selenium 启动浏览器,然后手动执行其余操作,它仍然会导致问题。
编辑:我正在使用 Ubuntu 存储库中的 Chrome v68,google-chrome-stable。老实说,我不需要专门使用 Chrome,但我找到的答案似乎都是围绕它而不是 Firefox。
edit2:最后一条评论——我注意到在第一个链接的线程中有些人正在“重新编译”:
对我来说,我使用了 chrome,所以,我所要做的就是确保
$cdc_ 不再作为文档变量存在,瞧(下载
chromedriver源码,修改chromedriver并重新编译$cdc_
以不同的名字命名。)
我不确定这意味着什么——他们是在重新编译 Chrome 本身吗?我所做的只是更改 chromedriver 文件中的变量。