【问题标题】:Selenium does not work with a chromedriver modified to avoid detectionSelenium 不适用于为避免检测而修改的 chromedriver
【发布时间】:2019-01-17 03:08:29
【问题描述】:

我问这个是因为我知道this threadthis 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


【解决方案1】:

除非您想构建具有某些功能的单个 chrome,否则无需再次重新编译它。尝试将“$cdc_asdjflasutopfhvcZLmcfl_”更改为“$abc_asdjflasutopfhvcZLmcfl_”。切记不要注意这一行或将其更改为具有不同长度的其他变量名称。由于编译后的文件对此比较敏感,可能会导致运行出错。

【讨论】:

  • 这是正确的。保留$标记,不要改变key的长度,就可以了
猜你喜欢
  • 2018-09-27
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
相关资源
最近更新 更多