有道翻译
目标:使用python的post功能向该网页中提交翻译内容,并返回结果。
- 获取有道翻译post发送信息的网站:F12--network--all--找到Request Method:POST的一项,其中的Headers中general就是发往服务器的网址。
- post表格形式:在该项最后有Form Data就是表格形式:
表格形式如下:
'i': trans_str,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
'typoResult': 'True'
真实发去的形式:i=hello%0A&from=AUTO&to=AUTO&smartresult=dict&client=fanyideskweb&salt=1512717804298&sign=9423bd6df96d0bbc5403db99d44691ea&doctype=json&version=2.1&keyfrom=fanyi.web&action=FY_BY_ENTER&typoResult=false
- 头信息:headers:
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.9
Content-Length:201
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Cookie:OUTFOX_SEARCH_USER_ID_NCOO=493676007.9814818; _ntes_nnid=a7f22502fe6d2b3cb13f2c26de0ae65f,1512699043959; JSESSIONID=abcZkCYYfkyNHfvsh_0aw; SESSION_FROM_COOKIE=fanyiweb; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; OUTFOX_SEARCH_USER_ID=1885701466@219.142.224.73; ___rl__test__cookies=1512717804296
Host:fanyi.youdao.com
Origin:http://fanyi.youdao.com
Proxy-Connection:keep-alive
Referer:http://fanyi.youdao.com/?keyfrom=dict2.index
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
X-Requested-With:XMLHttpRequest
- 解析post表格含义,并创建真实的表格数据,以发送到服务器被识别。
参考文章:Python爬虫,破解有道翻译接口参数
我直接使用他的函数生成的表格信息,向大神致敬。
大致过程:找到salt和sign生成对应的js文件,找到Source文件夹中Ctrl+F搜索salt或者sign找到的对应文件fanyi.min.js
,然后保存到本地。使用在线js格式化工具格式化代码,网址:http://tool.oschina.net/codeformat/js/。找到与network中post递交的Form大致一样的部分。
t.translate = function(e, t) {
T = u("#language").val();
var n = b.val(),
r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)),
o = u.md5(E + n + r + O),
a = n.length;
if (D(), x.text(a), a > 5e3) {
var l = n;
n = l.substr(0, 5e3),
o = u.md5(E + n + r + O);
var c = l.substr(5e3);
c = (c = c.trim()).substr(0, 3),
u("#inputTargetError").text("有道翻译字数限制为5000字,“" + c + "”及其后面没有被翻译!").show(),
x.addClass("fonts__overed")
} else x.removeClass("fonts__overed"),
u("#inputTargetError").hide();
f.isWeb(n) ? i() : s({
i: n, //待翻译内容
from: _, //可默认为Auto
to: C, //可默认为Auto
smartresult: "dict",
client: E, //fanyideskweb
salt: r, //需要模拟的参数1
sign: o, //需要模拟的参数2
doctype: "json",
version: "2.1",
keyfrom: "fanyi.web",
action: e || "FY_BY_DEFAULT",
typoResult: !1
},
t)
},
t.showResult = a
其中salt:r = "" + ((new Date).getTime() + parseInt(10 * Math.random(),10))
,含义:
-
((new Date).getTime() :返回new Date距 1970 年 1 月 1 日之间的毫秒数
。
替代为python代码为:time.time()*1000。time.time()当前时间的时间戳(1970纪元后经过的浮点秒数),故乘以1000
, -
parseInt(10 * Math.random(),10))
:以十进制(也可以是2、8)解析10 * Math.random()
(0到10之间的随机数,不包括0和10),得到一个十进制的随机整数。
python代替:str(int(time.time() * 1000) + random.randint(1, 9))
- 完整代码如下:
import hashlib
import time
import random
import requests
def create_Data(trans_str):
salt = int(time.time() * 1000) + int(random.random() * 10)
client = 'fanyideskweb'
a = "rY0D^0'nM0}g5Mm1z%1G4"
m = hashlib.md5()
digStr = client + trans_str + str(salt) + a
m.update(digStr.encode('utf-8'))
sign = m.hexdigest()
data = {
'i': trans_str,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
'typoResult': 'True'
}
return data
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=null"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0",
}
trans_str = '你好'
payload = create_Data(trans_str)
r = requests.post(url, data=payload, headers=headers)
print(r.json())
要根据情况修改headers的信息和表格data的信息。 执行会出现{'errorCode': 50}的情况,解决办法:将url中 http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=null
的_o
去掉即可,这样可访问。原因不知,好像得到翻译结果差了些。