彻底解决slenium无法解决识别的问题,以BET365为例,淘宝应该差不多(仅适用火狐,google虽然可行,但是有致命问题)

selenium的缺陷和常规修复方式

随着slenium被广泛使用,各个网站都知道怎么去识别slenium,什么webdriver,什么$cdc_那一串识别码等标识几十上百个,那么有没有一劳永逸的解决办法呢?

答案是: 起码bet365这样的网站不行 先说说slenium常规的一些解决方案

  1. 添加参数 – 实测,无效
options.addArguments("--disable-blink-features=AutomationControlled");
  1. 利用cdp指令注入js–实测,无效

Map<String, Object> parameters = new HashMap<>();
parameters.put("source", "Object.defineProperty(navigator, 'webdriver', {\n" +
                    "      get: () => undefined\n" +
                    "    })");
driver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", parameters);
  1. 利用google调试模式 --实测,可能有些网站可行,bet365不行

下述代码中: RuntimeUtil.exec --执行终端指令,这里封装了平台差异,linux/mac和windows的有不同运行方式

下述代码中:Util.getProjectRootPath() --这句代码只是获取项目跟目录,通过System获取

//启动google浏览器 并添加参数
RuntimeUtil.exec(betConfig.getCommand()+" --args --account-consistency --allow-cross-origin-auth-prompt " +
                "--allow-hidden-media-playback --remote-debugging-port=9222 " +
                "--always-authorize-plugins --disk-cache-dir=\""+Util.getProjectRootPath()+"/driver/google/cache/\""+
                " --user-data-dir=\"" + Util.getProjectRootPath() + "/driver/google/\"");
                options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
  1. 利用终端命令或notepad++ 修改googledriver

目的是替换下面那一串$cdc_asdjflasutopfhvcZLmcfl_字符

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];
  }
}

首先说明一下直接终端修改,会让驱动启动失败 起码我的m1 mac是这样,说是m1不一样

但是也有解决方案 就是使用Perl去修改,重点是要通过perl重新签名

perl -pi -e 's/cdc_/dog_/g' chromedrive
codesign --remove-signature chromedriver
codesign --force --deep -s - chromedriver

最终能达到的目的是,修改了上述那一串字符串之后,启动不会失败,但是最终还是无法绕过bet365的检测

playwright呢?

那么,其他框架呢?比如playwright

playwright我也测试过,我猜应该能绕过一些网站,但是遗憾的是bet365不行.能成功一次,但是刷新后就不行了,包括上述selenium的几种修改方式,也是能成功一次,页面刷新后就不行了

所以用上述方式皆不可行

思考

思考一下不可行的原因,皆是因为上述框架都需要借助第三方驱动,而第三方驱动已经被各个网站研究透了,有什么识别标志等等,如果还依靠他们去爬取或执行命令,将越来越难

所以,我就想是否有办法能跨过这些驱动,直接和浏览器通信?哈哈,没错!有!

就是浏览器扩展插件,比如大家用的google翻译、划词搜索等等皆是浏览器插件在发挥作用,那么我能不能开发一款框架,利用ws或者http通信与扩展插件交互,插件再与页面交互呢?我为有这样的思考感到激动,那么最终也终于如愿以偿,达到了我的目的!

浏览器插件的相关问题

  1. google致命缺陷–就是v3版本后台js服务无法常驻,v2版本是可以设置让后台js服务常驻的.为撒不降级到v2呢?因为2023年6年后,v2将不会支持,也就是说如果开发google v2,只能用到23年6月.而且v3也有一些解决方案可以解决此问题,但是我没有尝试,我换成了火狐…,有强迫患者可以去进行尝试下v3常驻问题的解决

  2. 内容页js中无法执行远程js,当然这也是google v3版本的问题,v2和火狐都可以执行,使用eval或者插件API都行.v3其实也行,加载一个库,就是硬加一个js代码的解释器,而不使用浏览器的,就是eval5,这个原本是给微信小程序用的,但是用到这里,也行

  3. 内容页操作dom是通过原生网页拷贝的副本,这是我的理解.也就是说原生网页在一个世界,内容页js在一个有缺陷平行世界,如果要在内容页获取原生dom的自定义属性,则无法获取…如果获取的是常规属性是可以获取的,比如value/class/textContent/innerHTML等等

  4. 但是如果dom.xxx 则无法读取和写入,通过上述2的方式,也就是通过执行js代码去获取也无法获取,有没有办法呢?有的,通过注入js文件到原网页,但是和网上搜索的方案不同,算是另辟蹊跷了

自定义框架

这个框架能做什么?

  1. 获取/打开/关闭/刷新tab选项卡

  2. 获取nodes(就是多个dom集)/获取单个node 包括他们的常规属性

  3. 点击dom

  4. 往input输入内容

  5. 执行js,一般用于获取非常规属性,主要是弥补上述问题中的第3点

其他的,比如键盘操作/鼠标的除去click的操作等未实现

框架开发目前已完成,还在测试中,后续会考虑放出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑い一刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值