这个是个原始页面
我们要做的就是把右下角这个字典里的内容拿出来
第一步先找到请求地址,测试下是否可以爬取
经过尝试,发现如果要获取数据,必须传以上这些参数
其他参数都已知,需要破解的是sign
通过搜索接口地址,找到js文件中发送请求的部分
发现sign是这个函数的结果
通过调试,定位到这个m函数的本体
把这段js代码复制过来,在python里用js2py运行
运行之后报错,发现少参数i,经过研究后发现i是个定值,复制进代码,继续运行
这时还会报错,说找不到n
去原始的js代码里找叫n的函数,复制过来,继续运行,发现参数出来了,和用浏览器访问时请求的参数一致。
但是返回的数据是一段字典,要获取具体的翻译还需要做一些提取工作
原始结构是这样的
提取出来
最终结果
以下是完整代码:
开发工具pycharm
编译器版本:python3.6
需要装的包:requests, js2py, json
import requests
import js2py
import json
# 获取sign
word = input('输入:')
# 创建上下文对象
context = js2py.EvalJs()
# 执行js获得结果
with open('百度翻译的.js','r',encoding='utf-8') as f:
context.execute(f.read())
sign = context.e(word)
print('sign',sign)
# 准备参数
url = 'https://fanyi.baidu.com/v2transapi'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
"Cookie": "BAIDUID=C3901397F0ADDA16063801114B3B5C2F:FG=1; BIDUPSID=C3901397F0ADDA16063801114B3B5C2F; PSTM=1537772740; to_lang_often=%5B%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%5D; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; from_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1547903182; BDUSS=-; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; H_PS_PSSID=1446_21103_28608_28584_28557_28603_28625; PSINO=5; locale=zh; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1551934850,1551935089,1551935474,1551935483; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1551935483",
"Referer": "https://fanyi.baidu.com/?aldtype=1604"
}
# 请求方式是post 所以准备一下需要提交的参数
data = {
'from':'en',
'to':'zh',
'query': word,
'sign': sign,
'token':'80c7de3fa6aa8934219322735de33dc1'
}
response = requests.post(url,headers=headers,data=data)
result = json.loads(response.content)
print(result["trans_result"]['data'][0]['dst'])