1. 源码
import requests
import json
import random
import time
import hashlib
class Youdao(object):
def __init__(self,word):
self.url='https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
self.word=word
self.headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.39",
'Cookie':'OUTFOX_SEARCH_USER_ID=-120041047@10.108.162.138; OUTFOX_SEARCH_USER_ID_NCOO=781515876.4212875; fanyi-ad-id=305560; fanyi-ad-closed=1; UM_distinctid=1802bf305833f3-013930fe6ba678-48667e5c-1fa400-1802bf30584424; JSESSIONID=aaaqD4BLo71KPh6Iv_Ray; ___rl__test__cookies=1650008270898',
"Referer": "https://fanyi.youdao.com/?keyfrom=dict2.index"}
self.key='Ygy_4c=r#e#4EX^NUGUc5' #一个关键的东西
#post请求需要传输的data参数
def data_dict(self):
lts=str(int(time.time() * 1000)) #生成时间戳
salt=lts + str(random.randint(0, 9))
sign1="fanyideskweb" + self.word + salt + self.key #未加密
sign2=hashlib.md5(sign1.encode()).hexdigest() #哈希值加密
data_dict={
"i": self.word,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": salt,
"sign": sign2,
"lts": lts,
"bv": "8c5b4ecb9f7fdfe6b297ab984775a98",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"}
return data_dict
# 提取响应结果
def Get_contents(self):
response=requests.post(url=self.url,headers=self.headers,data=self.data_dict())
data=json.loads(response.content)
print('待译内容:'+self.word)
print('翻译结果:'+data['translateResult'][0][0]['tgt'])
try:
strs=','.join([i.strip() for i in data['smartResult']['entries'] if i.strip() !=''and i.strip() !=data['translateResult'][0][0]['tgt']])
if len(strs)>0:
print('相关结果:'+strs)
except:
print('没有其他相关结果')
if __name__ == '__main__':
wors=input('请输入中文内容')
youdao=Youdao(wors)
data=youdao.Get_contents()
2. 运行结果
3. 解析
在浏览器右键单击检查,找到我们需要的post请求,多次输入中文,查看其表单数据的变化。发现lts
,salt
,sign
这三个值在变化。
通过分析发现(全局搜索),在fanyi.min.js里面找到了这三个相关数据
lts
:一个时间戳salt
:时间戳加个随机数sign
:“fanyideskweb” + 时间戳 + 要翻译的内容 + “Ygy_4c=r#e#4EX^NUGUc5”,结果进行过加密。
4. 替换
上列代码你只需要在def __init__(self,word)
里面替换你自己的self.headers
和self.key
。
self.key
的值在浏览器右击检查,搜索n.md5("fanyideskweb"+e+i+
(搜索在右上角那三个小点点),后面紧跟的值就是我们需要的。
5. 说明
此方法截至发稿时可用,此爬虫无非就是对找到我们需要的post请求,确定请求网址,对表单数据进行多次对比。我们找到了三个在不停变化的值,通过经验很容易得出lts
,salt
与时间戳有关。最后一个sign
则需要在源码里面全局搜索,很明显它是一个键值对,对其稍加分析即可知道他怎么来的(前提得会点Js)。我用的是Edge浏览器,所以是中文的。
此代码仅供学习使用