post请求案例--有道翻译
教师:Jerry
一、准备工作
-
有道翻译网址:https://fanyi.youdao.com/, 注意请求的并不是这个网址。
image.png
image.png
-
找到请求的网址: https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
-
找到post请求的参数
image.png
这是直接复制出来的,还得要整理成字典类型
i: 你好
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16190235144468
sign: 19c108efc325c200f4775bf7cb08f24b
lts: 1619023514446
bv: acc97416ef67184f42e5a4a03c3d52ab
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTlME
整理后的结果,Jerry老师讲的快速方法还没时间去捉摸,还是自己手动完成吧
data = {
'i': '你好',
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16190235144468',
'sign': '19c108efc325c200f4775bf7cb08f24b',
'lts': '1619023514446',
'bv': 'acc97416ef67184f42e5a4a03c3d52ab',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
二、发起请求获取数据
# 需求:简单的中英翻译小软件
import requests
import urllib
content = input('请输入需要翻译的内容:')
# url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
url = 'https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
# 携带数据
data = {
'i': content,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16190235144468',
'sign': '19c108efc325c200f4775bf7cb08f24b',
'lts': '1619023514446',
'bv': 'acc97416ef67184f42e5a4a03c3d52ab',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
data = urllib.parse.urlencode(data)
# print(type(data)) #<class 'str'>
# 此处要转换成字节型,b'开头,方法如下
# data = bytes(data)#这种写法会报错SyntaxError: invalid character in identifier(意思是:标识符中的字符无效))
data = bytes(data, 'utf-8')
# print(type(data))#<class 'bytes'>
# print(data) #b'i=%E4%BD%A0%E...
# 发起请求获取数据
request = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
# print(response)#<http.client.HTTPResponse object at 0x000000000312DE48>
html = response.read().decode("utf-8")
# b'{"errorCode":50}'出现这种结果要把url中的“_o”去掉
print(html) # {"type":"ZH_CN2EN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"你好","tgt":"hello"}]]}
代码运行结果
image.png
三、数据解析
以上代码打印结果为:
{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"你好","tgt":"hello"}]]}
print(type(html))#<class 'str'>
少了双引号,本来应是这样的
“{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"你好","tgt":"hello"}]]}”
小结:这是JSON类型的字符串str
解决办法:
先将json类型的str --> python类型的字典
r_dict = json.loads(html)
# 解析数据
# json类型的str --> python类型的字典
r_dict = json.loads(html)
print(type(r_dict))
print(r_dict)
#<class 'dict'> {'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': '你好', 'tgt': 'hello'}]]}
result = r_dict['translateResult']
print(result)#[[{'src': '你好', 'tgt': 'hello'}]]
result = r_dict['translateResult'][0]
print(result)#[{'src': '你好', 'tgt': 'hello'}]
result = r_dict['translateResult'][0][0]
print(result)#{'src': '你好', 'tgt': 'hello'}
result = r_dict['translateResult'][0][0]['tgt']
print(result)#hello
print(content,result)#你好 hello
image.png
四、函数方式完整代码
# 需求:简单的中英翻译小软件
import requests
import urllib
import json
def data_bytes(content):
# 携带数据
data = {
'i': content,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '16190235144468',
'sign': '19c108efc325c200f4775bf7cb08f24b',
'lts': '1619023514446',
'bv': 'acc97416ef67184f42e5a4a03c3d52ab',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
data = urllib.parse.urlencode(data)
data = bytes(data, 'utf-8') # <class 'str'> --><class 'bytes'>
return data
def requestData(url,data):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
# 发起请求获取数据
request = urllib.request.Request(url, data=data, headers=headers)
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
return html
def Analytical_data(html,content):
# 解析数据
# json类型的str --> python类型的字典
r_dict = json.loads(html)
result = r_dict['translateResult'][0][0]['tgt']
print(content, result) # 你好 hello
def main():
content = input('请输入需要翻译的内容:')
# url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
url = 'https://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' # 去掉了”_o“
data = data_bytes(content)
# print(data)
html = requestData(url,data)
Analytical_data(html,content)
if __name__ == '__main__':
main()
运行效果:
image.png
五、面向对象(类)方式完整代码
代码块