selenium的缺陷和常规修复方式
随着slenium被广泛使用,各个网站都知道怎么去识别slenium,什么webdriver,什么$cdc_那一串识别码等标识几十上百个,那么有没有一劳永逸的解决办法呢?
答案是: 起码bet365这样的网站不行 先说说slenium常规的一些解决方案
- 添加参数 – 实测,无效
options.addArguments("--disable-blink-features=AutomationControlled");
- 利用cdp指令注入js–实测,无效
Map<String, Object> parameters = new HashMap<>();
parameters.put("source", "Object.defineProperty(navigator, 'webdriver', {\n" +
" get: () => undefined\n" +
" })");
driver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", parameters);
- 利用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");
- 利用终端命令或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通信与扩展插件交互,插件再与页面交互呢?我为有这样的思考感到激动,那么最终也终于如愿以偿,达到了我的目的!
浏览器插件的相关问题
-
google致命缺陷–就是v3版本后台js服务无法常驻,v2版本是可以设置让后台js服务常驻的.为撒不降级到v2呢?因为2023年6年后,v2将不会支持,也就是说如果开发google v2,只能用到23年6月.而且v3也有一些解决方案可以解决此问题,但是我没有尝试,我换成了火狐…,有强迫患者可以去进行尝试下v3常驻问题的解决
-
内容页js中无法执行远程js,当然这也是google v3版本的问题,v2和火狐都可以执行,使用eval或者插件API都行.v3其实也行,加载一个库,就是硬加一个js代码的解释器,而不使用浏览器的,就是eval5,这个原本是给微信小程序用的,但是用到这里,也行
-
内容页操作dom是通过原生网页拷贝的副本,这是我的理解.也就是说原生网页在一个世界,内容页js在一个有缺陷平行世界,如果要在内容页获取原生dom的自定义属性,则无法获取…如果获取的是常规属性是可以获取的,比如value/class/textContent/innerHTML等等
-
但是如果dom.xxx 则无法读取和写入,通过上述2的方式,也就是通过执行js代码去获取也无法获取,有没有办法呢?有的,通过注入js文件到原网页,但是和网上搜索的方案不同,算是另辟蹊跷了
自定义框架
这个框架能做什么?
-
获取/打开/关闭/刷新tab选项卡
-
获取nodes(就是多个dom集)/获取单个node 包括他们的常规属性
-
点击dom
-
往input输入内容
-
执行js,一般用于获取非常规属性,主要是弥补上述问题中的第3点
…
其他的,比如键盘操作/鼠标的除去click的操作等未实现
框架开发目前已完成,还在测试中,后续会考虑放出