爬取有道翻译的两种做法!开源免费!!!

Eranthe ·
更新时间:2024-09-21
· 867 次阅读

一、需要用到的工具:
先把格式化js的线上网址记录一下:http://tool.chinaz.com/Tools/jsformat.aspx
二、分析流程、
有道翻译分析过程
(1)翻译过程中会发起请求 response中可以看到响应的结果
(2)Headers最下面,Form Data许多的数据,这些数据就是在点击翻译的时候浏览器给服务器发送的数据
在这里插入图片描述
查看此处
(3)
i:需要进行翻译的字符串。
salt:加密用到的盐。这个是我们破解有道反爬虫机制的关键点。
sign:签名字符串。也是破解反爬虫机制的关键点

(4)比较每次翻译时候发送的Form Data的值。我们注意到,Form Data在每次发送网络请求的时候,只有i和salt以及sign这三个是不同的,其他的数据都是一样的
图片: https://uploader.shimo.im/f/Rrk4LH7N164mKRVb.png
在这里插入图片描述

(5)每次发送翻译请求的时候,并没有一个请求是专门用来获取这两个值的:
图片: https://uploader.shimo.im/f/8sTHSUy3lZwLOS8n.png
(6)那就是在本地自己生成的,如果是在本地自己生成的,那么规则是什么呢?这里我们点击网页,查看网页源代码,查找所有的JS文件,我们找到那个fanyi.js:
在这里插入图片描述
根据分析:salt sign 两个值为所需要破解的密钥
话不多说,上代码:

方法1:urllis方法爬取: import json from urllib import parse, request import time,random import hashlib md5 = hashlib.md5() def getSign(key, salt): ''' 获取sign :param key: 要翻译的字符串 :param salt: 盐值 :return: ''' # 分析js得到sign是由常量"fanyideskweb"+要翻译的字符串+盐值+常量"Nw(nmmbP%A-r6U3EUn]Aj"组成 sign = "fanyideskweb" + str(key) + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj" sign = getmd5(sign)#调用md5加密,把写好的sign传递到加密方法中 return sign #得到的结果返回 def getmd5(v): ''' :param v: 传递过来写好的sign :return: ''' md5.update(v.encode("utf8"))#编码 sign = md5.hexdigest()#执行加密 return sign#返回 def fy(i): ''' 通过在js文件中查找salt或者sign,可以找到 1.可以找到这个计算salt的公式 r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)) 2. sign:n.md5("fanyideskweb" + t + r + "Nw(nmmbP%A-r6U3EUn]Aj"); md5 一共需要四个参数,第一个和第四个都是固定值得字符串,第三个是salt, 第二个参数是输入的需要翻译的单词 ''' req_url="http://fanyi.youdao.com/translate" ts = str(int((time.time() * 1000)))#时间戳 salt = str(ts) + str(random.randint(0, 10))#盐值 fanyidata = { "i":i, #要翻译的字符串 "from":"AUTO", "to":"AUTO", "smartresult":"dict", "client":"fanyideskweb", #写死的值 "salt": str(salt), #盐值 "sign":getSign(i, salt), #获取sign "ts":ts, #时间戳 "bv":"0ed2e07b89acaa1301d499442c9fdf79",#死值 "doctype":"json", #格式 "version":"2.1", #版本 "keyfrom":"fanyi.web", "action":"FY_BY_REALTIME", "typoResult":"false", } data=parse.urlencode(fanyidata).encode("utf-8") # 对数据进行编码处理 response=request.urlopen(req_url,data) #提交数据并解析 html=response.read().decode("utf-8")# 读取返回来的数据 print(html) #json格式 translate_results=json.loads(html) # 把返回来的json字符串解析成字典 print("translate_results======",translate_results) translate_results=translate_results["translateResult"][0][0]["tgt"] #翻译后的结果 print("翻译后的结果",translate_results) return translate_results if __name__=="__main__": # 项目入口首先要得到要翻译的字符串,给个输入框来获取 content = input('请输入需要翻译的句子:') d=content # 得到以后传给翻译接口 fy(d)

运行结果:
打印结果

方法2:requests爬取 import json import requests import time, random session = requests.session() import hashlib md5 = hashlib.md5() def getSign(key, salt): ''' 获取sign :param key: 要翻译的字符串 :param salt: 盐值 :return: ''' # 分析js得到sign是由常量"fanyideskweb"+要翻译的字符串+盐值+常量"Nw(nmmbP%A-r6U3EUn]Aj"组成 sign = "fanyideskweb" + str(key) + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj" sign = getmd5(sign)#调用md5加密,把写好的sign传递到加密方法中 return sign #得到的结果返回 def getmd5(v): ''' :param v: 传递过来写好的sign :return: ''' md5.update(v.encode("utf8"))#编码 sign = md5.hexdigest()#执行加密 return sign#返回 def youdao(key): ''' 通过在js文件中查找salt或者sign,可以找到 1.可以找到这个计算salt的公式 r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)) 2. sign:n.md5("fanyideskweb" + t + r + "Nw(nmmbP%A-r6U3EUn]Aj"); md5 一共需要四个参数,第一个和第四个都是固定值得字符串,第三个是salt, 第二个参数是输入的需要翻译的单词 ''' url = "http://fanyi.youdao.com/translate" ts = str(int((time.time() * 1000)))#时间戳 salt = str(ts) + str(random.randint(0, 10))#盐值 data = { "i":key, #要翻译的字符串 "from":"AUTO", "to":"AUTO", "smartresult":"dict", "client":"fanyideskweb", #写死的值 "salt": str(salt), #盐值 "sign":getSign(key, salt), #获取sign "ts":ts, #时间戳 "bv":"0ed2e07b89acaa1301d499442c9fdf79",#死值 "doctype":"json", #格式 "version":"2.1", #版本 "keyfrom":"fanyi.web", "action":"FY_BY_REALTIME", "typoResult":"false", } result =requests.post(url=url, data=data) resultdata=result.text#得到文本数据 # print("resultdata", resultdata) translateResult=json.loads(resultdata)# 把返回来的json字符串解析成字典 print("translateResult======", translateResult) translate_results = translateResult["translateResult"][0][0]["tgt"] # 翻译后的结果 print("翻译后的结果", translate_results) if __name__ == '__main__': # 项目入口首先要得到要翻译的字符串,给个输入框来获取 content = input('请输入需要翻译的句子:') d=content # 得到以后传给翻译接口 youdao(d) 运行结果:![结果](https://img-blog.csdnimg.cn/20200320200929738.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b211d3VodWl4dWU=,size_16,color_FFFFFF,t_70#pic_center) 拿走不谢,对您有帮助请点赞支持,谢谢!
作者:打不死的搬砖小强!



有道 开源

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章