Selenium 无法与经过修改以避免检测的 chromedriver 一起使用

2023-11-26

我问这个是因为我知道这个线程 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 文件中的变量。


Removal

有多种方法可用

1. 使用chrome 开发者协议 with Page.removeScriptToEvaluateOnNewDocumentSelenium-配置文件

With Python

# driver allready initialized here

driver.execute_cdp_cmd("Page.removeScriptToEvaluateOnNewDocument", {"identifier":"1"})

see docs对于其他编程语言

2. 使用chrome 开发者协议 with Page.addScriptToEvaluateOnNewDocument使用来自的脚本未检测到的 chromedriver

With Python

# driver allready initialized here

js = """
    let objectToInspect = window,
    result = [];
    while(objectToInspect !== null)
        { result = result.concat(Object.getOwnPropertyNames(objectToInspect));
        objectToInspect = Object.getPrototypeOf(objectToInspect); }
    result.forEach(p => p.match(/.+_.+_(Array|Promise|Symbol)/ig)
        &&delete window[p]&&console.log('removed',p))
"""
driver.execute_cdp_cmd("Page.removeScriptToEvaluateOnNewDocument", {"source":js})

请注意,这一点可能是可检测到的。

3. By patching编译后的 chromedriver。

意思只是删除所有出现的cdc_* 在 chromedriver-binary 中:)

For a Python脚本,参见未检测到的_chromedriver/patcher.py

Details

The window.cdc_adoQpoasnfa76pfcZLmcfl_Xxxxx 变量添加自铬驱动程序 on 每一个新页面使用使用使用chrome 开发者协议 with Page.addScriptToEvaluateOnNewDocument与脚本:

(function () {
    window.cdc_adoQpoasnfa76pfcZLmcfl_Array = window.Array;
    window.cdc_adoQpoasnfa76pfcZLmcfl_Object = window.Object;
    window.cdc_adoQpoasnfa76pfcZLmcfl_Promise = window.Promise;
    window.cdc_adoQpoasnfa76pfcZLmcfl_Proxy = window.Proxy;
    window.cdc_adoQpoasnfa76pfcZLmcfl_Symbol = window.Symbol;
}) ();

幸运的是,它总是第一个脚本==>identifier="1"。这也是,为什么1.method works.

他们似乎是硬编码的进入 chromedriver并用于制作 Shure,该 chromedriver 仍然可以工作,以防 javascript 属性被覆盖code

注:我是开发者Selenium-配置文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium 无法与经过修改以避免检测的 chromedriver 一起使用 的相关文章

