python爬虫之有道翻译

一.前言

自从学了python之后,终于明白了那句“人生苦短,我用python”是什么意思了,哈哈,废话不多说,下文正式开始模拟用户翻译过程。

二.审查请求元素

我们在浏览网站时,往往会需要从网站服务器上请求或者向网站服务器提交一些数据,此时我们的浏览器主要向服务器发送get请求来获取数据,或者发送post请求来提交数据,简而言之,我们可以将这样的用户使用情景模拟出来,下面以有道翻译为例:

python爬虫之有道翻译

在图中可以看到,当用户点击翻译按钮时,浏览器会自动以form_data的形式向服务器发起post请求,发送一些翻译需要的信息,而服务器在接受到请求后会对该请求进行校验,如果检测到是以代码程序的形式进行请求则会进行限制(这个事实上我们填写headers就ok了),或者同一个ip在短时间内大量访问就会被直接封掉(这个问题我们此时不考虑)。在识别为合法的请求后服务器会将结果返回客户端,一般情况下都是json格式

python爬虫之有道翻译

此时我们将相关信息提取出来copy到代码里。

三.实现原理

import urllib.request  #导入模块
import urllib.parse
import json
content=input("请输入要翻译的内容:")
head={}   #请求头信息
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data={}    #请求表单
data['i']=content
data['from']='AUTO'
data['to']='AUTO'
data['smartresult']='dict'
data['client']='fanyideskweb'
data['salt']='15494388925757'
data['sign']='00b84e93f30570e331c01318f59a47f0'
data['ts']='1549438892575'
data['bv']='e40fbeed3cd61fe519ae6051fcce0429'
data['doctype']='json'
data['version']='2.1'
data['keyfrom']='fanyi.web'
data['action']='FY_BY_CLICKBUTTION'
data['typoResult']='false'
data=urllib.parse.urlencode(data).encode('utf-8')
req=urllib.request.Request(url,data,head)
response=urllib.request.urlopen(req)
html=response.read().decode('utf-8')
trans=json.loads(html)    #加载为json字典对象
print("翻译结果:",trans['translateResult'][0][0]['tgt'])

url信息我们在post请求中就可以找到,需要注意的是有道翻译的url里边有'_o'的话去掉,应该是对接口进行了升级,我们用旧的接口就好了,data是一个字典,我们直接将form表单中元素copy过来就好了,在这里我们也可以不使用head,直接对url进行请求,但是此种做法容易使得服务器判断出来是机器在爬取而被直接屏蔽,因此我们最好配置user-agent信息。此外req=urllib.request.Request(url,data,head)使用了request类,来对我们的请求头进行包装,为请求增加了head信息,使得爬虫更加安全,但是最安全的方法则是控制访问的时间或者使用代理ip.

四.运行结果

python爬虫之有道翻译