赞
踩
实现一键翻译功能,最简单的方案当然是我们的爬虫啦,这里,我选择的是 有道翻译
这个页面,在左边输入文字,那么浏览器会把你输入的信息传输给服务器。再返回对应的内容。这就是一个典型的Post操作。我们可以在XHR中查看数据的传送方式
reques url 就是我们要请求的网址
fromdata里面就是我们要提交的数据
普通的破解方法是将请求网址https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule中的_o去除,经过测试,这样只能实现简单的中英互译
而当我想中文翻译成韩文
ko表示韩文缩写
出来的却是英文经过多次实验发现,这个方法只能中英互译或者将其他语言翻译成中文,无法通过改变from/to来改变翻译。所以得尝试去破解fromdata里面的之前看不懂的参数。
在js中,找到fanyi.min.js
复制这一段代码var r=function(e){var t=n.md5(navigator.appVersion),r=""+(new Date).getTime(),i=r+parseInt(10*Math.random(),10);return{ts:r,bv:t,salt:i,sign:n.md5(“fanyideskweb”+e+i+“Tbh5E8=q6U3EXe+&L[4c@”)}};在代码格式化网站格式化一下
```javascript
在这里插入代码片
```var r = function(e) {
var t = n.md5(navigator.appVersion),
r = "" + (new Date).getTime(),
i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
}
};
通过观察
e:我们需要翻译的内容
t:app版本的MD5值,这个只要版本不变这个值就不会变,所以t的值可以在fromdata里面找到
r:当前时间戳
i:r+0到10之间的一个随机数
返回的数据就是我们fromdata中看到的数据
ts:r
bv:固定值,这个没什么影响
salt:i
sign:“fanyideskweb”+e+i+一段看不懂的字符串的md5值,这个字符串也会变化,但应该很久才变化一次,当我们某次获取翻译失败时,可以再次从fanyi.min.js获取这段字符串。接下来就可以写代码实现我们的爬虫了。
这里主要写反爬部分的代码,完整源码在后面。
通过前面的分析我们知道想要翻译成不同语言,需要知道不同语言的代号,
观察网页源代码发现所有的语言代号都在ul标签下,所以这里我们也可以通过爬虫获取。
接下来就是UI界面了,我选用的是python自带的tkinter库
这里简单介绍主要用到的几个控件
创建窗口:window=tkinter.TK()
窗口标题: window.title(“标题名”)
button按钮:按钮控件;在程序中显示按钮。
text控件:格式化文本显示。允许你用不同的样式和属性来显示和编辑文本。同时支持内嵌图象和窗口。
combobox:tkinter子类ttk的模块,时间下拉列表
label:标签
我的UI界面的最终样式
想了解跟多tkinter可参考博客
import hashlib import json import random import time from tkinter import END,Button, Entry, Label, Scrollbar, StringVar, Text, Tk,messagebox from tkinter.ttk import Combobox import requests from lxml import etree list1=['自动检测语言', '中文\xc2英语', '英语\xc2中文', '中文\xc2日语', '日语\xc2中文', '中文\xc2韩语', '韩语\xc2中文', '中文\xc2法语', '法语\xc2中文', '中文\xc2德语', '德语\xc2中文', '中文\xc2俄语', '俄语\xc2中文', '中文\xc2西班牙语', '西班牙语\xc2中文', '中文\xc2葡萄牙语', '葡萄牙语\xc2中文', '中文\xc2意大利语', '意大利语\xc2中文', '中文\xc2越南语', '越南语\xc2中文', '中文\xc2印尼语', '印尼语\xc2中文', '中文\xc2阿拉伯语', '阿拉伯语\xc2中文', '中文\xc2荷兰语', '荷兰语\xc2中文', '中文\xc2泰语', '泰语\xc2中文'] list2=[['AUTO', 'AUTO'], ['zh-CHS', 'en'], ['en', 'zh-CHS'], ['zh-CHS', 'ja'], ['ja', 'zh-CHS'], ['zh-CHS', 'ko'], ['ko', 'zh-CHS'], ['zh-CHS', 'fr'], ['fr', 'zh-CHS'], ['zh-CHS', 'de'], ['de', 'zh-CHS'], ['zh-CHS', 'ru'], ['ru', 'zh-CHS'], ['zh-CHS', 'es'], ['es', 'zh-CHS'], ['zh-CHS', 'pt'], ['pt', 'zh-CHS'], ['zh-CHS', 'it'], ['it', 'zh-CHS'], ['zh-CHS', 'vi'], ['vi', 'zh-CHS'], ['zh-CHS', 'id'], ['id', 'zh-CHS'], ['zh-CHS', 'ar'], ['ar', 'zh-CHS'], ['zh-CHS', 'nl'], ['nl', 'zh-CHS'], ['zh-CHS', 'th'], ['th', 'zh-CHS']] class translate1(object): def __init__(self): self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'} self.url1='http://fanyi.youdao.com/' self.url2='http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' def get_langSelect(self): lan_list=[] text_list=[] res=requests.get(url=self.url1,headers=self.headers) html=etree.HTML(res.text) li_list=html.xpath('/html/body/div[2]/div[1]/div[2]/div[1]/ul//li') for i in li_list: dataval=i.xpath('./@data-value')[0].split('2') lan_list.append(dataval) text=i.xpath('./a/text()')[0].replace(' ','').replace(' ','').replace('\xa0','') text_list.append(text) lan_list[0].append('AUTO') #print(text_list) #print(lan_list) return lan_list,text_list def crawler(self,i,fromto): #returnlist=list() header={ 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Content-Length': '239', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Cookie': 'OUTFOX_SEARCH_USER_ID=48328342@10.108.160.100; OUTFOX_SEARCH_USER_ID_NCOO=276358647.14339805; JSESSIONID=aaaZHn7tLjpDiaro7Y2Hx; ___rl__test__cookies=%s'%(str(int(time.time()*1000))), 'Host': 'fanyi.youdao.com', 'Origin': 'http', 'Referer': 'http', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest' }#我测试的时候,需要header里面需要添加cookies才能爬取到译文 #cookies中只有___rl__test__cookies发生变化,而她的值就是当前时间戳 client='fanyideskweb' salt=str(int(time.time()*1000)+random.randint(1,10)) key='Tbh5E8=q6U3EXe+&L[4c@' sign=hashlib.md5((client+i+salt+key).encode('utf-8')).hexdigest() fromdata={ 'i':i, 'from':fromto[0], 'to':fromto[1], 'smartresult':'dict', 'client':client, 'salt':salt, 'sign':sign, 'its':str(int(time.time()*1000)), 'bv':'cda1e53e0c0eb8dd4002cefc117fa588', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'lan-select' } try: res=requests.post(url=self.url2,data=fromdata,headers=header) json_data=json.loads(res.text) #print(json_data) result_list=json_data['translateResult'][0] print(result_list) '''for i in result_list: result=i[0]['tgt'] returnlist.append(result)''' return result_list except KeyError as e: self.args=e.args return None class GUI(): def __init__(self): self.fanyi=translate1() self.list1,self.list2=self.fanyi.get_langSelect() self.index=0#默认自动翻译 self.count=1 self.window=Tk()#创建窗口 self.window.title('翻译器') self.window.geometry('600x500')#width height ## 喜欢什么背景色就在这里面找哦,但是有色差,得多试试:http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter self.text1=Text(self.window,background='sky blue') self.text1.place(x=50,y=100,width=230,relheight=0.5) self.text2=Text(self.window,background='cyan') self.text2.place(x=320,y=100,width=230,relheight=0.5) self.var=StringVar() #按钮事件 self.button1=Button(self.window,text='翻译',command=self.submit,font=('宋体',15))# self.button2=Button(self.window,text='清空',command=self.clean_all,font=('宋体',15)) self.button1.place(x=350,y=50,width=60,height=40) self.button2.place(x=430,y=50,width=60,height=40) self.button3=Button(self.window,text='--->',bg='white',fg='black',font=(None,15)) self.button3.place(x=180,y=10,width=50,height=30) self.button3.bind('<Button-1>',self.click_left) self.button4=Button(self.window,text='<---',bg='white',fg='black',font=(None,15)) self.button4.place(x=230,y=10,width=50,height=30) self.button4.bind('<Button-1>',self.click_right) #标签事件 self.label1=Label(self.window,text='请选择:',font=('宋体',15)) self.label1.place(x=50,y=50,width=100,height=30) #下拉列表事件 self.comb=Combobox(self.window,textvariable=self.var,values=self.list2) #self.comb=Combobox(self.window,textvariable=self.var,values=list1) self.comb.place(x=180,y=50,width=100,height=40) self.comb.set('自动检测语言')#默认自动检测语言 self.comb.bind('<<ComboboxSelected>>',self.select) def click_left(self,event): self.index+=1 self.comb.set('{}'.format(self.list2[self.index])) def click_right(self,event): if self.index>0: self.index-=1 self.comb.set('{}'.format(self.list2[self.index])) def select(self,event): self.index=self.comb.current() print(self.index) print(self.list1[self.index]) #print(list1[self.index]) def submit(self): self.text2.delete(0.0,END) content=self.text1.get(0.0,END).replace('\n',' ') print(content) text=self.fanyi.crawler(content,self.list1[self.index]) #text=self.fanyi.crawler(content,list2[self.index]) #print(text) if text: for i in text: self.text2.insert(END,(i['tgt']+'\n')) else: messagebox.showerror('error','translate failure') def clean_all(self): self.text1.delete(0.0,END) self.text2.delete(0.0,END) def run(self): self.window.mainloop() if __name__=='__main__': a=GUI() a.run()
有错误的地方希望大佬们指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。