这个例子需要利用有道词典来翻译文本
确定目标网址:http://fanyi.youdao.com
审查元素,确定请求URL
Request URL:http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
接下来需要关注几个重要点:
由于有道翻译已经加入了反爬虫机制,所以,可以使用这个URL(原因可参考)
Request URL:http://fanyi.youdao.com/translateo?smartresult=dict&smartresult=rule
User-Agent:普通浏览器会通过该内容向访问网站提供你所使用的浏览器类型、操作系统、浏览器内核等信息的标识
User-Agent: Mozilla/5.0
(Windows NT 6.1; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36
如果使用Python访问的话,User-Agent会被定义为Python-urllib/3.4
所以检查这个就可以查到请求是来自正常的浏览器单击还是“非人类”的访问
但是User-Agent是可以修改的
这里需要用到urlopen函数的data参数
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False)
如果给这个参数赋值,那么HTTP的请求就是使用POST方式;
如果data的值是NULL,也就是默认值,那么HTTP的请求就是使用GET方式。
注意:
这个data参数的值必须符合这个application/x-www-form-urlencoded的格式,可以使用urllib.parse.urlencode()将字符串转换为这个格式
import urllib.request
import urllib.parse
import json
# 浏览器请求的网址
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
content=input("请输入需要翻译的内容:")
data={}
data['i']=content
data['from']='AUTO'
data['to']='AUTO'
data['smartresult']='dict'
data['client']='fanyideskweb'
data['doctype']='json'
data['version']='2.1'
data['keyfrom']='fanyi.web'
data['action']='FY_BY_CLICKBUTTION'
data['typoResult']='false'
# 使用urllib.parse.urlencode()转换字符串
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
target = json.loads(html)
print("翻译结果:%s"% (target['translateResult'][0][0]['tgt']))
print(html)
print(type(html))
#{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":2,"translateResult":[[{"src":"我喜欢python","tgt":"I like python"}]]}
#str
这里html实际上是一个json格式的字符串(JSON是一种轻量级的数据交换格式,说白了 这里就是用字符串把Python的数据结构封装起来)所以只需要解析这个JSON格式的字符串即可
import json
target=json.loads(html)
type(target)
#
可以看到通过json将其转换成了字典,接下来输出需要显示的内容即可。