一、正常的爬虫流程:
如果你想爬取他的翻译界面,这个过程还是少不了的。首先,我们打开有道翻译的链接:http://fanyi.youdao.com/。然后在页面上右键-勾选-网络项。这时,你会来到网络监控窗口。您以后在此页面发送的所有网络请求都将显示在“网络”区域中。然后我们在翻译窗口中输入我们需要翻译的文字,比如hello。然后点击自动翻译按钮,然后就可以在下面看到浏览器向有道发送的请求。这是一个截图:
01.png 在上图中,我们可以看到发送了很多网络请求。这里我们点击第一个网络请求查看:
02.png 可以看到,当我们点击自动翻译时,发送的请求就是上图中Request URL的URL。然后我们点击Response就可以看到返回的结果:
03.png 现在我们回到Headers 区域,然后滚动到底部,可以看到一个Form Data 区域,里面显示了很多数据,这些数据就是你点击翻译发送的数据服务器到服务器:
04.png解释了一些比较重要的数据:
i:需要翻译的字符串。这里我们输入hello。 salt:用于加密的盐。这是我们破解有道反爬虫机制的关键点,后面会讲到。 Sign:签名字符串。这也是破解反爬虫机制的关键点。其他数据类型暂时不是很重要。它们都是用固定的方式写的。后面写代码的时候,直接穿鞋就可以了。到现在为止,我们已经可以编写一个简单的爬虫来调用有道翻译的接口了。这里我们使用的网络请求库是Python3自带的urllib。相关代码如下:
#导入需要的库
导入urllib.request
导入urllib.parse
导入json
# 等待用户输入需要翻译的单词
content=input("请输入需要翻译的单词:")
#有道翻译网址链接
url="http://fanyi.youdao.com/translate_o?smartresult=dictsmartresult=rulesessionFrom=null"
# 数据发送到有道服务器
数据={}
# 需要翻译的文本
数据["i"]=内容
# 以下是根据我们之前抓包得到的数据。
数据["来自"]="自动"
数据["到"]="自动"
数据["smartresult"]="字典"
data["client"]="fanyideskweb"
数据["盐"]="1500349255670"
数据["符号"]="997742c66698b25b43a3a5030e1c2ff2"
数据["doctype"]="json"
数据["版本"]="2.1"
data["keyfrom"]="fanyi.web"
数据["操作"]="FY_BY_CL1CKBUTTON"
数据["typoResult"]="true"
# 对数据进行编码
数据=urllib.parse.urlencode(data).encode("utf-8")
#创建Request对象,传入url和数据,注意使用的是POST请求
request=urllib.request.Request(url=self.url, data=data, method="POST")
#打开此请求
响应=urllib.request.urlopen(请求)
# 读取返回的数据
result_str=response.read().decode("utf-8")
# 将返回的json字符串解析成字典
result_dict=json.loads(result_str)
# 获取翻译结果
print("翻译结果为: %s" % result_dict) 我们运行这个文件后,输入hello,就可以得到正确的翻译结果哈罗。当我们输入其他需要翻译的字符串时,比如i love you,我们会得到一个错误代码{"errorCode":50}。这很奇怪。有道词典不能只翻译一个英文单词。这就是有道词典的反爬虫机制。接下来我们就破解有道词典的反爬虫机制。
二、破解反爬虫机制:
我们可以进行多次翻译,每次翻译后检查翻译时发送的网络请求,并比较每次翻译时发送的Form Data的值。我们注意到,Form Data每次发送网络请求时,只有i、salt和sign不同。其他数据都一样。这里我用hello和world这两个词来翻译Form Data。比较数据:
05.png06.png 图中的Form Data也印证了我刚才说的,那就是除了i、salt和sign之外,它们是不同的。其余的都是一样的。我的与众不同是很正常的。因为i 代表要翻译的字符串,所以这种差异是正常的。盐和记号是两个不同的东西。它们是怎么产生的?这里我们可以分析一下,这两个值每次请求的时候都不一样。只有两种情况:第一种是每次翻译的时候,浏览器都会从有道服务器获取这两个值。这样可以满足每次翻译的不同需求。第二个是使用JS代码按照一定的规则在本地生成的。那么我们先来看第一种情况。我们可以看到,每次发送翻译请求时,并没有专门使用请求来获取这两个值:
07.png 所以可以排除第一种情况。只剩下一种可能,那就是在本地生成。如果是本地生成的话,规则是什么?这里我们点击网页,查看网页源码,搜索所有JS文件,我们找到了fanyi.js:
08.png 然后点击这个文件跳转到源文件,然后选择所有代码,复制,然后打开站长工具:http://tool.chinaz.com/Tools/jsformat.aspx。复制代码后,点击格式:
09.png 然后复制格式化的代码,用sublime或者pycharm打开。然后搜索salt找到相关代码:
10.png 在这里我们可以发现所有值的生成原理。这里有一个介绍:
d:代表需要翻译的字符串。 f:当前时间的时间戳加上0-10的随机字符串。 u:常量——fanyideskweb。 c:常数——rY0D^0"nM0}g5Mm1z%1G4。 Salt:是f变量,时间戳。符号:使用u+d+f+c的md5值。知道salt和sign的生成原理后,我们就可以编写Python代码来连接它的接口了。以下是相关代码:
导入urllib.request
导入urllib.parse
导入json
导入时间
随机导入
导入哈希库
content=input("请输入需要翻译的句子:")
url="http://fanyi.youdao.com/translate_o?smartresult=dictsmartresult=rulesessionFrom=https://www.google.com/"
数据={}
u="fanyideskweb"
d=内容
f=str(int(time.time()*1000) + random.randint(1,10))
c="rY0D^0"nM0}g5Mm1z%1G4"
符号=hashlib.md5((u + d + f + c).encode("utf-8")).hexdigest()
数据["i"]=内容
数据["来自"]="自动"
数据["到"]="自动"
数据["smartresult"]="字典"
data["client"]="fanyideskweb"
数据["盐"]=f
数据["符号"]=符号
数据["doctype"]="json"
数据["版本"]="2.1"
data["keyfrom"]="fanyi.web"
数据["操作"]="FY_BY_CL1CKBUTTON"
数据["typoResult"]="true"
数据=urllib.parse.urlencode(data).encode("utf-8")
request=urllib.request.Request(url=url,data=data,method="POST")
响应=urllib.request.urlopen(请求)
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【揭秘有道翻译爬虫防御策略破解方法】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这太厉害了!终于有人解决了有道翻译的反爬虫困扰
有16位网友表示赞同!
感觉这下可以自由使用有道翻译数据分析了
有8位网友表示赞同!
原来有这么个方法啊,之前一直想着如何绕过这个机制
有7位网友表示赞同!
学习一下这套破解技巧,说不定能用到其他地方
有9位网友表示赞同!
感谢分享!对于研究者来说太有用了
有17位网友表示赞同!
有道翻译的爬虫防范确实做得厉害,没想到还有人找到突破口
有9位网友表示赞同!
这个方法简单易懂吗?我感觉自己还是学不会
有8位网友表示赞同!
是不是会影响有道翻译的使用体验啊
有13位网友表示赞同!
希望这种技术应用能合理且合法
有7位网友表示赞同!
未来对机器翻译会有更多的探索和研究吗
有15位网友表示赞同!
这样的文章总是让人眼花缭乱,需要慢慢消化消化
有6位网友表示赞同!
太棒了! endlich kann man die Daten von有道翻译 verwenden!
有13位网友表示赞同!
对于语言学习来说,获取更多翻译数据确实有利
有10位网友表示赞同!
这篇文章内容是不是有些技术细节含量高
有8位网友表示赞同!
我一直对爬虫技术的原理很感兴趣,看看能不能了解一些
有15位网友表示赞同!
以后可以用这个方法做很多有趣的事呢!
有11位网友表示赞同!
有道翻译现在还能用吗?好像我之前试过后就报错了
有13位网友表示赞同!
对于程序员来说,这类技术确实很有参考价值
有13位网友表示赞同!
希望这种突破能带来更多对语言学习的帮助
有13位网友表示赞同!