在风变编程上的Python爬虫课程学到第八关,课后练习里,有一个很让人惊喜的彩蛋,是通过Python的爬虫把有道翻译封装起来,做成独立的小APP。

import requests import json from tkinter import Tk,Button,Entry,Label,Text,END class YouDaoFanyi(object): def __init__(self): pass def crawl(self,word): url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #使用post需要一个链接 data={'i': word, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false'} #将需要post的内容,以字典的形式记录在data内。 r = requests.post(url, data) #post需要输入两个参数,一个是刚才的链接,一个是data,返回的是一个Response对象 answer=json.loads(r.text) #你可以自己尝试print一下r.text的内容,然后再阅读下面的代码。 result = answer['translateResult'][0][0]['tgt'] return result class Application(object): def __init__(self): self.window = Tk() self.fanyi = YouDaoFanyi() self.window.title(u'我的翻译') #设置窗口大小和位置 self.window.geometry('310x370+500+300') self.window.minsize(310,370) self.window.maxsize(310,370) #创建一个文本框 #self.entry = Entry(self.window) #self.entry.place(x=10,y=10,width=200,height=25) #self.entry.bind("<Key-Return>",self.submit1) self.result_text1 = Text(self.window,background = 'azure') # 喜欢什么背景色就在这里面找哦,但是有色差,得多试试:http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter self.result_text1.place(x = 10,y = 5,width = 285,height = 155) self.result_text1.bind("<Key-Return>",self.submit1) #创建一个按钮 #为按钮添加事件 self.submit_btn = Button(self.window,text=u'翻译',command=self.submit) self.submit_btn.place(x=205,y=165,width=35,height=25) self.submit_btn2 = Button(self.window,text=u'清空',command = self.clean) self.submit_btn2.place(x=250,y=165,width=35,height=25) #翻译结果标题 self.title_label = Label(self.window,text=u'翻译结果:') self.title_label.place(x=10,y=165) #翻译结果 self.result_text = Text(self.window,background = 'light cyan') self.result_text.place(x = 10,y = 190,width = 285,height = 165) #回车翻译 def submit1(self,event): #从输入框获取用户输入的值 content = self.result_text1.get(0.0,END).strip().replace("\n"," ") #把这个值传送给服务器进行翻译 result = self.fanyi.crawl(content) #将结果显示在窗口中的文本框中 self.result_text.delete(0.0,END) self.result_text.insert(END,result) #print(content) def submit(self): #从输入框获取用户输入的值 content = self.result_text1.get(0.0,END).strip().replace("\n"," ") #把这个值传送给服务器进行翻译 result = self.fanyi.crawl(content) #将结果显示在窗口中的文本框中 self.result_text.delete(0.0,END) self.result_text.insert(END,result) print(content) #清空文本域中的内容 def clean(self): self.result_text1.delete(0.0,END) self.result_text.delete(0.0,END) def run(self): self.window.mainloop() if __name__=="__main__": app = Application() app.run()
这个小程序很好用!我好奇,可不可以把谷歌翻译也这么封装起来呢?结果发现,不仅能,而且比这个还要简单!已经有程序员利用谷歌翻译的API,做好了一个现成的Python库,地址是:https://github.com/ssut/py-googletrans
借助上面的这个框架,我只需要改三个地方:
- 把有道翻译的类换成谷歌翻译的类;
- 把上传原文内容的地方对应到谷歌翻译;
- 把显示译文内容的地方对应到谷歌翻译。
1. 把有道翻译的类换成谷歌翻译的类
首先,要安装Googletrans
pip install googletrans
其次,调用Googletran
from googletrans import Translator
第34行的代码,是调用YouDaoFanyi大类的命令
self.fanyi = YouDaoFanyi()
在Googletrans里面,同样功能的类是Translator,因此这里替换。
self.fanyi = Translator()
原来设定YouDaoFanyi大类的代码可以删掉了。
2. 把上传原文内容的地方对应到谷歌翻译
巧合的是,输入原文的方式是一样的,所以这一步不需要任何操作。
3. 把显示译文内容的地方对应到谷歌翻译
原本代码中,有两个显示译文内容的位置,要同时修改。
result = self.fanyi.crawl(content)
根据Googletrans页面上的使用说明,调用翻译功能的代码如下:
from googletrans import Translator translator = Translator() result = translator.translate('안녕하세요.') print(result)
得到的结果是:
<Translated src=ko dest=en text=Good evening. pronunciation=Good evening.>
译文藏在“text”属性里,所以我要把它提取出来
from googletrans import Translator translator = Translator() result = translator.translate('안녕하세요.') translation = result.text print(translation)
按照这个逻辑,要把原来的一行代码替换成两行:
answer = self.fanyi.translate(content) result = answer.text
成果
import requests import json from googletrans import Translator from tkinter import Tk,Button,Entry,Label,Text,END class Application(object): def __init__(self): self.window = Tk() #调用googletrans里的Translator类。它的各项属性包括:src – source language (default: auto),dest – destination language (default: en),origin – original text,text – translated text,pronunciation – pronunciation self.fanyi = Translator() self.window.title(u'我的翻译') #设置窗口大小和位置 self.window.geometry('310x370+500+300') self.window.minsize(310,370) self.window.maxsize(310,370) #创建一个文本框 #self.entry = Entry(self.window) #self.entry.place(x=10,y=10,width=200,height=25) #self.entry.bind("<Key-Return>",self.submit1) self.result_text1 = Text(self.window,background = 'azure') # 喜欢什么背景色就在这里面找哦,但是有色差,得多试试:http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter self.result_text1.place(x = 10,y = 5,width = 285,height = 155) self.result_text1.bind("<Key-Return>",self.submit1) #创建一个按钮 #为按钮添加事件 self.submit_btn = Button(self.window,text=u'翻译',command=self.submit) self.submit_btn.place(x=205,y=165,width=35,height=25) self.submit_btn2 = Button(self.window,text=u'清空',command = self.clean) self.submit_btn2.place(x=250,y=165,width=35,height=25) #翻译结果标题 self.title_label = Label(self.window,text=u'翻译结果:') self.title_label.place(x=10,y=165) #翻译结果 self.result_text = Text(self.window,background = 'light cyan') self.result_text.place(x = 10,y = 190,width = 285,height = 165) #回车翻译 def submit1(self,event): #从输入框获取用户输入的值 content = self.result_text1.get(0.0,END).strip().replace("\n"," ") #把这个值传送给服务器进行翻译 answer = self.fanyi.translate(content) result = answer.text #将结果显示在窗口中的文本框中 self.result_text.delete(0.0,END) self.result_text.insert(END,result) #print(content) def submit(self): #从输入框获取用户输入的值 content = self.result_text1.get(0.0,END).strip().replace("\n"," ") #把这个值传送给服务器进行翻译 #answer是Translator这个类返回的结果。但是真正的翻译文本藏在结果当中的text属性里 answer = self.fanyi.translate(content) result = answer.text #将结果显示在窗口中的文本框中 self.result_text.delete(0.0,END) self.result_text.insert(END,result) print(content) #清空文本域中的内容 def clean(self): self.result_text1.delete(0.0,END) self.result_text.delete(0.0,END) def run(self): self.window.mainloop() if __name__=="__main__": app = Application() app.run()
总共改了六行代码,谷歌翻译就被抓下来啦!唯一的不足就是,这个小程序和谷歌翻译的网页功能一样,可以自动检测输入文字,但是,默认输出是英文。如果修改一下译文参数,dest,可以设定输出译文的语言。但是不能自动在中英之间双向切换。所以,只能做一个“英汉”的,做一个“汉英”的。美中不足吧。
在网上找了另外一个Python项目,可以选择原文译文语言,改天试一下。
