社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
思路:进入到百度翻译(https://fanyi.baidu.com/),首先要找到返回数据的接口:
思路:既然接口找到了,开始模拟浏览器发送请求。发送请求的数据是什么,请求头会不会有要求?这些都需要去考虑,去找规律:
请求接口:https://fanyi.baidu.com/v2transapi
请求方式:POST
请求参数:
from: zh
to: en
query: 喜欢
transtype: translang
simple_means_flag: 3
sign: 64916.269989
token: e3f945758e2f3ef4e897e4bcd6f653db
思路:发现不带header会出问题,最终会发现其实header里面只有Cookie发挥了作用,所以同样在headers里面把request header:
思路:经过对比翻译不同的东西发现请求参数的sign根据不同的翻译内容改变,所以接下来的目标就是找sign的规律。这段规律是通过找博客直接dowm下来用的参考(https://blog.csdn.net/z434890/article/details/85008821),具体怎么去搞定sign,我也得好好研究一下。po出最终的代码:
import json
import requests
import execjs
class BaiDuTranslate():
def init(self):
self.base_url = ‘https://fanyi.baidu.com/v2transapi’
self.word = input(“请输入要翻译的单词:”)
def send_request(self, params, header):
"""
发送请求
:param params: data参数
:param header: 请求头
:return:
"""
response = requests.post(url=self.base_url, headers=header, data=params).content.decode()
results = json.loads(response)
result = results["trans_result"]["data"][0]["result"][0][1] #解析返回的json获取返回值
return result
def parse_sign(self):
"""
# https://blog.csdn.net/z434890/article/details/85008821 查找资料得到sign值
:return: sign值
"""
jsCode = """
function a(r) {
if (Array.isArray(r)) {
for (var o = 0, t = Array(r.length); o < r.length; o++)
t[o] = r[o];
return t
}
return Array.from(r)
}
function n(r, o) {
for (var t = 0; t < o.length - 2; t += 3) {
var a = o.charAt(t + 2);
a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
}
return r
}
var i = null;
function e(r) {
var t = r.length;
t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
var u = void 0, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
u = null !== i ? i : (i = '320305.131321201' || "") || "";
for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
var A = r.charCodeAt(v);
128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
S[c++] = A >> 18 | 240,
S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
S[c++] = A >> 6 & 63 | 128),
S[c++] = 63 & A | 128)
}
for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
p += S[b],
p = n(p, F);
return p = n(p, D),
p ^= s,
0 > p && (p = (2147483647 & p) + 2147483648),
p %= 1e6,
p.toString() + "." + (p ^ m)
}
"""
sign = execjs.compile(jsCode).call("e", self.word)
return sign
def main(self):
sign = self.parse_sign() # 获取解析后的sign
params = {"from": "zh",
"to": "en",
"query": self.word,
"transtype": "translang",
"simple_means_flag": "3",
"sign": sign, # 问题1:不同的搜索关键字值不一样,找出sign的处理方式
"token": "7c7080081fc1d32690394ea107924e0a"} # post请求参数
headers = {
# "Accept": "*/*",
# "Accept-Encoding": "gzip,deflate,br",
# "Accept-Language": "zh-CN,zh;q=0.9",
# "Connection": "keep-alive",
# "Content-Length": "136",
# "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "BAIDUID=6ACF9C6D814D61BB34FF9B6E42C4FDE0:FG=1; BIDUPSID=6ACF9C6D814D61BB34FF9B6E42C4FDE0; PSTM=1557366108; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=26522_1428_21078_28519_28772_28721_28964_28835_28585_28604_22157; delPer=0; PSINO=2; ZD_ENTRY=baidu; locale=zh; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1557452953; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1557453216; to_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; from_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",
# "Host": "fanyi.baidu.com",
# "Origin": "https://fanyi.baidu.com",
# "Referer": "https://fanyi.baidu.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
# "X-Requested-With": "XMLHttpRequest"
} # 请求头
result = self.send_request(params, headers)
print(result)
if name == ‘main’:
while True:
translate = BaiDuTranslate()
translate.main()
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!