随机推荐

  • 使用 z3 获得“良好”的 unsat 核心(逻辑 QF_BV)

    我正在使用 Z3 SMT 求解器来解决我使用 SMTLIB 2 语言在逻辑 QF BV 中表达的问题 该模型是不可满足的 我正在尝试让求解器产生一个不满足的核心 我的模型由几个 强制 约束组成 我使用assert声明 我希望考虑用于 uns
  • Java 15 的密封类功能中的最终类和非密封类有什么区别?

    我有以下密封接口 Java 15 public sealed interface Animal permits Cat Duck String makeSound 该接口由2个类实现 public final class Cat imple
  • iPad 上的 jQuery 鼠标悬停

    我有一个 jQuery 代码 可以在桌面浏览器上完美运行 span checkbox err mouseout function span checkbox err fadeOut slow 但同样的情况不会在 iPad 上触发 因此 ch
  • 您首选的 php 部署策略是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在开始一个 PHP 的
  • @property(非原子,retain)语句在应用程序中的用途是什么?

    我是一名初学者 iphone 开发人员 我想知道 property nonatomic retain 语句的用途是什么 例如 任何人都可以给我任何答案吗 财产告诉 Objective C 为该成员变量生成 getter 和 setter 合
  • 无限循环滑块概念

    我想知道使用 JavaScript jQuery 为网站构建无限图像循环滑块的最佳概念是什么 良好的可读代码 害虫实践代码 可重用性 我不知道如何编码幻灯片放映 但什么蓝图符合上述要求 我的问题的主要焦点是如何排列图片以获得无限循环滑块的印
  • onActivityResult() 在新的嵌套片段 API 中未调用

    我一直在用新的嵌套片段Android 包含在支持库中的 API 我面对嵌套片段的问题是 如果一个嵌套片段 即 通过FragmentManager由返回getChildFragmentManager calls startActivityFo
  • 如何在 Android 中使用 Java 和 org.json 迭代这个 JSON 数组?

    我的 JSON 字符串看起来像这样 包含在名为的字符串变量中 sJSON id 284 name John surname Doe name Jane surname Doe 我能够像这样解析第一个数组 使用 Java 并导入 org js
  • Magento - 如何检索捆绑的选项图像

    我一直在致力于我的第一个 magento 部署 建立了一个非常定制的主题 现在解决一些非标准定制 我的主要产品类型之一是办公椅 我将其设置为捆绑产品 此产品类型有许多选项 大约 100 种面料选项 手臂样式 腰部 头枕等 我需要能够在目录
  • 为什么我不能在 `const filter_view` 上调用 `ranges::begin` ? [复制]

    这个问题在这里已经有答案了 我无法打电话ranges begin on a const filter view https en cppreference com w cpp ranges filter view the begin and
  • Gradle 将 Spring Boot 应用程序构建为具有活动配置文件的战争

    我想将我的 Spring Boot 应用程序打包为war对于特定的配置文件 这可以通过设置 spring profiles active 来完成个人资料名称在 application properties 文件中 是否可以在构建战争时将其设
  • jQuery Mobile 面板宽度

    在新的 jQuery mobile 中 有一个新的面板选项 我已经实现了这个并且它有效 但我想自定义面板的宽度 标准宽度是272px 对于我的使用来说有点多了 我尝试过使用 ui panel width 150px CSS 选择器 但这只是
  • PHP isset() 在 C/C++ 中的对应部分

    PHP 有一个非常好的函数 isset variableName 它检查 variableName 是否已在程序中定义 我们可以为 C C 构建类似的功能 某种符号表查找 吗 我是一名 C 人员 但我记得在 PHP 中 isset 用于检查
  • objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗?

    我正在研究向所有属性添加属性 在本例中为整数 的方法UIView实例 无论它们是否是子类 正在使用objc setAssociatedObject and objc getAssociatedObject 在一个类别中 有什么合适的 苹果认
  • 是什么让 STL 如此快速? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 如果按照通常实现的方式实现
  • 将图像从笛卡尔坐标转换为极坐标

    我正在尝试将具有相同中心的许多圆圈的图像从笛卡尔转换为极坐标 以便新图像将是圆圈 但线条而不是圆圈 请参见下图 并且使用效果很好下面的代码 r c size img r floor r 2 c floor c 2 X Y meshgrid
  • 为什么 System.out.println 这么慢?

    这是所有编程语言的共同点吗 执行多次打印后跟 println 似乎更快 但将所有内容移动到字符串并仅打印似乎最快 为什么 编辑 例如 Java 可以在不到一秒的时间内找到 100 万以内的所有素数 但是在自己的 println 上打印出所有
  • 在 Swift 中的 UIView 中查找 UILabel

    我试图在 UIViewControllers 的超级视图中找到我的 UILabels 这是我的代码 func watch startTime String endTime String if superview nil println Ni
  • Django:如何在javascript中访问当前登录用户的id?

    我在视图集中定义了 get queryset 方法 class BooksViewSet ReadOnlyModelViewSet serializer class BooksSerializer permission classes Is
  • Selenium 无法与经过修改以避免检测的 chromedriver 一起使用

    我问这个是因为我知道这个线程 and 这个线程 以及其他关于同一主题的问题 但每个人在第一个线程中转发的解决方案不再有效 因此 请不要将其标记为已关闭 因为第一个线程已存在 答案是 2016 年的 你可以看到最近的评论遇到了麻烦 我正在使用