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

标签 python selenium selenium-webdriver selenium-chromedriver

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

相关文章:

python - 如何遍历字母和数字

java.lang.NoSuchMethodError : cucumber. 运行时.Runtime

java - 如何从元素 : after it's in a div with Selenium? 获取内容

java - 如何在selenium webdriver中选择 'mat-checkbox'?

python - for 循环存储旧变量值?

python - 确认浏览器预取导致删除

c# - CSS 选择器 - 获取了解元素子元素的元素

java - 在maven中编译问题

css - 用 htmlunit 驱动替换 firefox 驱动

python - 一种更新 pandas DataFrames 中单元格的干净而有效的方法