当前位置: 首页 > 知识库问答 >
问题:

Selenium不能与修改以避免检测的chromedriver一起工作

岳玉堂
2023-03-14

我问这个问题是因为我知道这个线程和这个线程,还有关于同一主题的其他线程,但是每个人在第一个线程中转发的解决方案都不再起作用了。因此,请不要将此标记为关闭,因为第一个线程存在。答案来自2016年,你可以看到更多最近的评论有麻烦。

我在用硒做一些轻微的网刮。我正在与之交互的一个站点显然检测到我的浏览器是自动的(但奇怪的是,只要我也访问了我所在区域之外的站点的版本,我就只关心它,但这并不在这里也不在那里)。

第一个线程中的解决方案建议采取从这里下载的chromedriver并对其进行修改。它说要去掉“$cdc$”中的变量。所以我做了以下操作。从那个站点下载V2.41,解压它。这个版本允许我通过br=webdriver.Chrome('./chromedriver')与Selenium一起使用Chrome,但是有自动化检测问题。所以,我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

我在谷歌搜索和弄清楚这个状态码的意思时遇到了麻烦。事实上,我发现了这个没有回答的reddit线程,也有同样的问题。

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

我也想抢先一步:我几乎百分之百相信,它检测到我使用的是自动浏览器,因为它是自动的,而不是因为鼠标点击速度之类的东西。如果我用selenium启动浏览器,但然后手动执行其余的操作,仍然会导致问题。

编辑:我正在使用来自Ubuntu repos的Chrome v68,Google-Chrome-Stable。老实说,我不需要特别使用Chrome,但我找到的答案似乎围绕着它而不是火狐。

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

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

共有1个答案

湛骏祥
2023-03-14

没有必要再次重新编译它,除非您想构造具有某些特性的单独chrome。尝试将“$CDC_ASDJFLASUTOPFHVCZLMCFL_”更改为“$ABC_ASDJFLASUTOPFHVCZLMCFL_”。切记不要注意这一行,或者把它改成其他长度不同的变量名。由于编译后的文件对此比较敏感,可能会导致运行错误。

 类似资料:
  • 为了我的研究,我在firefox中做了一些源代码修改并自己构建。为了自动化测试,我选择使用Selenium,但不幸的是,我新构建的Firefox似乎不支持Selenium。 我做了以下工作: Firefox确实会打开并且响应迅速(我可以在搜索栏中输入一个网站)。但过了一段时间,python脚本崩溃,出现以下错误消息: 我在谷歌搜索了那个错误消息,并且大多数解决方案都建议我应该更新Selenium,

  • 问题内容: 我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量来检测selenium驱动的浏览器。 我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试修改后重新尝试编译selenium源,但似乎无法在存储库中的任何地方找到Navigat

  • 但它只在初始页加载后更新属性。我认为站点在我的脚本执行之前检测到了变量。

  • 问题内容: 我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量https://stackoverflow.com/a/41904453/648236来检测selenium驱动的浏览器。 我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试

  • 我开发了一个android应用程序,它有firebase电话号码认证。输入电话号码后,firbase通过短信发送验证OTP号码。所以我在我的应用程序中添加并允许SMS读取权限 现在根据Google Play策略,我们需要删除SMS读取权限,并实现SMS检索器API。

  • 根据它的Javadoc,将生成,其中的第一个值是subscribe和第一个next信号之间的经过时间。 以下测试不起作用 它将抛出异常: 我原以为经过的时间至少是1000ms,但结果只有11ms。