python爬取有道詞典
python爬虫爬取有道翻译教程
编写环境
为了宝宝们能够正确读懂本教程,在正式开始前,宝宝们需要搭建的环境如下:
- 连接互联网的win10电脑,(win7也可以)
- Google浏览器(版本无要求)
- Python(版本3就可以了),如果没有安装的小伙伴可以参考python安装以及版本检测
- requests库(版本没啥要求),没有安装的小伙伴可以参考python request库安装
需求分析
我们本次要爬取的网页是:有道翻译
这时,按下F12键,调出Google浏览器的开发者工具
现在里面没有内容,别慌,点击NetWork选项卡后,再次点击翻译按钮
这时,宝宝们会发现下面多了几条网络请求,我们点击第一个请求
在右边有三个点的按钮,可以切换开发者工具的显示状态,我们点击第一个,让它单独分出一页显示出来,以便于观察
在Headers选项卡中,可以查看这次请求的URL、headers参数
往下面翻,还有data的参数值
我们点击Response来查看这次请求的响应,也就是服务器给我们返回的结果,经过和网页中翻译内容的比较,可以确定,这个数据就是我们需要爬取的内容.
经过我们的多次改变翻译内容,比较请求信息,我们可以发现:
在data中有三个数据是加密的变量,其中i为我们输入要翻译的字符串,而salt、sign和ts是加密的变值.所以我们猜测这个值是由JavaScript生成的,这里我们可以在页面中右键->查看网页源代码
通过Ctrl+F搜索js,找到js文件
通过向下继续搜索,我们发现了三个以js结尾的文件
依次点击进入后进行搜索,最终确为
http://shared.ydstatic.com/fanyi/newweb/v1.0.18/scripts/newweb/fanyi.min.js
是进行加密的JavaScript文件
我们将这个JavaScript文件,按下Ctrl+A全选,Ctrl+C进行复制,但是这个代码是压缩格式,不利于我们的阅读
这里小编给给大家提供了一个js格式化的网站在线代码格式化
粘贴进来后,即可复制格式化好的代码
下面在PyCharm中新建一个js文件,将格式化好的js代码粘贴进来,PyCharm的安装可以参考PyCharm的安装以及破解
将代码粘贴进来后,按下Ctrl+F可以在代码中进行搜索,输入salt,逐个查看比对
但是通过我们的观察,浏览器中的data参数,版本是2.1
说明我们找的不对,继续向下搜索,只到查找到version : 2.1,这里的salt即为data中的参数
我们发现salt、sign和ts都的r的属性,下面我们搜索一下r是如何定义的
通过搜索,我们找到了这里
根据代码可以看出:
1 | r = "" + (new Date).getTime() |
所以ts就是当前的时间戳(这里要注意:JavaScript中的时间是以毫秒为单位的,所以在下面我们生成的时候注意单位的换算)
1 | i = r + parseInt(10 * Math.random(), 10); |
salt即为r加上一个在0-10之间的随机数
1 | sign: n.md5("fanyideskweb" + e + i + "97_3(jkMYg@T[KZQmqjTK") |
sign为对两个字符串加上e和i拼接的md5加密
其中i即为salt
而e经过上面的代码,我们可以确定为输入的字符串
到这里我们就将需要的加密字符确定好了
实战代码
在PyCharm中新建一个项目,建立一个py文件
在正式写代码之前,我们可以在程序前加上
1 | #!/usr/bin/env python |
第一行 指出python解释器位置,不知道的小伙伴可以参考#!/usr/bin/python 作用
第二行 # -- coding:utf-8 --的意思时指点该程序使用的utf-8编码,这个utf-8编码是干啥的呢?可以参考-- coding: utf-8 --的作用
(づ ̄ 3 ̄)づ皮一下,很开心。
第三行不是必须要写的,可以省略。。。。
导入requests模块,代码如下
1 | import requests |
将Request URL复制过来
1 | url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' |
将要翻译的字符输入进来
1 | e = input('please input:') |
下面构建请求需要的data
首先要构建的是ts,导入python中的时间模块
1 | import time |
生成当前的时间戳
1 | sjc = time.time() |
转换类型和进制
1 | ts = str(int(sjc*1000)) |
下面构建salt
导入random模块,
1 | import random |
生成随机数并转换类型和进制
1 | salt = ts + str(int(random.random()*10)) |
接下来是构建sign,需要用到python中的hashlib库来进行md5的加密,代码如下
导入模块
1 | import hashlib |
拼接字符串
1 | con = "fanyideskweb" + e + salt + "97_3(jkMYg@T[KZQmqjTK" |
md5加密
1 | sign = hashlib.md5(con.encode(encoding='UTF-8')).hexdigest() |
复制data中的内容
在PyCharm中粘贴后按下Ctrl+R可以进行替换,需要勾选Regex(正则表达式匹配模式)
匹配的正则表达式代码如下:
1 | ^(.*): (.*) |
匹配好后,将i、salt、sign和ts替换成前面生成的变量
1 | data = { |
构建headers,这里给出了三个必要的参数,不确定的小伙伴可以将请求头中的Request Headers全部复制过来也行
1 | header = { |
发出请求
1 | res = requests.post(url,data=data,headers=header).text |
用正则进行匹配翻译的内容
导入re模块
1 | import re |
开始匹配
1 | rep = re.findall('"tgt":"(.*?)"',res,re.S)[0] |
输出匹配的内容
1 | print(rep) |
经过封装,完整代码如下
1 | #!/usr/bin/env python |