python 爬虫 百度翻译pc端

这个是个原始页面
python 爬虫 百度翻译pc端
我们要做的就是把右下角这个字典里的内容拿出来

第一步先找到请求地址,测试下是否可以爬取
python 爬虫 百度翻译pc端
经过尝试,发现如果要获取数据,必须传以上这些参数
其他参数都已知,需要**的是sign
通过搜索接口地址,找到js文件中发送请求的部分
python 爬虫 百度翻译pc端
发现sign是这个函数的结果
python 爬虫 百度翻译pc端
通过调试,定位到这个m函数的本体
python 爬虫 百度翻译pc端
把这段js代码复制过来,在python里用js2py运行
python 爬虫 百度翻译pc端
运行之后报错,发现少参数i,经过研究后发现i是个定值,复制进代码,继续运行
这时还会报错,说找不到n
去原始的js代码里找叫n的函数,复制过来,继续运行,发现参数出来了,和用浏览器访问时请求的参数一致。
python 爬虫 百度翻译pc端
但是返回的数据是一段字典,要获取具体的翻译还需要做一些提取工作
原始结构是这样的
python 爬虫 百度翻译pc端
python 爬虫 百度翻译pc端
提取出来
python 爬虫 百度翻译pc端
python 爬虫 百度翻译pc端
最终结果

以下是完整代码:
开发工具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'])