- 一、需求
- 二、思路分析
- 三、遇到的问题及解决措施
- 四、代码分享
二、思路分析爬虫实现“有道翻译”
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 requests
import time
import random
import hashlib
while 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 = "https://fanyi.youdao.com/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": "https://fanyi.youdao.com/"
}
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 # 跳出本次循环,进行下一次循环
- 写在最后:有任何代码问题,欢迎交流~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)