文章目录
一、需求二、思路分析三、遇到的问题及解决措施四、代码分享一、需求
爬虫实现“有道翻译”
二、思路分析
1、明确目标url
抓包前可以清空网页加载出来的数据包;抓包过程中可以查看preview或者response响应是否有我们所需要的数据,以此确认url
2、向url发送请求、获取对应的响应
向目标网址发送请求时,需要确定请求方式–post请求,需要携带data参数,提交表单数据
3、提取翻译的结果
结果发现,无法获取到翻译信息,出现了errorCode
三、遇到的问题及解决措施
(1)观察流程
a. 观察发现,form data中的sign、salt、lts的值会随着翻译内容i的变化而变化
b. 有一定反爬经验的话,可以猜测lts是时间戳,经过时间戳在线转换工具的验证,确实如此
c. 观察发现,salt的值和lts的有点像,salt就是在lts后面加了一个数字(加盐操作)
实际上,sign是在js文本中的js代码中加密生成的,那么我们需要在对应的js代码中找到其加密过程
(2)分析流程
r = "" + (new Date).getTime() # r: 获取时间戳i = r + parseInt(10 * Math.random(), 10) # i: r + 一个随机数字return {ts: r,# ts: 以毫秒为单位的格林尼治时间戳bv: t,salt: i, # salt: 时间戳+一位随机数字sign: n.md5("fanyideskweb" + e + i + "Ygy_4c=r#e#4EX^NUGUc5") # sign: 使用md5加密算法对明文参数加密得到的密文,e是翻译内容,i也是salt}lts:ts # lts:以毫秒为单位的格林尼治时间戳
(3)结论
(1)lts – 以毫秒为单位的格林尼治时间戳
int(time.time()*1000)
(2)salt – 以毫秒为单位的格林尼治时间戳 + 一个随机数字
int(time.time()*1000) + random.randint(0,9)
(3)sign – n.md5(“fanyideskweb” + e + i + “Ygy_4c=r#e#4EX^NUGUc5”)
hashlib.md5(明文参数.encode()).hexdigest()
四、代码分享
代码完善:
当输入“有道翻译”无法翻译的内容时,会报错,所以可以使用try…except…捕获异常使用while True循环翻译
import requestsimport timeimport randomimport hashlibwhile True:content = input("请输入你要翻译的内容:")lts = int(time.time() * 1000)salt = lts + random.randint(0, 9)sign_para = "fanyideskweb" + str(content) + str(salt) + "Ygy_4c=r#e#4EX^NUGUc5"sign = hashlib.md5(sign_para.encode()).hexdigest()url = "/translate_o?smartresult=dict&smartresult=rule"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36","Referer": "/"}form_data = {"i": content,"from": "AUTO","to": "AUTO","smartresult": "dict","client": "fanyideskweb","salt": str(salt),"sign": str(sign),"lts": str(lts),"bv": "ac3968199d18b7367b2479d1f4938ac2","doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_REALTlME"}response = requests.post(url, headers=headers, data=form_data)try:dict_data = response.json() # 解析json参数print("翻译结果:", dict_data["translateResult"][0][0]["tgt"]) # 除此方法,也可以使用jsonpath解析数据except:print("您输入的内容无法翻译,请重新输入..")continue # 跳出本次循环,进行下一次循环
写在最后:有任何代码问题,欢迎交流~
如果觉得《有道翻译js逆向解析》对你有帮助,请点赞、收藏,并留下你的观点哦!