- 通过有道在线翻译页面的请求接口,利用post实现翻译小程序
- 通过浏览器测试获取数据请求的链接
# !/usr/bin/python
# Filename: 有道翻译实现post请求.py
# Data : 2020/07/16
# Author : --king--
# ctrl+alt+L自动加空格格式化
import urllib.request
import urllib.parse
import json
# 目标:通过post实现有道翻译的小功能
# 获取想翻译的文字
key = input('请输入您想要翻译的文字:')
# 构造POST内容
data = {
'i': key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15949097071450',
'sign': '51d443b018a380fed2e86bd67dfbeace',
'ts': '1594909707145',
'bv': '0ea2f265e69dc7094ed5f0b64ef39e0b',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
# print(data)
# 编码工作使用urllib的parse.urlencode()函数,帮我们将key:value这样的键值对转换成"key=value"这样的字符串,同时把汉字编码成ASCII码
data = urllib.parse.urlencode(data)
# print(data)
# 由于POST请求提交的是二进制字节流,所以要对data进行类型转换
data = bytes(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发现网页可以正常打开
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# 构造header
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
# 对网页发起请求,插入post值
req = urllib.request.Request(url,data,headers=headers)
# 获得返回值
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
# 发现返回值是一个字符串,里边有字典数据,是典型的json数据结构
# 从post传入的data数据来看,页的确是json格式
# print(html,type(html))
# 用json.loads把格式转化为字典
result_temp = json.loads(html)
# print(result,type(result))
# 处理返回值,通过字典k-v操作和切片获取翻译结果
result = result_temp['translateResult'][0][0]
# 打印结果,验证翻译传入的数据和返回的数据是否一致
if key == result['src']:
print('您想要翻译的文字:',key)
print('翻译结果是:',result['tgt'])
else:
print('程序出错,请调试')
- 需要注意的几点:
- 1.通过浏览器抓包network测试,获得请求数据格式并构造成字典格式
- 2.urllib.parse.urlencode()需要传入的是字典,可以实现key:value到key=value格式的转换;可以实现汉字到ASCII编码的转换
- 3.post提交的数据是二进制字节流数据,需要进行bytes()的转换
- 4.url请求的网址不一定正确,服务器端可能进行转换,正确的请求网址可以通过观察,然后猜想测试
- 5.返回的json字符串数据需要通过json.load()转换为python格式
- 6.返回值的处理可以通过[key]和切片[]获得最后的数据
- 7.进行传入值key和服务器返回值中的result[‘src’]进行比对,从而及时发现程序错误