python爬虫+百度翻译实现英文—中文翻译

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不同。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42306041/article/details/93183327