翻译要求

  1. 翻译不限于中英。
  2. json字符串只翻译值,不翻译键。
  3. json字符串以文本形式存放,翻译完也要采用文本存放。

问题分析

  • json数据在python中本质上是由多个字典组成的列表;如果只有一个字典,那么也可以是字典。
  • 重难点在于如何完整地遍历整个json数据。
  • 翻译过程直接爬取谷歌翻译。

解决过程

预创建

为了确保整个过程顺利,下面是需要安装的包,所有的包均可采用pip安装:

requests,urllib3,pyexecjs,demjson

翻译爬虫

翻译爬虫,这里选择直接从github上扒一个过来,地址及链接如下:

https://github.com/neverneverendup/Translator

代码如下,为了方便调用,做了些许修改:

# -*- coding:utf-8 -*-import urllib
import urllib.request
import urllib.parse
import requests
import execjsclass Google():def __init__(self):self.lan_dict = {'中文': 'zh-CN','英文': 'en','俄文': 'ru','法文': 'fr','日文': 'ja','韩文': 'ko','老挝': 'lo','缅甸': 'my','泰语': 'th','越南': 'vi'}self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}self.url = 'http://translate.google.cn/translate_a/single'self.session = requests.Session()self.session.keep_alive = Falsedef getTk(self, text):return self.get_ctx().call("TL", text)def get_ctx(self):ctx = execjs.compile(""" function TL(a) { var k = ""; var b = 406644; var b1 = 3293161072; var jd = "."; var $b = "+-a^+6"; var Zb = "+-3^+b+-f"; for (var e = [], f = 0, g = 0; g < a.length; g++) { var m = a.charCodeAt(g); 128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = m >> 18 | 240, e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, e[f++] = m >> 6 & 63 | 128), e[f++] = m & 63 | 128) } a = b; for (f = 0; f < e.length; f++) a += e[f], a = RL(a, $b); a = RL(a, Zb); a ^= b1 || 0; 0 > a && (a = (a & 2147483647) + 2147483648); a %= 1E6; return a.toString() + jd + (a ^ b) }; function RL(a, b) { var t = "a"; var Yb = "+"; for (var c = 0; c < b.length - 2; c += 3) { var d = b.charAt(c + 2), d = d >= t ? d.charCodeAt(0) - 87 : Number(d), d = b.charAt(c + 1) == Yb ? a >>> d: a << d; a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d } return a } """)return ctxdef buildUrl(self, text, tk, sl, tl):baseUrl = 'http://translate.google.cn/translate_a/single'baseUrl += '?client=webapp&'  # 这里client改成webapp后翻译的效果好一些 t翻译的比较差 ..baseUrl += 'sl=auto&'baseUrl += 'tl=' + str(tl) + '&'baseUrl += 'hl=zh-CN&'baseUrl += 'dt=at&'baseUrl += 'dt=bd&'baseUrl += 'dt=ex&'baseUrl += 'dt=ld&'baseUrl += 'dt=md&'baseUrl += 'dt=qca&'baseUrl += 'dt=rw&'baseUrl += 'dt=rm&'baseUrl += 'dt=ss&'baseUrl += 'dt=t&'baseUrl += 'ie=UTF-8&'baseUrl += 'oe=UTF-8&'baseUrl += 'clearbtn=1&'baseUrl += 'otf=1&'baseUrl += 'pc=1&'baseUrl += 'srcrom=0&'baseUrl += 'ssel=0&'baseUrl += 'tsel=0&'baseUrl += 'kc=2&'baseUrl += 'tk=' + str(tk) + '&'content = urllib.parse.quote(text)baseUrl += 'q=' + contentreturn baseUrldef getHtml(self, session, url, headers):try:html = session.get(url, headers=headers)return html.json()except Exception as e:return Nonedef translate(self, from_lan, to_lan, text):tk = self.getTk(text)url = self.buildUrl(text, tk, from_lan, to_lan)result = self.getHtml(self.session, url, self.headers)if result != None:ans = []s = ''for i in result[0]:if i[0] != None:s += i[0]for i in s.split('\n'):ans.append(i)return anselse:print('谷歌翻译失败')# self.logger.info('谷歌翻译失败 ')return ['谷歌翻译失败']def Use(text):gg = Google()# 修改此处即可实现不同语种的翻译return gg.translate('zh-CN', 'th', text)[0]if __name__ == '__main__':text = input("请输入原文:\n")print(Use(text))

