一、分析百度翻译
这跟有道翻译不同,有着另一种反爬机制,因此仍然使用pc端网站接口会报997错误
所以这次爬虫使用手机端地址进行爬取:1
self.url='https://fanyi.baidu.com/basetrans'
注意的是其他headers及data明细也要使用手机网页端的。
二、使用mitmproxy进行抓包
暂时关闭我的arch的iptables 之后在同一局域网内将手机的代理设置为电脑端的ip 端口使用默认的8080
其次安装证书是必不可少的。
至此就可以实现mitmproxy监听手机端了
token需要使用手机端的
sign的产生和电脑网页端的生成方式是一样的,都是需要执行js代码生成。
- 附上JS代码:baidu_translate.js
1 | function n(r, o) { |
Python代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58import execjs
import requests
# python爬取百度翻译返回:{'error': 997, 'from': 'zh', 'to': 'en', 'query 问题
# 修改url为手机版的地址:http://fanyi.baidu.com/basetrans
# User-Agent及token等也用手机版的
class baiduTranslateJs(object):
def __init__(self,query):
self.query=query
self.url='https://fanyi.baidu.com/basetrans'
self.headers={
'x-requested-with': 'XMLHttpRequest',
'content-type':'application/x-www-form-urlencoded',
'referer':'https://fanyi.baidu.com/?aldtype=38319&tpltype=sigma',
'accept-encoding':'gzip, deflate, br',
'accept-language':'zh-CN,zh;q=0.9',
'cookie': 'BIDUPSID=B672909954F5126364A994D3D59115E1; BAIDUID=98D32FCD46AF8B942922DDA6B2980992:FG=1; rsv_i=1fa0LaBzzVsbkiCumF7bn0XUoEF9g89aI6Q4H%2FRe0dYzGkDRF8Y7BFQhi4nLKbg2ubD%2F%2BYYX6gEIExHQ3qICdYeKn28ASUE; FEED_SIDS=536472_0816_22; BDORZ=AE84CDB3A529C0F8A2B9DCDD1D18B695; SE_LAUNCH=5%3A26099434_0%3A26099434_15%3A26099434; H_WISE_SIDS=125703_132919_135072_128065_120179_132910_133041_131247_132439_130762_132378_131517_118883_118869_118850_118818_118791_107311_132781_122034_133352_134795_132553_129651_132250_124637_128968_133473_133838_133847_132551_132336_134462_134319_134047_134214_129646_131423_134818_133191_110085_134153_127969_131298_127318_127417_134151_134231; delPer=0; PSINO=6; locale=zh; Hm_lvt_afd111fa62852d1f37001d1f980b6800=1565966061,1565966204; Hm_lpvt_afd111fa62852d1f37001d1f980b6800=1565966204; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1565966061,1565966204; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1565966204',
'user-agent': 'Mozilla/5.0 (Linux; Android 9; TA-1041) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.101 Mobile Safari/537.36'
}
self.data={
'query': self.query,
'from': 'auto', #将这里的en改成auto就可以自动识别语言了
'to': 'auto', #将这里的zh改成auto就可以自动识别语言了
'sign': '',
'token': 'e32d652ac93e4d95b6b9eb9768fbadb1'
}
def structure_form(self):
"""
读取js文件
执行js代码得到sign值
构造新的表单
:return:
"""
with open('/home/lsp/py/lsls/js_spider/baidu_translate.js', 'r', encoding='utf-8') as f:
ctx = execjs.compile(f.read())
sign = ctx.call('e', self.query) # 54706.276099
print(sign)
self.data['sign']=sign
def get_response(self):
"""
通过构造的新的表单数据,访问api,获取翻译内容
:return: 翻译结果
"""
self.structure_form()
# print(self.headers)
print(self.data)
response = requests.post(self.url, headers=self.headers, data=self.data).json()
# print(response.status_code)
# print(json.loads(response))
print(response)
r = response['trans'][0]['dst']
return r
if __name__ == '__main__':
trjs=baiduTranslateJs('hello world!')
r=trjs.get_response()
print(r)