1.爬取分析
实现一键翻译功能,最简单的方案当然是我们的爬虫啦,这里,我选择的是 有道翻译
这个页面,在左边输入文字,那么浏览器会把你输入的信息传输给服务器。再返回对应的内容。这就是一个典型的Post操作。我们可以在XHR中查看数据的传送方式
reques url 就是我们要请求的网址
fromdata里面就是我们要提交的数据
- i:需要翻译的内容
- from:翻译内容的语言
- to:翻译成什么语言
所以可以通过改变from/to,来实现不同语言之间的翻译,而后面的salt,sign,its目前还看不懂,这正是后面要破解的有道翻译的反爬机制。
2 .破解反爬
普通的破解方法是将请求网址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获取这段字符串。接下来就可以写代码实现我们的爬虫了。
3. 爬虫代码
这里主要写反爬部分的代码,完整源码在后面。
通过前面的分析我们知道想要翻译成不同语言,需要知道不同语言的代号,
观察网页源代码发现所有的语言代号都在ul标签下,所以这里我们也可以通过爬虫获取。
接下来就是UI界面了,我选用的是python自带的tkinter库
4. UI界面
这里简单介绍主要用到的几个控件
创建窗口:window=tkinter.TK()
窗口标题: window.title(“标题名”)
button按钮:按钮控件;在程序中显示按钮。
text控件:格式化文本显示。允许你用不同的样式和属性来显示和编辑文本。同时支持内嵌图象和窗口。
combobox:tkinter子类ttk的模块,时间下拉列表
label:标签
我的UI界面的最终样式
想了解跟多tkinter可参考博客
5.完整源码
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'