Selenium 不适用于为避免检测而修改的 chromedriver

Gru*_*oof 8 python selenium selenium-chromedriver selenium-webdriver

我问这个是因为我知道这个线程这个线程,以及其他关于同一主题的线程,但是每个人在第一个线程中转发的解决方案不再有效。所以请不要将其标记为关闭,因为第一个线程存在。答案是从 2016 年开始的,您可以看到更多最近出现问题的评论。

我正在使用 Selenium 进行一些轻微的网络抓取。我正在与之交互的一个站点清楚地检测到我的浏览器是自动化的(但奇怪的是,只要我还访问我所在地区以外的站点版本,我就在乎,但这既不存在也不存在)。

第一个线程中的解决方案建议使用从此处下载的 chromedriver并对其进行修改。它说要摆脱对其中带有“$cdc$ 的变量的提及。所以我执行以下操作。从该站点下载 v2.41,解压缩它。此版本允许我通过 将 Chrome 与 Selenium 一起使用br = webdriver.Chrome('./chromedriver'),但存在自动化检测问题. 所以,我cp这个来做chromedriver-modified。

在 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];
  }
}
Run Code Online (Sandbox Code Playgroud)

我试过用一些随机的东西(randomblahhh_var)和一些只替换前 4 个字符的东西来替换这个变量$cdc,因为我在那个线程的评论中看到了这两个建议(我不知道是否有某种格式变量在这里很重要。

两者都不起作用。我的意思是,当我尝试使用 运行它时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
Run Code Online (Sandbox Code Playgroud)

我在谷歌搜索和弄清楚这个状态代码的含义时遇到了麻烦。事实上,我发现这个未答复的 reddit 帖子有同样的问题。

第一个线程也提到了 $wdc 变量,但我发现在 chromedriver 中没有提到它们。

也只是为了抢占可能的建议:我几乎 100% 确信它检测到我正在使用自动浏览器,因为它是自动的,而不是因为鼠标点击速度或任何其他东西。如果我用 selenium 启动浏览器,然后手动完成其余的工作,它仍然会导致问题。

编辑:我正在使用来自 Ubuntu 存储库 google-chrome-stable 的 Chrome v68。老实说,我不需要专门使用 Chrome,但我发现的答案似乎围绕它而不是 Firefox。

编辑2:最后一条评论——我在第一个链接线程中注意到有些人正在“重新编译”:

对我来说,我使用了 chrome,所以,我所要做的就是确保 $cdc_ 不再作为文档变量存在,瞧(下载 chromedriver 源代码,修改 chromedriver 并以不同的名称重新编译 $cdc_。 )

我不确定这意味着什么——他们是在重新编译 Chrome 本身吗?我所做的就是更改 chromedriver 文件中的变量。

小智 2

除非你想构建具有某些功能的单独的chrome,否则没有必要再次重新编译它。尝试将其更改$cdc_asdjflasutopfhvcZLmcfl_$abc_asdjflasutopfhvcZLmcfl_.

记住不要记下这一行或将其更改为其他长度不同的变量名。由于编译后的文件对此敏感,可能会导致运行错误。