1、寻找目标网站真正url地址
我们进入百度翻译,打开检查,选中network,在翻译框里面输入what,选中preview,在出现的Name里面查找,发现在v2transapi里有翻译结果出现,再过去看Headers。
发现真正的url为:https://fanyi.baidu.com/v2transapi
请求方式为:post
返回的数据格式为:json
在往下能看到cookie、referer、user-agent、Form Data等信息
我们通过对比发现form表单中的数据query和sign是可变的,其中query为我们输入的字段,下面就只剩下sign了
输入url中的参数v2transapi在search中敲回车,跳到那个页面
发现来到Sources下面的js文件,在ajax里面找到v2transapi,给ajax处打一个断点
发现p就是我们form表单里的数据,于是我们向上找p
p里面包含了我们的参数,下面关键的就是找sign这个参量,发现sign是由m函数返回的,点一下m,跳转到它对应的e®函数,如下图所示
我们发现这个函数有些看不懂,它是经过加密的js代码,我们把这个函数拷到pycharm里面,在里面新建一个js文件,把它粘进去,下面就是让他转为py文件执行,需要用到一个js2py的库。代码如下:
import requests, js2py, json
content = js2py.EvalJs()
with open('sing.js', 'r', encoding='utf-8') as f:
content.execute(f.read())
url = 'https://fanyi.baidu.com/v2transapi'
query = input('请输入待查询字符:')
sign = content.e(query)
data = {
'from': 'en',
'to': 'zh',
'query': query,
'simple_means_flag': '3',
'sign': sign,
'token': 'f9588cc5d9e36acf34058543eb278ac2'
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
'referer': 'https://fanyi.baidu.com/?aldtype=16047',
'cookie': 'BAIDUID=4CE621B4E3428D45096B717FC6ADA993:FG=1; BIDUPSID=4CE621B4E3428D45096B717FC6ADA993; PSTM=1541988307; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; locale=zh; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1561044155,1561044204,1561044375,1561044738; BDRCVFR[mkUqnUt8juD]=mk3SLVN4HKm; delPer=0; H_PS_PSSID=1460_21086_29135_29238_29099_29369_28835_29221; PSINO=1; 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; 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; yjs_js_security_passport=8de6720ba5daf9234eccb96e9a3c0eddf677110a_1561089960_js; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1561089869,1561089898,1561089956,1561090914; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1561090914'
}
res = requests.post(url=url, data=data, headers=headers)
print(json.loads(res.text))
会发现报错如下:js2py.internals.simplex.JsException: ReferenceError: i is not defined
我们再去函数e®的i处打一个断点,会发现i=320305.131321201,且其值不变,我们把它占到js代码里面,eg:
接着运行py文件,发现报错信息如下:n没有定义,我们再去Chrome控制台去找n
发现n为一个函数,我们跳到这个函数
把n这个函数粘到js代码里
这时再去执行py文件就会发现,有结果输出
提取结果:
当然可以从移动端抓取,会发现Form表单少一个参数,返回的结果数据结构也简单一些。
会发现参数少了一个,接口不同,抓取思路是一样的,需要注意的是移动端与网页端user-agent不同。