我问这个是因为我知道 this thread和 this thread ,和其他关于同一主题的人,但每个人在第一个线程中转发的解决方案不再有效。所以请不要将其标记为已关闭,因为存在第一个线程。答案来自 2016 年,您可以看到更多最近的评论有问题。
我正在使用 Selenium 进行一些轻量级的网页抓取。我正在与之交互的一个网站清楚地检测到我的浏览器是自动化的(但奇怪的是,只要我也在访问我所在地区以外的网站版本,它才会关心,但这既不存在也不存在)。
第一个线程中的解决方案建议下载 chromedriver from here并修改它。它说要删除其中包含“$cdc$ 的变量的提及。所以我执行以下操作。从该站点下载 v2.41,解压缩它。这个版本允许我通过 br = webdriver 使用 Chrome 和 Selenium。 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)和仅替换 $cdc
前 4 个字符的变量来替换这个变量,因为我在该线程的评论中看到了这两个建议(我不知道变量的某种格式在这里是否重要。
两者都不起作用。我的意思是,当我尝试使用 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 存储库的 Chrome v68,google-chrome-stable。老实说,我不需要专门使用 Chrome,但我发现的答案似乎都围绕它而不是 Firefox。
edit2:最后一条评论——我在第一个链接的线程中注意到有些人正在“重新编译”:
For me, I used chrome, so, all that I had to do was to ensure that $cdc_ didn't exist anymore as document variable, and voila (download chromedriver source code, modify chromedriver and re-compile $cdc_ under different name.)
我不确定那是什么意思——他们是在重新编译 Chrome 本身吗?我所做的只是更改 chromedriver 文件中的变量。
最佳答案
没有必要重新编译它,除非你想构建具有某些特性的单独的 chrome。尝试将“$cdc_asdjflasutopfhvcZLmcfl_”更改为“$abc_asdjflasutopfhvcZLmcfl_”。切记不要注释此行或将其更改为其他长度不同的变量名。由于编译后的文件对此敏感,可能导致运行错误。
关于python - Selenium 不适用于为避免检测而修改的 chromedriver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51770608/