一起学爬虫(Python) — 19 年轻人,进来学自动化
注:本篇不严谨,可以直接看15
前言
点赞!
真·前言
之前咱们不是爬了一个小小的翻译网站嘛,但是呢,也不知道是那个网站配置太一般了,还是各位太猛了,让那个网站真的受不了,于是乎好像就崩溃了的说,所以今天啊,我们就教大家进行有道翻译的爬取,这可能是一个小boss吧,所以大家要认真看认真学哦!!!
对了,提前下载好火狐浏览器~
知己知彼
首先呢,我们要先打开这个有道翻译啊,大家不要找错了,小泽就差点找错了,直接把网址带上好了:
http://fanyi.youdao.com/
相比昨天的绿色,今天的红色真的是十分可爱呢,快让我们开始愉快的学习吧!
首先,打开我们的F12、检查、开发者工具,然后点到Network里面。
接着,点击翻译按钮。
大家多翻译几次,就能观察到有一些参数我们是可以直接知道的,比如:
还有三个参数呢,是会随机变动的:
但是我们就会发现,其实这个lts就是salt减去了一个数,或者说salt就是lts加了一个随机数,这里因为小泽见的多了,所以能直接看出来这个东西他不是人,他是一个时间戳,时间戳,时间戳,什么是时间戳???
各位各位各位,看到没有看到没有看到没有!!!
很像了吧!
但是到底是不是呢,还是要我们深入的研究一下才知道,毕竟现在只是一种猜测~
这个,才是我们的最终目的!
对了,还有记得看一下返回的数据,是不是我们要的数据~
确定无误!
火狐的初次登场
可能很多小伙伴都没有下载火狐哈,之前我们一直在用的都是360极速浏览器!
咳咳,应该要用谷歌的,不过谷歌实在是太慢啦!!!
但是今天,我们就要拿下火狐的第一次,一针见血!
为什么要用火狐呢?
答案是…因为火狐的抓包工具中,可以很便携的让我们看到某事件绑定的函数代码!!!
如果你已经开始听不懂了,说明你的前端学的不咋地,或者没有接触,不过没关系,先硬啃,我们一步一步来~
打开火狐
用火狐打开我们的有道翻译,然后右键点击检察元素,同样的用我们的金手指,点击翻译这个按钮~
会发现,这一行后面跟了一个我们没有见过的东西,这个就是这个按钮上的超链接标签绑定的事件!
打开它,看到那个click了嘛,click是点击的意思哦,就是说只要点击它,就会触发那个事件~
点击这里~
这个,就是绑定的函数代码!
看不懂吧,看不懂没关系,先知道就好。
然后我们点开它~
然后你就发现这里有超级超级长的一行代码…根本看不懂!
这里就要用到我们的js代码格式化网站啦:
https://tool.oschina.net/codeformat/js/
打开它,然后把所有的代码复制粘贴进去:
果然很长!
把这么长的一段代码复制到我们的记事本里,准备分析!
那么…要怎么分析呢?
首先各位跟着小泽一起蹲坑,不是一起捋一捋思路:
我先问宁一个问题,我们点击这个按钮的时候,是不是会执行一个函数事件?
对啊。
那执行了这个函数事件是不是就会向服务器发送一串数据,里面有我们要翻译的东西,还有那些奇奇怪怪的参数。
对啊。
那也就是说这个函数事件里面,会把那些参数都封装好,然后再发送给服务器,对吧。
对啊。
现在我们已经找到了这个函数事件诶,扒光光了的那种。
啊这…
那么我们是不是就可以在这个函数里面找到我们的参数呢???
就是这些 东东 啊!!!
不要跟我说你听迷糊了,这么简单易懂的呢,如果你真的听不懂的话…那就把听不懂发在评论里吧。
所以我们要去我们整理好然后又复制好的那一大串代码里去找这几个单词,懂了吗!!!
因为那一大串函数就是发送数据的,里面肯定会有这些单词,如果没有的话,你来打我,我给你打!
咳咳,分析完成了哈,接下来教大家怎么去找~
海底捞针
俗话说女人是水多的,我们要在这么大的一片数据里找到我们要的东西,就像在水里游泳一样,如果很大那就会很有感觉,一下就找到了,但是如果你的很小就没办法啦,慢慢找吧。
这里建议大家直接搜索这个url,为什么呢?
因为这个函数事件肯定要指定这个url,才会对这个url发起请求吧,没毛病吧~
不要把全部的url都加进去了诶,因为他们自己家人发送请求,没必要还要每次都带上http那些的,就跟你自己加载美女图片只需要 ./美女图片.jpg 就可以了一样。
这个呢,是前端写法的请求方式,不要在意那么多~
看到红框框了嘛:data: e,
那我们就继续搜索data,在这个位置搜索的话,是可以搜这附近的data的,至于往上还是往下搜,当然是往上拉,小笨蛋。
你可以选择点击向上的那个简单,当然如果你有键盘的话就按键盘上的向上的那个箭头~
一直找,直到找到看起来有用的数据!
可以看到又看到这个data了哈,不要管,不是我们要的东西!
掌声,花花~
有直播内味了吧,hh
我们成功找到了这个data封装的数据哈,可以看一看都对应了什么东西!
第一行的i呢,不用说肯定是我们要翻译的那个东西,就是我们输入的文本。
没用,为什么呢:
因为根本就没有嘛~
木大木大
可以看到啊,基本都是没用的,然后再仔细一看…
纳尼(ÒωÓױ)!
打扰了,我们继续往上找吧…
好的,现在找到一条看起来比较肥胖的,但是仔细一看好像还是没有什么有用的信息呢…因为我们没有学过前端的话,肯定是看不懂这些东西的嘛,那就说明data不行,我们得换一个搜索目标!
就用她吧!
苍天不负有心人,终于让我们找到了!!
直接把这个字典复制到我们的py文件中,然后整理一下…
咳咳,大概就是这样子啊…
看到那个action了吗,右边有个||,这个||的意思呢就是或的意思,就是说我们在e和另外一个选一个就ok了,那我们肯定选择现成的啊!
整理好了之后,上面画黑道道的我们都可以自己解决,对吧,第一个就是要翻译的内容嘛,第二个和第三个我们写成AUTO好了。
现在我们可以有目的的定点去找我们的client!
然后再找salt!
不找不要紧,一找吓一跳,直接连带着找到了sign还有bv!
果不其然,salt就是时间戳加上了一个随机数,而不是再乘十,还有一个md5加密,这个我们可以用python中的hashlib模块实现!!
这里是加密成16进制了,至于为什么,懂得人上下翻翻就能看到很多很长的一串一串的,不懂的话…百度吧~ 或者花时间去学前端!
e = input('你要翻译啥:')
# 时间戳
r = int(time.time() * 1000)
i = str(int(time.time() * 1000) + random.randint(1, 10))
# md5.digest() 返回的是二进制
# md5.hexdigest() 返回的是十六进制
sign = hashlib.md5(("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@").encode('utf-8')).hexdigest()
也就是说我们可以通过这种方法获得sign这个动态并且加密的值!
data = {
'i': e,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': "dict",
'client': "fanyideskweb",
'salt': i,
'sign': sign,
'lts': r,
'doctype': "json",
'version': "2.1",
'keyfrom': "fanyi.web",
'action': "FY_BY_DEFAULT"
}
至于其他的详细内容,小泽就不一一带大家找了,慢慢百度然后自己加备注,这样更有利于自己进步!
这也是为了你们好,望理解!!!
当然,如果很想了解的很清楚很明白的话,多百度,自学前端,或者加入我们的交流群一起交流!!!
没有广告,没有男的,全都是女的!
最后的最后
当然上面还有一个点没跟大家说到,那就是我为什么把
这个参数给去掉了,那是因为我在函数事件中发现这个东西是调用的另外一个文件,也就是说是可有可无的,因为它会自动去调用,然后自动去生成,是不需要我们的任何数据的,就不加辣~
点赞!点赞!点赞!
猜猜我是谁
没错,在这里呢,就把所有代码都附上,如果可以的话还是希望你能自己多思考思考,多找一找,多百度百度,这种东西不同的人有不同的理解,希望大家都能学会爬自己喜欢的美女的图片!
import time
import random
import hashlib
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
e = input('你要翻译啥:')
# 时间戳
r = int(time.time() * 1000)
i = str(int(time.time() * 1000) + random.randint(1, 10))
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# md5加密
# md5.digest() 返回的是二进制
# md5.hexdigest() 返回的是十六进制
sign = hashlib.md5(("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@").encode('utf-8')).hexdigest()
data = {
'i': e,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': "dict",
'client': "fanyideskweb",
'salt': i,
'sign': sign,
'lts': r,
'doctype': "json",
'version': "2.1",
'keyfrom': "fanyi.web",
'action': "FY_BY_DEFAULT"
}
# 因为是json格式的嘛,所以json()一下
response = requests.post(url,data=data,headers=headers).json()
# 如果不懂为什么要这样子,可以直接print(response)
print(response['translateResult'][0][0]['tgt'])
接下来,炕头c加炕头v吧!
当然,也会有细心的小伙伴会发现上面有很多错误,比如url,和我们原本找的不同,还有参数里面最麻烦的那个其实不用加入也可以获得翻译的结果,还有就是那个参数的加密就是错的,这里是因为小泽对前端的知识呢也不算太精通,看的迷迷糊糊的,但是能自己捣鼓出来,让我说的话还真说不清楚,所以大家也不要太刁钻,思路就是这么个思路,先将就一下,等之后再详细的跟大家说一说js相关的知识点,然后今天的一切疑问,就会迎刃而解!
拜拜喽