导入数据

导入文本中的json字符串数据。

# 读取文件
file = open("file.txt", encoding="utf-8")
str = file.read()
file.close()
# print(str)

转化对象

将导入的数据转为对象,这里用到了demjson模块,这个模块可以将一些不规则的json字符串(比如键名不是字符串的,键值是单引号的·)转化为规则的json字符串。

# data_json = json.loads(str)
# 不规则json字符串处理,使其可以成为对象
data_json = demjson.decode(str, encoding="utf-8")
print(data_json)

翻译过程

做到只翻译值而不翻译键,而且还要考虑到这个值有可能是一个字典或列表,因此能翻译的有两种情况:在键对应的值为字符串的情况下翻译值;在键对应的值为列表且列表中不含字典的情况下翻译列表中的每个元素,采用的核心方法为递归。

def translation(dic_json):# 列表if isinstance(dic_json, list):# 遍历列表for i in range(len(dic_json)):# 当前项为字典if isinstance(dic_json[i], dict):for key in dic_json[i]:# 键所对应的值是列表if isinstance(dic_json[i][key], list):# 递归translation(dic_json[i][key])# 键所对应的值是字典elif isinstance(dic_json[i][key], dict):# 递归translation(dic_json[i][key])# 字符串else:# 翻译前的值print(dic_json[i][key])# 翻译dic_json[i][key] = GoogleTranslation.Use(dic_json[i][key])# 翻译后的值print(dic_json[i][key])# 休眠,防止爬虫被检测time.sleep(1.9)# 字符串elif isinstance(dic_json[i], str):print(dic_json[i])dic_json[i] = GoogleTranslation.Use(dic_json[i])print(dic_json[i])# 休眠,防止爬虫被检测time.sleep(1.9)# 字典else:for key in dic_json:# 键所对应的值是列表if isinstance(dic_json[key], list):# 递归translation(dic_json[key])# 键所对应的值是字典elif isinstance(dic_json[key], dict):# 递归translation(dic_json[key])else:# 翻译前的值print(dic_json[key])# 翻译dic_json[key] = GoogleTranslation.Use(dic_json[key])# 翻译后的值print(dic_json[key])# 休眠,防止爬虫被检测time.sleep(1.9)

写入数据

将翻译后的json字符串写入文本

# 写入
with open("file(translation).txt", "w", encoding="utf-8") as fp:fp.write(json.dumps(data_json, ensure_ascii=False, indent=4))

附录

GoogleTranslation.py

