说明
该网站是有反爬措施的,主要的措施是JS加密参数,随机COOKIE参数
目的:
我们希望获取翻译接口,可以使用代码调用其接口来做翻译。
操作
1、打开浏览器进入网站,随便输入一个需要翻译的内容
这是主要的几个参数,其他的参数包含了翻译的规格,以及一些无关的参数。。
其中 i 是我们需要翻译的内容
salt 很明显是时间戳
所以最主要的参数还是sign
我们在源码中可以很明确看到
可以看出sign的构造格式
md5("fanyideskweb" + e + t + "sr_3(QOHT)L2dx#uuGR@r")
实际上e就是翻译的内容 i,t就是时间戳salt,这样一来,sign也就出来了。
最后
最后我们把这些参数构造好之后,发现还是没办法获取真实的翻译结果,参数是没问题了,那就看headers,通过实践和经验也可以看出,cookie里面有一个参数OUTFOX_SEARCH_USER_ID=-298057617@10.135.5.21;,发现这个参数是不可缺少的,经过实践测试,前面是一个9位数的数,后面是类似ip的格式,我们就构造成ip。
完整代码如下
# coding=utf8
import time
import random
from hashlib import md5
import requests
import json
class YoudaoFanyi(object):
def __init__(self):
self.headers = {
'Pragma': "no-cache",
'Origin': "http://fanyi.youdao.com",
'Accept-Encoding': "gzip, deflate",
'Accept-Language': "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8",
'Accept': "application/json, text/javascript, */*; q=0.01",
'Cache-Control': "no-cache",
'X-Requested-With': "XMLHttpRequest",
'Connection': "keep-alive",
'Referer': "http://fanyi.youdao.com/",
'Cookie': "OUTFOX_SEARCH_USER_ID=-{0}@{1}.{2}.{3}.{4}; ".format(str(random.randint(100000000,999999999)), str(random.randint(10, 241)), str(random.randint(10, 241)), str(random.randint(10, 241)), str(random.randint(10, 241))),
}
def fanyi(self, text):
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
# 有两个参数需要解析
# salt
#sign
# ===源码===
# var t = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10));
# return {
# salt: t,
# sign: n.md5("fanyideskweb" + e + t + "sr_3(QOHT)L2dx#uuGR@r")
# }
t = int(time.time() * 1000) + random.randint(0,11)
# e就是查询的关键字
sign_str = ("fanyideskweb" + text + str(t) + "sr_3(QOHT)L2dx#uuGR@r").encode("utf-8")
sign = md5(sign_str).hexdigest()
data = {
"i": text,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": str(t),
"sign": sign,
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTIME",
"typoResult": "false"
}
r = requests.post(url, data=data, headers=self.headers)
res = json.loads(r.text)
result = res.get("translateResult")[0][0].get("tgt")
return result
if __name__ == "__main__":
fayi = YoudaoFanyi()
result = fayi.fanyi(u"你也在学习网易有道爬虫吗?")
print result