Python学习-有道翻译实现post请求(Python自带模块))

1、前期准备工作

打开chrome浏览器,进入“百度一下”页面,在搜索框输入有道翻译,进入有道翻译官网,右击鼠标选择检查,进入开发者模式,然后在需要翻译的文本框输入翻译内容,接着在Network中找到请求文件translate_o?smartresult=dict&smartresult=rule,点击该文件进去,在 Headers的General中可以看到请求的URL(这里需要注意,由于有道词典的后台工作人员对URL进行了处理,需要要把url中的‘_o’去掉才能请求访问到我们想要的数据)为’http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule’,请求方式(Request Method)为POST,在Form data可以看到相应的表单数据,具体操作如下图所示:
Python学习-有道翻译实现post请求(Python自带模块))_第1张图片
表单数据如下:
Python学习-有道翻译实现post请求(Python自带模块))_第2张图片
通过输入不同的翻译内容,观察表单数据的变化,我们可以发现,'i’的值就是翻译内容,因此在不写死翻译内容的情况下,我们可以用input方法来获取。另外从’doctype’的值我们可以知道,这是一个json类型的字典数据。

2、需求

我们的需求很简单,就是通过post请求的表单提交来实现根据用户输入翻译内容的有道翻译小测试。

3、代码实现

import urllib.request
import urllib.parse
import json

# 获取用户要翻译的内容
content = input('请输入要翻译的内容:')
# 创建表单数据(字典)
data = {
    'i': content,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '15948294892747',
    'sign': 'a9341cf6b1c6cf970f2166ac11400a34',
    'ts': '1594829489274',
    'bv': '0b8abb4d55c472d2785cbbae07501f9b',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME'
}
# 对字典数据进行编码
form_data = urllib.parse.urlencode(data)
# 把编码好的表单数据转换为字节流数据 bytes
form_data_bytes = bytes(form_data,'utf-8')
# 发起请求,注意URL http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule的_o要去掉
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# 加入请求头,以免被反爬
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
response = urllib.request.Request(url,data=form_data_bytes,headers=headers)
# 获取响应对象
obj = urllib.request.urlopen(response)
# 读取响应内容
html =obj.read().decode('utf-8')
print(type(html),html)  # 可以看到html的类型是一个字符串str,而且是json类型的字符串。

'''
输入‘你好’之后得到以下结果:
  {"type":"ZH_CN2EN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"你好","tgt":"hello"}]]}
'''
# 优化输出结果,希望输入'你好',得到的结果是'hello',因此需要把上述的json类型的字符串转换为字典
html_dict = json.loads(html)
# 目的是找到字典的'hello'值(层层分解)
translate_result = html_dict['translateResult'][0][0]['tgt']
print(translate_result)

你可能感兴趣的:(Python学习)