浅析Python谷歌翻译库的核心

随着现在谷歌翻译的准确度越来越高,大部分人们不约而同的选择了谷歌翻译。对于Python而言,现在的googletrans可谓是使用的很顺心。对于googletrans这个库的client文件中的Translator类的translate方法,我在此简单剖析以下:首先对语种进行判断,判断是否在语言库里,然后生成data参数【以前访问谷歌还需要g_tk参数计算,不知道为什么访问起来越来越简单了】,谷歌的请求界面采用POST方法,一些参数暂时不变,唯一变的是data中的f.req参数,他由原文、原语种、目标语种组成,自己实现就是:

json.dumps([[['MkEWBc', json.dumps([[text, src, des, True], [None]]), None, 'generic']]])
  

然后直接POST得到了结果,比较麻烦的就是对返回结果的处理,但多用几次根据规律还是很好得到具体处理方案的:


  
  1. for row in res.text.split( '\n'):
  2. try:
  3. try:
  4. data = eval(eval(row.replace( 'null', 'None').replace( 'true', 'True').replace( 'false', 'False'))[ 0][ 2])
  5. # 获取原语种
  6. if src == 'auto':
  7. try:
  8. src = data[ 2]
  9. except IndexError:
  10. pass
  11. if src == 'auto':
  12. try:
  13. src = data[ 0][ 2]
  14. except IndexError:
  15. pass
  16. print( f"原语种:{src},原文:\n{text}\n\n翻译语种:{des},翻译文:\n{(' 'if data[1][0][0][3] else '').join([_[0] for _ in data[1][0][0][5]])}")
  17. break
  18. except IndexError:
  19. pass
  20. except TypeError:
  21. pass
  22. except SyntaxError:
  23. pass
  24. else:
  25. print( '未获取正确的翻译结果!')

连json都不用直接eval获取列表就可以了,通过异常判断获取所需要的有结果的那行,把这些综合在一起,写成一个不考虑语言、不依赖除requests其他第三方库的简单程序就是:


  
  1. # _*_ coding:utf-8 _*_
  2. # FileName: google_translate.py
  3. # IDE: PyCharm
  4. # 菜菜代码,永无BUG!
  5. import json
  6. import requests
  7. text = '苹果\n香蕉' # 待翻译文本
  8. src = 'auto' # 原文本语种
  9. des = 'en' # 翻译文语种
  10. res = requests.post(
  11. url= "https://translate.google.cn/_/TranslateWebserverUi/data/batchexecute?rpcids=MkEWBc&bl=boq_translate-webserver_20210929.09_p0&hl=zh-CN&soc-app=1&soc-platform=1&soc-device=1&rt=c",
  12. data={ "f.req": json.dumps([[[ 'MkEWBc', json.dumps([[text, src, des, True], [ None]]), None, 'generic']]])}
  13. )
  14. for row in res.text.split( '\n'):
  15. try:
  16. try:
  17. data = eval(eval(row.replace( 'null', 'None').replace( 'true', 'True').replace( 'false', 'False'))[ 0][ 2])
  18. # 获取原语种
  19. if src == 'auto':
  20. try:
  21. src = data[ 2]
  22. except IndexError:
  23. pass
  24. if src == 'auto':
  25. try:
  26. src = data[ 0][ 2]
  27. except IndexError:
  28. pass
  29. print( f"原语种:{src},原文:\n{text}\n\n翻译语种:{des},翻译文:\n{(' 'if data[1][0][0][3] else '').join([_[0] for _ in data[1][0][0][5]])}")
  30. break
  31. except IndexError:
  32. pass
  33. except TypeError:
  34. pass
  35. except SyntaxError:
  36. pass
  37. else:
  38. print( '未获取正确的翻译结果!')

简单点写成函数就可以任由自己使用了,这不到40行的代码是不是能让你心动呢~

上一篇:关于空间背景颜色的操作


下一篇:Python异常基础(一)