欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

英语翻译太难?我一怒之下用爬虫写了两个翻译脚本

时间:2023-05-30
 个人简介

 作者简介:大家好,我是阿牛 个人主页:馆主阿牛 支持我:点赞收藏⭐️留言 系列专栏:python网络爬虫格言:迄今所有人生都大写着失败,但不妨碍我继续向前!



这里写目录标题

 个人简介 前言

百度翻译版本(简单)

分析代码结果 有道翻译版本(困难)

分析(js逆向)代码结果 结语 前言

它来了!它来了!作为一名程序员,英语句子不会翻译,这我不能忍,必须安排脚本!!!

百度翻译版本(简单) 分析

进入百度翻译,F12进入网络中的全部,在你写你要翻译的东西时,在网络中的全部中可以看到sug这个链接,就是我们的接口url,参数是kw。

代码

import requestspost_url='https://fanyi.baidu.com/sug'headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}word = input('请输入你要翻译的,可以为各种语言:')data = { 'kw': word}response = requests.post(url=post_url,data=data,headers=headers)dic_obj = response.json() #将json数据转换为字典print(dic_obj['data'][0]['v'])

结果


有道翻译版本(困难) 分析(js逆向)

F12进入到开发者模式,在网络中的xhr(找ajax请求的地方)中找到下图接口。

然后我们看参数:


两张图比较得出,i 应该就是我们要翻译的句子,画绿线的是不相同表单的参数,需要我们处理,Its一看就是13位的时间戳,salt英文意思是盐,且比时间戳lts多一位,前面十三位都一样,应该是个加盐时间戳(对于某串数字可以进行加一串数字或字符串再进行加密,在加密中我们叫加盐),这两个参数我们完全可以用python单独模拟,为了避免不必要的麻烦或者有些人不会,我们后面直接找到他们的js语句,用python执行js生成就行。

而这里的sign一看有32位,应该是某种加密算法产生的,最常见的就是md5和rsa加密了,下面我们进行全局搜索js逆向:


经过搜索,我们发现了老盆友md5加密,也找到了参数的生成方式,图中js里的r就是时间戳,js里的i就是加盐时间戳,sign是用md5加密的括号里的字符串,还要分析e的产生,可以通过打断点调试找出。

可以看到e就是我们要翻译的东西,现在参数都明显了,我们最简单的其实调用python中的hashlib模块中的md5加密算法就可以得到sign,但这里我们不用,加大难度,练习js逆向。我把直接提取到的md5加密过程的js文件放到网盘里,大家自己提取,代码中要用。

链接:https://pan.baidu.com/s/1aV1tEo35Oyw4TUExhJoXUA
提取码:waan

同时,为了应对反爬,不仅要加User-Agent,还要加cookie和Referer。

代码

import requestsimport execjs #执行js语句的模块import jsonimport jsonpathclass Youdao(): def __init__(self,msg): # url self.url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' # headers self.headers = { 'User-Agent': 'Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 91.0.4472.124Safari / 537.', 'cookie': 'OUTFOX_SEARCH_USER_ID = -1032338096@10.169.0.102;OUTFOX_SEARCH_USER_ID_NCOO = 39238000.072458096;JSESSIonID = aaak-QLUNaabh_wFWK8Qx;___rl__test__cookies = 1626662199192', 'Referer': 'https://fanyi.youdao.com/' } self.msg = msg self.Formdata = None def js_Formdata(self): #时间戳 r = execjs.eval('"" + (new Date).getTime()') #时间戳加盐 i = r + str(execjs.eval('parseInt(10 * Math.random(), 10)')) ctx = execjs.compile(open('./youdao.js', 'r', encoding='utf-8').read()) sign = ctx.call('getsign', self.msg,i) #调用youdao.js里的getsign函数,将要翻译的东西和加盐时间戳传进去。 self.Formdata = { 'i': self.msg, 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': i, 'sign': sign, 'lts': r, 'bv': 'f46e446c6db49492797b7d03ea1e82da', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTlME', } def response(self): resp = requests.post(url=self.url,data=self.Formdata,headers=self.headers).text data = json.loads(resp) #将json数据转换成字典 #利用jsonpath提取数据 if "translateResult" in data: k = jsonpath.jsonpath(data, '$..translateResult')[0][0][0]['tgt'] print(k) print("其他翻译:") if "smartResult" in data: lst = jsonpath.jsonpath(data, '$..entries')[0] for k in lst[1:]: k = k.replace("rn", "") print(k) def main(self): #Formdata self.js_Formdata() #print(self.Formdata) #发送请求,获取响应 self.response()if __name__ == '__main__': msg = input('请输入你要翻译的词或句子:') youdao = Youdao(msg) youdao.main()

结果


结语

觉得博主写的不错的话给个三连哦!!!

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。