前言:
不需要打开有道翻译网页就能在本地使用,还是很方便的。所以学习爬虫确实还是一个比较有意思且实用的过程,另一方面,现在的网站或多或少都有反爬机制,这样斗智斗勇的感觉也挺有趣的。
当然反爬机制也让我更明白了Python爬虫还需要再多多学习,毕竟有道的反爬机制对于我这个初学者来说都不太简单那其他更加复杂的网站的反爬机制将会更有挑战性~
爬有道翻译:
首先我们需要实地考察有道翻译,并点击红框中内容~
可以看到右边出现的为Request Method:POST,且在Data栏中可以看到i:后接的是待翻译内容,再看看Preview中就有翻译过来的内容,可知我们需要找的POST内容就是这个了。接下来就是可以准备写代码了,具体的内容介绍在代码注释中可见:
1 | import urllib.request |
大家执行完代码后会发现报错:{“errorCode”:50},其实代码是没有问题的,只是有道加入了反爬机制。所以接下来需要做的是如何反反爬机制。
##解决有道翻译的反爬机制
解决方案一:可以在上述的代码中将
url= http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule 中的_o去除,即解除网页反爬虫机制。(其实是解除了salt、sign参数的作用)
解决方案二:依旧需要实地考察有道网站,我们多次尝试翻译。可以发现在Data数据中变化的是salt、sign和ts。可以猜测实现反爬机制的关键就在这三个加密的参数~接下来先介绍这三个参数的作用:
1、salt:加密信息,根据数据的特点可以猜测与时间戳有关
2、sign:签名字符串
3、ts:毫秒时间戳
再稍微介绍一下其他数据的功能:
1、i:待翻译内容
2、from:源语言的语种(这里是AUTO,即可以进行多语言互译不局限于英汉互译)
3、to:翻译后的语种(AUTO同上)
4、smartresult: 固定值
5、client:客户端
6、bv:md5值
7、doctype:文档类型
8、version:版本
9、keyfrom:键来源
10、action:操作动作
11、typoResult:打印错误
开始分析sign、salt和ts具体获取方式。先去网页的源代码中查看,并没有此参数,于是考虑是否在js文件中生成这三个参数。最后在fanyi.min.js文件中找了这三个结果。当然js文件的内容格式比较可怕,建议将其格式化后再用sublimetext进行查找salt参数。接下来可见代码片段:
1 | var r = function(e) { |
从上述js代码中可见salt的获取方式,可知确实为时间戳:
i = r + parseInt(10 * Math.random(), 10)
其中r为ts获取方式:
r = “” + (new Date).getTime()
sign的获取方式为:
sign = n.md5(“fanyideskweb” + e + i + “Nw(nmmbP%A-r6U3EUn]Aj”)
其中前后两个为固定值,只有e与i在改变。e为待翻译内容,i为salt。
弄明白了以上三个参数的来源,接下来可以开始动手写代码。
1 | import random |
代码解读
1、第一个函数根据js文件模仿网页生成salt、sign和ts参数。
2、第二个函数是开始准备爬虫的请求函数,这里有两个关键的内容。data与headers。一个是需要发送给网站信息,一个是请求头文件。模拟浏览器正常访问。
最后展示一个成功运行结果图。
总结
最近在开始学习Python,所以这一周没有打理博客了。现在慢慢准备上手一些爬虫的实例。如果好玩的话会继续分享,也算是见证自己的成长~
谢谢大家观看,因为是Python初学者所以或多或少会有错误,如果博客中有表达问题还请在评论中指正!