2019年7月4日15:53:17

    (¦3[▓▓] 晚安

谷歌翻译环境

Python 3.6
第三方库 Execjs (pip install PyExecJS)

文件列表

同目录下的四个文件:

    - tool.py
- google_translate.py
- input.txt
- __init__.py 主要有四个文件
1、tool.py (用来生成谷歌翻译url中的tk字段)
2、google_translate.py (用来读取中文txt文件,并翻译生成新的德语txt文件)
3、input.txt(需要翻译的txt中文文件)
4、__init__.py(该文件为空文件,用来impot tool.py)
详细可以百度"python3 引用同目录py文件"

使用步骤

注:这里是中文文本转换为德语文本

1、同目录下创建四个文件,分别将下边代码粘贴上去
2、运行 python3 google_translate.py或 python google_translate.py生成output.txt

修改说明

本文件是中文翻译为德语的,如果要转换为其他语言
请修改 google_translate.py 文件里的 translate()函数的以下字段。 关于语言代码和国家的对应,请查看"国家语言代码对照表"文章。
如:中文 zh-CN
德语 de
英语 en old_language_code = "zh-CN" # 中文
new_language_code = "de" # 德语
# new_language_code = "en" # 英语

tool.py

注:用来生成谷歌翻译url中的tk字段
import execjs

class Py4Js():

    def __init__(self):
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
}
""") def getTk(self, text):
return self.ctx.call("TL", text)

google_translate.py

    注:用来读取中文txt文件,并翻译生成新的德语txt文件
# -*- coding: utf-8 -*-

import urllib.request
from tool import Py4Js def open_url(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
req = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(req)
data = response.read().decode('utf-8')
return data def translate(content, tk):
if len(content) > 4891:
print("翻译的长度超过限制!!!")
return content = urllib.parse.quote(content) old_language_code = "zh-CN"
# new_language_code = "en" # 英语
new_language_code = "de" # 德语
url = "https://translate.google.cn/translate_a/single?client=webapp&" \
"sl=%s&tl=%s&hl=en&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&clearbtn=1&otf=1&" \
"pc=1&ssel=3&tsel=3&kc=2&tk=%s&q=%s" % (old_language_code, new_language_code, tk, content) result = open_url(url) end = result.find("\",")
if end > 4:
print(result[4:end])
return result[4:end] def get_old_text_list():
key_str_list = list()
with open("input.txt", "r") as fo:
lines = fo.readlines() for line in lines:
if "'" in line and ":" in line and "," in line:
line_list = line.split("'")
line_str = line_list[-2]
if line_str != "React Admin":
key_str_list.append(line_str)
print(line_str)
return key_str_list def get_new_text_list(key_str_list):
js = Py4Js() value_str_list = list()
key_value_dict = dict()
for key in key_str_list:
content = key if content == 'q!':
break tk = js.getTk(content)
value = translate(content, tk)
value_str_list.append(value) key_value_dict[key] = value
print(key_str_list)
print(value_str_list)
print(key_value_dict)
return value_str_list, key_value_dict def output_new_text(key_str_list, value_str_list, key_value_dict):
with open("input.txt", "r") as fo:
lines = fo.readlines() with open("output.txt", "w") as fw:
for line in lines:
for key in key_str_list:
if key in line:
line = line.replace(key, key_value_dict[key])
fw.write(line) def main():
key_str_list = get_old_text_list()
value_str_list,key_value_dict = get_old_text_list(key_str_list) output_new_text(key_str_list, value_str_list, key_value_dict) if __name__ == "__main__":
main()

inpupt.txt

    注:需要翻译的txt中文文件
export default {
application: {
name: 'React Admin',
},
ajaxTip: {
success: '成功',
error: '失败',
noAccess: '无权访问此资源',
notFound: '访问资源不存在',
serverBusy: '服务器繁忙',
timeOut: '超时',
},
menu: {
menus: '菜单&权限',
codeGenerator: '代码生成',
home: '首页',
document: '文档',
page404: '404页面不存在',
login: '登录',
example: '示例',
userCenter: '用户中心',
users: '用户列表',
userEdit: '用户编辑',
roles: '角色列表',
modifyPassword: '修改密码',
setting: '设置',
logout: '退出登录',
ajax: 'ajax请求',
antDesign: 'Ant Design 官网',
google: '谷歌官网', component: '组件',
tableRowDraggable: '表格行可拖拽',
asyncSelect: '异步下拉',
formElement: '表单元素',
formItemLayout: '表单布局',
formUtil: '表单相关工具',
inputClear: '可清空Input',
listPage: '列表页',
modal: '弹框',
noData: '暂无数据',
operator: '操作',
pagination: '分页组件',
permission: '权限',
popPrompt: '弹框输入',
queryBar: '查询条',
queryItem: '查询条件',
tableAnimate: '表格动画高阶组件',
tableDragColumn: '表头拖拽高阶组件',
tableDragRow: '表格行可拖拽高阶组件',
tableEditable: '可编辑表格',
tableRightClick: '表格行右键高阶组件',
toolBar: '工具条',
userAvatar: '用户头像',
},
login: {
title: '欢迎登录',
submit: '登录',
userName: '用户名',
password: '密码',
userNameEmptyTip: '请输入用户名!',
passwordEmptyTip: '请输入密码!',
},
setting: {
navigationLayout: '导航布局',
topSideMenu: '顶部+左侧导航',
topMenu: '顶部导航',
sideMenu: '左侧导航',
tabsSetting: 'Tab页导航设置',
tabsShow: '显示Tab页导航',
pageSetting: '页面设置',
showHead: '显示头部',
fixedHead: '头部固定',
menuSetting: '菜单设置',
keepMenuOpen: '保持菜单展开',
keepPage: '保持页面状态',
fullScreen: '全屏显示',
exitFullScreen: '退出全屏',
selectPrimaryColor: '选择主题颜色',
},
tabs: {
refresh: '刷新',
refreshAll: '刷新全部',
close: '关闭',
closeOthers: '关闭其他',
closeAll: '关闭所有',
closeLeft: '关闭左侧',
closeRight: '关闭右侧',
},
errorPage: {
needLogin: '您还未登录!',
pageNotFound: '您访问的页面不存在!',
redirectTo: '跳转到',
orReturn: '或者返回',
previousStep: '上一步',
},
};

--

output.txt

    注:最终生成文件
 {
application: {
name: 'React Admin',
},
ajaxTip: {
success: 'Erfolg',
error: 'Misserfolg',
noAccess: 'Nicht berechtigt, auf diese Ressource zuzugreifen',
notFound: 'Zugriffsressourcen sind nicht vorhanden',
serverBusy: 'Server ausgelastet',
timeOut: 'Timeout',
},
menu: {
menus: 'Menü \u0026 Berechtigungen',
codeGenerator: 'Codegenerierung',
home: 'Zuhause',
document: 'Dokument',
page404: '404 Seite existiert nicht',
login: 'Einloggen',
example: 'Beispiel',
userCenter: 'Benutzerzentrum',
users: 'Benutzerliste',
userEdit: 'Benutzerbearbeitung',
roles: 'Rollenliste',
modifyPassword: 'Passwort ändern',
setting: 'Einstellung',
logout: 'Abmelden',
ajax: 'Ajax-Anfrage',
antDesign: 'Offizielle Website von Ant Design',
google: 'Googles offizielle Website', component: 'Komponente',
tableRowDraggable: 'Tabellenzeilen können gezogen werden',
asyncSelect: 'Asynchroner Pulldown',
formElement: 'Formularelement',
formItemLayout: 'Formularlayout',
formUtil: 'Formularbezogene Werkzeuge',
inputClear: 'Kann Eingabe löschen',
listPage: 'Listenseite',
modal: 'Einschussfeld',
noData: 'Noch keine Daten',
operator: 'Bedienung',
pagination: 'Paging-Komponente',
permission: 'Erlaubnis',
popPrompt: 'Bullet-Box-Eingabe',
queryBar: 'Abfrageleiste',
queryItem: 'Abfragebedingung',
tableAnimate: 'Übergeordnete Komponenten für die Tabellenanimation',
tableDragColumn: 'Header, der High-End-Komponenten zieht',
tableDragRow: 'Tabellenzeilen können übergeordnete Komponenten ziehen',
tableEditable: 'Bearbeitbares Formular',
tableRightClick: 'Klicken Sie mit der rechten Maustaste auf die übergeordnete Komponente in der Tabellenzeile',
toolBar: 'Symbolleiste',
userAvatar: 'Benutzeravatar',
},
login: {
title: 'Willkommen anmelden',
submit: 'Einloggen',
userName: 'Benutzername',
password: 'Passwort',
userNameEmptyTip: 'Bitte geben Sie Ihren Benutzernamen ein!',
passwordEmptyTip: 'Bitte geben Sie Ihr Passwort ein!',
},
setting: {
navigationLayout: 'Navigationslayout',
topSideMenu: 'Navigation oben + links',
topMenu: 'Top Navigation',
sideMenu: 'Linke Navigation',
tabsSetting: 'Einstellungen für die Registerkartennavigation',
tabsShow: 'Registerkartennavigation anzeigen',
pageSetting: 'Seite einrichten',
showHead: 'Anzeigekopf',
fixedHead: 'Kopffixierung',
menuSetting: 'Menüeinstellung',
keepMenuOpen: 'Lassen Sie das Menü geöffnet',
keepPage: 'Seitenstatus beibehalten',
fullScreen: 'Vollbildanzeige',
exitFullScreen: 'Beenden Sie den Vollbildmodus',
selectPrimaryColor: 'Wählen Sie die Themenfarbe',
},
tabs: {
refresh: 'Aktualisieren',
refreshAll: 'Aktualisieren Sie alle',
close: 'Schliessen',
closeOthers: 'Andere schließen',
closeAll: 'Alles schließen',
closeLeft: 'Links schließen',
closeRight: 'Nach rechts schließen',
},
errorPage: {
needLogin: 'Du bist nicht eingeloggt!',
pageNotFound: 'Die von Ihnen besuchte Seite existiert nicht!',
redirectTo: 'Springe zu',
orReturn: 'Oder zurück',
previousStep: 'Vorheriger Schritt',
},
}

注:运行请注意查看文章发布时间,防止时间太长而谷歌接口更新导致获取失败

有问题欢迎随时留言

参考文献:

https://blog.csdn.net/yingshukun/article/details/53470424

python爬虫调用谷歌翻译接口的更多相关文章

  1. Python爬虫有道翻译接口

    import urllib.request import urllib.parse import json import hashlib from datetime import datetime i ...

  2. python开发的百度翻译接口

    做的一个python版的百度翻译,附代码 #!/usr/bin/env python # -*- coding:utf-8 -*-   ''' 爬虫之百度翻译 需要的库有 js2py, request ...

  3. PHP 最完美调用百度翻译接口代码示例 (原)

    php调用百度翻译最新接口代码 问       题:写的过程遇到了一个问题,url拼接好的原翻译内容,appid,sign的地址直接输出到浏览器可以打开看到翻译后的返回值,但是各种curl,file_ ...

  4. .net core 和 WPF 开发升讯威在线客服系统:调用百度翻译接口实现实时自动翻译

    业余时间用 .net core 写了一个在线客服系统.并在博客园写了一个系列的文章,写介绍这个开发过程. 我把这款业余时间写的小系统丢在网上,陆续有人找我要私有化版本,我都给了,毕竟软件业的初衷就是免 ...

  5. C#调用谷歌翻译API

    原资料为网上找到的原稿为:http://www.cnblogs.com/marso/p/google_translate_api.html(此处只做个人笔记参考) 主要分两块:通过WebRequest ...

  6. python爬虫调用搜索引擎及图片爬取实战

    实战三-向搜索引擎提交搜索请求 关键点:利用搜索引擎提供的接口 百度的接口:wd="要搜索的内容" 360的接口:q="要搜索的内容" 所以我们只要把我们提交给 ...

  7. python爬虫-采集英语翻译

      http://fanyi.baidu.com/?aldtype=85#en/zh/drughttp://fanyi.baidu.com/?aldtype=85#en/zh/cathttp://fa ...

  8. python爬虫-有道翻译-js加密破解

    有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...

  9. Python调用Google翻译

    出自:http://blog.csdn.net/zhaoyl03/article/details/8830806 最近想动手做一个文档自动下载器,需要模拟浏览器的行为.虽然感觉思路上没有困难,但在技术 ...

随机推荐

  1. Leetcode 268 Missing Number 位运算

    题意:先将0, 1, 2, ..., n放入数组,然后去掉其中一个值,找到那个值. 这题与singe number 是一个类型,变形的地方就是首先需要将0, 1, 2, ..., n再次放入这个数组, ...

  2. WPF 3D 模型旋转

    原文:WPF 3D 模型旋转 WPF 是 Microsoft 在 Framework3.0 中支持的一种技术,它能作出很绚丽的界面,同时它也支持3D的操作.在3D操作主要包括平移(Translate) ...

  3. 使用 matlab 数据集的生成(generate datasets)

    一般手工生成的数据集(artificial datasets),通常用于实验部分最开始的演示和示意,用于对结果的一种精确计算和量化分析. 1. Swiss/Helix/Twinpeaks/Broken ...

  4. Qt SQLite 批量插入优化(SQLite默认将每条语句看成单独的事务)good

    使用SQLite存储数据时发现插入速度太慢,程序跑了将近五分钟才插入了不到三千条.上网查资料才发现,SQLite这种文件数据库与MySql机制不一样,每条事务都有打开和关闭文件的步骤,SQLite默认 ...

  5. WPF路由

    举例:窗口-用户控件-布局控件-…-按钮 按钮的点击事件:先由按钮的Click相应,然后….,然后布局控件,然后用户控件,然后窗口类似异常,直到“处理完成”(实际上一般按钮自己处理即可) 路由事件   ...

  6. Lexer的设计--上(3)

    lexer的构造函数 有了上一节Token做铺垫, 可以开始设计lexer, 首先应该想到的是, 源代码是以文件流的格式传到编译器中的, 所以作为编译器的前段的第一个阶段, lexer必须负责处理输入 ...

  7. WPF值转换器的使用

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  8. Windows系统CPU内存网络性能统计第一篇 内存

    最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...

  9. 关于WPF的ComboBox中Items太多而导致加载过慢的问题

    原文:关于WPF的ComboBox中Items太多而导致加载过慢的问题 [WFP疑难]关于WPF的ComboBox中Items太多而导致加载过慢的问题                          ...

  10. Linux学习之“vfork函数”

    为什么使用vfork()? 希望父子进程执行不同的代码.例如: 网络服务程序中,父进程等待客户端的服务请求,当请求达到时,父进程调用fork,使子进程处理该次请求,而父进程继续等待下一个服务请求到达. ...