# -*- coding:utf-8 -*-import urllib
import urllib.request
import urllib.parse
import requests
import execjsclass Google():def __init__(self):self.lan_dict = {'中文': 'zh-CN','英文': 'en','俄文': 'ru','法文': 'fr','日文': 'ja','韩文': 'ko','老挝': 'lo','缅甸': 'my','泰语': 'th','越南': 'vi'}self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}self.url = 'http://translate.google.cn/translate_a/single'self.session = requests.Session()self.session.keep_alive = Falsedef getTk(self, text):return self.get_ctx().call("TL", text)def get_ctx(self):ctx = execjs.compile(""" function TL(a) { var k = ""; var b = 406644; var b1 = 3293161072; var jd = "."; var $b = "+-a^+6"; var Zb = "+-3^+b+-f"; for (var e = [], f = 0, g = 0; g < a.length; g++) { var m = a.charCodeAt(g); 128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), e[f++] = m >> 18 | 240, e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, e[f++] = m >> 6 & 63 | 128), e[f++] = m & 63 | 128) } a = b; for (f = 0; f < e.length; f++) a += e[f], a = RL(a, $b); a = RL(a, Zb); a ^= b1 || 0; 0 > a && (a = (a & 2147483647) + 2147483648); a %= 1E6; return a.toString() + jd + (a ^ b) }; function RL(a, b) { var t = "a"; var Yb = "+"; for (var c = 0; c < b.length - 2; c += 3) { var d = b.charAt(c + 2), d = d >= t ? d.charCodeAt(0) - 87 : Number(d), d = b.charAt(c + 1) == Yb ? a >>> d: a << d; a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d } return a } """)return ctxdef buildUrl(self, text, tk, sl, tl):baseUrl = 'http://translate.google.cn/translate_a/single'baseUrl += '?client=webapp&'  # 这里client改成webapp后翻译的效果好一些 t翻译的比较差 ..baseUrl += 'sl=auto&'baseUrl += 'tl=' + str(tl) + '&'baseUrl += 'hl=zh-CN&'baseUrl += 'dt=at&'baseUrl += 'dt=bd&'baseUrl += 'dt=ex&'baseUrl += 'dt=ld&'baseUrl += 'dt=md&'baseUrl += 'dt=qca&'baseUrl += 'dt=rw&'baseUrl += 'dt=rm&'baseUrl += 'dt=ss&'baseUrl += 'dt=t&'baseUrl += 'ie=UTF-8&'baseUrl += 'oe=UTF-8&'baseUrl += 'clearbtn=1&'baseUrl += 'otf=1&'baseUrl += 'pc=1&'baseUrl += 'srcrom=0&'baseUrl += 'ssel=0&'baseUrl += 'tsel=0&'baseUrl += 'kc=2&'baseUrl += 'tk=' + str(tk) + '&'content = urllib.parse.quote(text)baseUrl += 'q=' + contentreturn baseUrldef getHtml(self, session, url, headers):try:html = session.get(url, headers=headers)return html.json()except Exception as e:return Nonedef translate(self, from_lan, to_lan, text):tk = self.getTk(text)url = self.buildUrl(text, tk, from_lan, to_lan)result = self.getHtml(self.session, url, self.headers)if result != None:ans = []s = ''for i in result[0]:if i[0] != None:s += i[0]for i in s.split('\n'):ans.append(i)return anselse:print('谷歌翻译失败')# self.logger.info('谷歌翻译失败 ')return ['谷歌翻译失败']def Use(text):gg = Google()# 修改此处即可实现不同语种的翻译return gg.translate('zh-CN', 'th', text)[0]if __name__ == '__main__':text = input("请输入原文:\n")print(Use(text))

Demo.py

import GoogleTranslation
import json
import time
import demjsondef translation(dic_json):# 列表if isinstance(dic_json, list):# 遍历列表for i in range(len(dic_json)):# 当前项为字典if isinstance(dic_json[i], dict):for key in dic_json[i]:# 键所对应的值是列表if isinstance(dic_json[i][key], list):# 递归translation(dic_json[i][key])# 键所对应的值是字典elif isinstance(dic_json[i][key], dict):# 递归translation(dic_json[i][key])# 字符串else:# 翻译前的值print(dic_json[i][key])# 翻译dic_json[i][key] = GoogleTranslation.Use(dic_json[i][key])# 翻译后的值print(dic_json[i][key])# 休眠,防止爬虫被检测time.sleep(1.9)# 字符串elif isinstance(dic_json[i], str):print(dic_json[i])dic_json[i] = GoogleTranslation.Use(dic_json[i])print(dic_json[i])# 休眠,防止爬虫被检测time.sleep(1.9)# 字典else:for key in dic_json:# 键所对应的值是列表if isinstance(dic_json[key], list):# 递归translation(dic_json[key])# 键所对应的值是字典elif isinstance(dic_json[key], dict):# 递归translation(dic_json[key])else:# 翻译前的值print(dic_json[key])# 翻译dic_json[key] = GoogleTranslation.Use(dic_json[key])# 翻译后的值print(dic_json[key])# 休眠,防止爬虫被检测time.sleep(1.9)if __name__ == '__main__':# 读取文件file = open("file.txt", encoding="utf-8")str1 = file.read()file.close()# print(str)# data_json = json.loads(str)# 不规则json字符串处理,使其可以成为对象data_json = demjson.decode(str1, encoding="utf-8")print(data_json)# 翻译translation(data_json)# 写入with open("file1.txt", "w", encoding="utf-8") as fp:fp.write(json.dumps(data_json, ensure_ascii=False, indent=4))

