Electron + selenium-webdriver
多语言翻译比较容易想到的两种思路:
第一种是通过公共的 api 接口比如百度翻译,优点是速度快,缺点是无法预防接口变更和一些官方的反爬虫手段,观察百度翻译的首页,如果使用爬虫,可以通过大量 id 实现定位,标签类名的语义也很强,可以方便地通过脚本批量翻译。
当然也可以采用模拟浏览器操作的方式,这里使用 https://translate.google.cn/ 作为翻译入口,观察其页面样式可以知道它对爬虫并不友好,而且谷歌翻译也没有提供对应的公共接口,采用 webselenium 来实现多语言翻译可以增加一些挑战性,和第一种方式对比可以发现其优点是无需破解其接口和加密方式,只需要模拟人工操作就可,这意味着其可以免疫大部分反爬虫手段,缺点是生成速度不是特别快。
GUI 部分采用 Electron 来完成界面上的拖拽框和 语言多选部分,Electron 基于 html + css 的方式搭建页面;
功能部分采用 webselenium 库来实现模拟浏览器的功能,几乎各种语言都有类似的库的实现(Java,Python, C#,Nodejs。。。)。
1.使用上通过拖动对应 json 文件进入对应提示框,就可以启动翻译。
2.使用了进度条来提示翻译进度
完成了界面和功能就可以进行软件测试了,如果人工操作你会发现每条词条的实际长度几乎影响最终翻译结果的生成速度,因此可以通过简单的短词来测试翻译速度。因此先通过代码随机生成100条数据生成一个 json 文件:
然后选中两种语言后,将对应 json 文件拖入框内,生成最终结果:
英语:
索马里语:
每个json文件生成时间在15秒左右。
如果使用 谷歌翻译 需要注意的地方是:
1.css采用类名混淆
和百度翻译不同,谷歌翻译的类名是混淆过的,类似 webpack 等打包工具的结果,也就是说下次如果官网页重新部署,同一位置的标签类名变更,整个工具就会失效,因此可通过标签层级和选中特定标签名的方式来实现标签定位。
2.动态生成的翻译结果
由于翻译结果是通过动态生成的标签包裹加载到网页内的,在保证最大速度批翻的前提,借住 webselenium 可以通过监听对应标签的加载来实现翻译完成触发,具体 api 为 until.elementLocated;