2021-04-22

post请求案例--有道翻译

教师:Jerry

一、准备工作

image.png
image.png
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

五、面向对象(类)方式完整代码

代码块
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容