python爬虫+谷歌翻译json字符串相关推荐

  1. python调用谷歌翻译英文文献pdf_Python 调用 Google Translate API 批量翻译文章

    有时候批量翻译中文文章,批量变成各个小语种的语言,手动的粘贴复制是非常慢的.需要调用翻译 API 接口,综合对比市面上的各个翻译 API,个人觉得 Google 的翻译 API 最为好用和准确. 下面 ...

  2. python爬虫英文翻译_Python爬虫实现翻译功能

    前言 学了这么久的python理论知识,需要开始实战来练手巩固了. 准备 首先安装爬虫urllib库 pip install urllib 获取有道翻译的链接url 需要发送的参数在form data ...

  3. java调用python,传参json字符串,含中文传参

    java调用python,传参json字符串 python脚本内容(test.py) # -*- coding: utf-8 -*-def main(input):return input java调 ...

  4. python翻译程序-Python:谷歌翻译20次的程序如何实现?

    Python:谷歌翻译20次的程序如何实现? 作者:橙汁 [梗的解释] " 谷歌翻译20次"就是多次利用谷歌翻译(Google Translate)将原本正常的名场面对话翻译成语言 ...

  5. Python 调用谷歌翻译(2021年3月测试可用)

    前言 把之前的用来谷歌翻译的Python文件整理了下, 用来处理翻译下i18n.js所需要的字典, 直接调用即可.2021年3月测试可用 (¦3[▓▓] 2021年9月17日 测试失效 请查看: Py ...

  6. python pymysql 如何输出 json 字符串

    python pymysql 如何输出 json 字符串 刚入门 python,目前在写一个比较简单的功能,不知道其它框架有没有比较简单的将数据库数据输出 json 的方式,这里说一个自定义的 jso ...

  7. Python实现谷歌翻译爬虫,翻译PDF,翻译Excel,支持excel文档打开翻译,支持xlsx,xlsm等格式。

    前言: 这两个Python脚本是我在实习期间完成的,具体来自于小组主管的两个小需求.做完之后感觉还是挺有收获的. 实现谷歌翻译,首先需要将我们写的Python脚本还有需要翻译的文件放到谷歌浏览器的安装 ...

  8. 转:利用python调用谷歌翻译API

    废话少说 从速卖通抓取了一些评论想进行一些简单的文本分析,但是因为速卖通是一个跨境电商平台,上边的评论基本都是小语种,对,小语种,俄语,法语...英语还可以勉强应付一下,但是其他真的是一个字母都不认识 ...

  9. Python爬虫笔记——解析json数据(以周杰伦歌单为例)及Headers

    一.Network Network能够记录浏览器的所有请求.我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看 ...

  10. 使用谷歌翻译json数据

    最近有一个需求是使用node.js调用谷歌翻译,npm有一个叫google-translate-api的包,已经对谷歌翻译服务进行了封装,可以直接调用.npm包的安装及使用可以参考 链接: link. ...

最新文章

  1. IDEA的maven项目报错BeanCreationException: Error creating bean with name “xxxController”
  2. 干货|吴恩达Coursera课程教你学习神经网络二!
  3. Python笔记-Json转DataFrame(基金主题Json数据)
  4. I盘提示位置不可用数据怎样找到
  5. intellij idea 中右键项目没有git
  6. js-01_面向对象选项卡
  7. 企业网络安全建设必须要知道的终端产品
  8. 如何选择企业邮箱?企业邮箱好处是什么?
  9. react 中的userReducer
  10. 2022中国汽车品牌魅力指数排名:广汽传祺、吉利、东风风行、荣威位居自主品牌前列 | 美通社头条...
  11. 方根法公式_方根的简易算法
  12. 追捧《弟子规》,因为你并不知道古代的优质教育是什么
  13. UE4 游戏窗口前台后台监听
  14. cs6给画笔分组_ps里笔刷怎么分组
  15. Swift中的_(下划线)是什么意思
  16. 服务器未响应怎么弄,快速解决DNS服务器未响应的四个小妙招
  17. vue sku没库存置灰
  18. 记一次找回微信聊天记录之旅-小米助手踩坑记
  19. 软件测试岗位职业晋升之路?
  20. 【UVM源码学习】uvm_comparer

热门文章

  1. 帝云CMS内容管理系统
  2. hive 添加字段_Hive分区表动态添加字段
  3. Oracle定时任务使用
  4. TF卡里删掉文件后内存没变大_电视装好kodi后打不开?播放原盘4K很卡?教你怎么解决...
  5. Linux之rz和sz命令用法详解
  6. 联发科MT7621 Openwrt开发编译记录
  7. 【Windows脚本】打印机脚本2-共享打印机
  8. 其他计算机才能打印,关于HPM126A打印机共享问题-共享之后主机得打印一次后其他电脑才能打印...
  9. 联想智能云教室_被低估的联想能复制微软之路吗? | 公司观察
  10. flutter 修改app名字和图标(安卓)