初期操作
打开有道翻译界面—F12—Network—在翻译框中输入'hello'—在Network下面发现名为'translate_o?smartresult......'返回翻译之后的数据
分析参数
把所有的Request Headers、params都写上尝试爬虫,可以得到结果。
然后Request Headers中Headers、Host、Origin、Referer三项留下,Cookie一项经尝试只有 OUTFOX_SEARCH_USER_ID=-1927650476@223.97.13.65;会验证而且尝试多次之后我这里是没有变化的。
1
2
3
4
5
6
7
8
9
10
11
12
|
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: 252
Content - Type : application / x - www - form - urlencoded; charset = UTF - 8
Cookie: OUTFOX_SEARCH_USER_ID = - 1927650476 @ 223.97 . 13.65 ; OUTFOX_SEARCH_USER_ID_NCOO = 1897197670.972445 ; JSESSIONID = aaalvPunK - sv2fyR - UjEx; ___rl__test__cookies = 1612924426799
Host: fanyi.youdao.com
Origin: http: / / fanyi.youdao.com
Referer: http: / / fanyi.youdao.com /
User - Agent: Mozilla / 5.0 (Windows NT 10.0 ; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 88.0 . 4324.150 Safari / 537.36
X - Requested - With: XMLHttpRequest
|
再就是params参数,变化的是salt、sign、lts,尝试后发现lts可有可无,所以变化的只有salt、sign两项。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
i: 你好
from : AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16129244361391
sign: 2820759b6e54f25e0aa94e185e2265e3
lts: 1612924436139
bv: 3da01a09873456cfb5dba05f2124b148
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME
|
分析salt、sign
全局搜索sign,结果中有fanyi.min.js文件,双击进入,然后右键选择'Open in Source panel',搜索'sign',找到如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
define( "newweb/common/service" , [ "./utils" , "./md5" , "./jquery-1.7" ], function (e, t) {
var n = e( "./jquery-1.7" );
e( "./utils" );
e( "./md5" );
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@" )
}
};
|
可以看出salt是13位时间戳加了一个10以内的随机数,而sign是'固定字符串+e+i+固定字符串',其中i就是salt,而e经过断点调试(我选择在var t = n.md5(navigator.appVersion)这一行加断点,然后输入你好,会出现e='你好')可以得知e为我们要翻译的字符串。这样整个分析过程就结束了。
之后通过爬虫可以得到我们想要的数据,因为返回的是json数据,我们使用.json()来获得返回值更加方便。
Python代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import hashlib
import random
import time
import requests
def get_data():
r = str ( round (time.time() * 1000 ))
salt = r + str (random.randint( 0 , 9 ))
content = '你好'
data = "fanyideskweb" + content + salt + "Tbh5E8=q6U3EXe+&L[4c@"
sign = hashlib.md5()
sign.update(data.encode( "utf-8" ))
sign = sign.hexdigest()
# print(len(sign))
# print(sign)
return content, salt, sign
def send_request(content, salt, sign):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
'Cookie' : 'OUTFOX_SEARCH_USER_ID=-1927650476@223.97.13.65;' ,
'Host' : 'fanyi.youdao.com' ,
'Origin' : 'http://fanyi.youdao.com' ,
'Referer' : 'http://fanyi.youdao.com/' ,
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36' ,
}
data = {
'i' : str (content),
'from' : 'AUTO' ,
'to' : 'AUTO' ,
'smartresult' : 'dict' ,
'client' : 'fanyideskweb' ,
'salt' : str (salt),
'sign' : str (sign),
# 'lts': '1612879546052',
# 'bv': '6a1ac4a5cc37a3de2c535a36eda9e149',
# 'doctype': 'json',
'version' : '2.1' ,
'keyfrom' : 'fanyi.web' ,
'action' : 'FY_BY_REALTlME' ,
}
res = requests.post(url = url, headers = headers, data = data).json()
print ( '翻译后:' , res[ 'translateResult' ][ 0 ][ 0 ][ 'tgt' ])
print ( '翻译前:' , res[ 'translateResult' ][ 0 ][ 0 ][ 'src' ])
if __name__ = = '__main__' :
content, salt, sign = get_data()
send_request(content, salt, sign)
|
运行效果
以上就是python 实现有道翻译的详细内容,更多关于python 有道翻译的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/qx123/p/14451212.html