本文目录
一、前言
二、调用浙江·数据开放平台API获取数据
(一)API获取数据的流程
(二)HTTP请求
(三)API的参数
(四)使用request库获取API数据
三、调用百度通用翻译API
四、总结
Part1引言
API 的全称为"Application Programming Interface
",即“应用程序编程接口
”,是一组定义了不同软件组件之间如何相互通信的规则和协议,不同的软件系统可以通过 API 来交换数据和功能,以实现特定的任务目标。通过 API,我们就可以利用其他软件系统的功能,而不需要详细了解其内部是如何实现的。
那么为什么再次介绍 API 呢?我们的目的是向大家介绍 API 的相关概念,以及如何使用 Python 中的requests
包来调用 API 以获得数据或实现相应功能,更具有普适性,下面我们将通过两个例子展开介绍本文内容。
本教程基于 pandas 1.5.3 版本书写。
本文中所有 Python 代码均在集成开发环境 Visual Studio Code (VScode) 中使用交互式开发环境 Jupyter Notebook 中编写。
Part2调用浙江·数据开放平台 API 获取数据
我们首先介绍如何调用 API 来获取数据,浙江·数据开放平台
是一个免费向用户提供数据接口服务、通过接口对接实现数据获取和开发利用的政府平台,平台对每项数据都提供 3 个接口,包括总数接口、分页接口和更新时间查询接口,分别用于查询数据集包含的数据总条数、分页调取数据,以及判断当前数据是否已更新。在本例中我们使用浙江·数据开放平台
提供的“浙江省粮食企业信用评价结果信息
”接口来获取浙江省粮食企业信用评价数据,该接口由浙江省粮食物资局发布,我们使用其中的分页接口。
💡 需要说明一点,实际中我们在使用一个 API 之前,第一步,也是最重要的一步,就是需要仔细阅读 API 的相关文档,了解其功能、参数等重要信息,然后才是后面的流程。
1API 获取数据的流程
上文提到,API 是一组定义了不同软件组件之间交互的规范,交互过程中 API 可以使用不同的通信协议,其中最常用的是 HTTP。HTTP (“Hypertext Transfer Protocol”,超文本传输协议) 是一种用于在网络上发送和接收超文本的协议,它提供了一种可靠的方式来发送请求和接收响应,想象一下你使用浏览器访问一个网站,当在浏览器中输入网址并按下回车键时,浏览器会向服务器发送一个 HTTP 请求,这个请求会告诉服务器你想要浏览哪个网页或资源;当服务器接收这个请求后,会处理请求并生成一个响应,响应包含请求的内容,例如网页的 HTML 代码、图像等其他资源,服务器将响应发送回浏览器,浏览器解析响应并将内容显示在屏幕上,这种通信协议具有广泛的支持和易用性。
下面是调用 API 获取数据的流程:
GET 请求和 POST 请求是 HTTP 协议中最常见的两种请求方法,用于客户端与服务器之间的数据交互,两者的区别主要在传输安全性、传输方式、数据长度和数据缓存几个方面(由于篇幅原因,我们在这里不详细展开介绍)。
我们在调用 API 时应该根据具体的需求和安全性考虑,来选择使用 GET 请求还是 POST 请求。一般情况下如果只是获取少量数据且不涉及敏感信息,可以使用 GET 请求,如果需要向服务器提交数据,或者数据量较大,可以使用 POST 请求。
2HTTP 请求
HTTP 请求是在 HTTP 协议下的一种数据格式,用于向服务器发送请求,其通常由请求行、请求头和请求体三部分构成,请求头和请求体之间用空行隔开,其中各部分包含的信息如下:
-
请求行 (Request Line):包括请求方法 (GET请求、POST请求等)、请求的 URL 和协议版本。
-
请求头 (Request Headers):包括一些关于请求的附加信息,如 User-Agent(用户代理,标识请求的客户端类型等)、Content-Type(指定请求体中发送的数据的类型)等。
-
请求体 (Request Body):HTTP 请求中可选的组成部分,用于向服务器传递请求所需的参数或数据,如表单数据、JSON 数据等。
GET 请求通过 URL 的查询字符串将参数传递给服务器,也就是说参数会附加在 URL 的末尾,而 POST 请求将参数放在请求体中传递给服务器,所以通常情况下 GET 请求的请求体为空,POST 请求的请求体不为空。
3API 的参数
通常在调用 API 时需要关注公共参数、请求参数和响应参数这三种参数,其中各部分包含的信息如下:
-
公共参数:调用 API 时经常使用的通用参数,用于标识请求的身份、版本、签名等信息,这些参数在调用不同 API 时不会随着 API 的变化而变化。
-
请求参数:调用具体的 API 时需要提供的参数,用于描述请求的具体内容(如传递查询条件、分页信息等),这些参数是必需的还是可选的需要根据具体 API 的设计而定。
-
响应参数:API 调用成功后返回的信息,通常包括 API 调用结果的状态码、错误信息、返回的数据等。根据 API 的设计,响应参数的内容和格式可能会有不同。
公共参数和请求参数是用于发起 API 请求的,而响应参数是 API 返回的结果,需要注意一点,不同的 API 可能有不同的参数要求。
本例中需要获取浙江省粮食企业信用评价数据,根据分页数据获取接口的介绍,该 API 设计的参数如下:
参数名称 | 类型 | 说明 |
---|---|---|
appsecret | String | 用户应用识别码,通过申请获得 |
pageNum | Int | 页数 |
pageSize | Int | 每页个数(不超过200) |
上表中的参数appsecret
为公共参数,pageNum
和pageSize
为请求参数。
参数名称 | 类型 | 说明 |
---|---|---|
status | Int | 0代表失败,1代表成功 |
msg | String | 返回信息 |
data | JSON | 返回数据 |
上表中的三个参数为响应参数,用于返回请求的结果,我们只需要根据参数的名称就可以在返回的响应信息中提取相应的内容。当然在使用浙江省数据开放平台接口前,需要先完成用户注册并登录平台创建数据应用、完善应用信息,应用信息保存后即可进行接口申请,在接口申请
审核通过后,就可以进行数据接口对接工作,操作流程见下图:
更加详细的注册和申请流程见官方提供的接口服务使用手册
,本文不再赘述。
4使用 requests 库获取 API 数据
如果你了解过网页爬取或 API 交互,那么你应该对 requests 库并不陌生,requests 是一个常用于发送 HTTP 请求并处理响应的 Python 库,其中requests.get()
和requests.post()
是常用的两个函数,它们分别用于发送 GET 请求和 POST 请求。
函数requests.get()
的基本用法如下:
import requests
response = requests.get(url='https://api.example.com/data')
上述代码会发送一个 GET 请求到https://api.example.com/data
(即参数 url),并且将响应结果保存在变量response
中。此外该函数还有一个常用的可选参数params
用于传递查询参数,其中的参数会自动添加到 URL 中,代码如下:
params_value = {'key1':'value1', 'key2':'value2'}
response = requests.get('https://api.example.com/data', params=params_value)
上述代码将发送 GET 请求到https://api.example.com/data?key1=value1&key2=value2
。除了参数url
和params
,函数requests.get()
还有一些其他的可选参数,比如参数headers
用于设置请求头、timeout
用于设置请求超时时间、cookies
用于设置请求的 Cookie 值等等。
函数requests.post()
的基本用法类似,除了参数url
,该函数的可选参数data
用于传递请求数据,代码如下:
import requests
params_value = {'key1':'value1', 'key2':'value2'}
response = requests.post('https://api.example.com/data', data=params_value)
上述代码将发送 POST 请求到https://api.example.com/data
,并将params_value
作为请求数据发送到服务器,当然也可以使用参数json
来发送 JSON 数据,若设置参数json=params_value
会自动将数据转换为 JSON 格式并发送到服务器,此外,函数requests.post()
还有其他的可选参数,这里就不多介绍了。
下面我们将分别使用 requests 库中的函数requests.get()
和requests.post()
来获取浙江省粮食企业信用评价数据,以下是 Python 代码:
import requests
import pandas as pd
# GET 请求
def data_get(pageNum, pageSize, appsecret, url):
'''
pageNum: 页数
pageSize: 每页个数(不超过200)
appsecret: 应用识别码(申请获得)
url: api 接口
'''
# 以字典形式编辑查询参数
parameters = {'pageNum':pageNum, 'pageSize':pageSize, 'appsecret':appsecret}
# 发送 GET 请求,返回一个包含服务器响应信息的 response 对象
response = requests.get(url = url, params = parameters)
# HTTP 响应状态码为 200 表示请求成功,服务器成功处理了请求
if response.status_code == 200:
# 响应信息中status为 1,表示成功获取数据
if response.json()['status'] == 1:
## 提取响应结果中返回的数据data,并转换为dataframe
data = pd.DataFrame(response.json()['data'])
else:
# 响应信息中status不为 1,表示获取数据失败,需进一步检查原因
print(response.json())
else:
# HTTP 响应状态码不为 200 时,提示“URL未正常响应请求”
raise Exception('URL未正常响应请求')
return data
data = data_get(pageNum = 1,
pageSize = 200,
appsecret = '申请的 APP 识别码',
url = 'http://data.zjzwfw.gov.cn/jdop_front/interfaces/cata_18444/get_data.do')
data
# POST 请求
def data_post(pageNum, pageSize, appsecret, url):
# 以字典形式编辑请求体
data_value = {'pageNum':pageNum, 'pageSize':pageSize, 'appsecret':appsecret}
# 发送 POST 请求,返回一个包含服务器响应信息的 response 对象
response = requests.post(url = url, data = data_value)
if response.status_code == 200:
# 响应信息中status为1,表示成功获取数据
if response.json()['status'] == 1:
data = pd.DataFrame(response.json()['data'])
else:
print(response.json())
else:
raise Exception('URL未正常响应请求')
return data
data = data_post(pageNum = 1,
pageSize = 200,
appsecret = '申请的 APP 识别码',
url = 'http://data.zjzwfw.gov.cn/jdop_front/interfaces/cata_18444/get_data.do')
data # 结果同上
使用函数requests.get()
和requests.post()
这两种请求方式得到的结果相同,该数据包含企业名称、统一社会信用代码、得分和等级四个字段,共107条数据,如下:
Part3调用百度通用翻译 API
百度翻译开放平台
是百度翻译面向广大开发者提供开放服务的平台,通用翻译 API 是该平台提供的服务之一。通用翻译 API 通过 HTTP 接口对外提供多语种互译服务,我们只需传入待翻译的内容,并指定要翻译的源语言和目标语言种类,即可想要的翻译结果,下面我们就来介绍如何调用此API。
根据官方提供的通用翻译 API 接入文档,调用此 API 支持 GET 或 POST 方式,如果需要使用 POST 方式,需要指定 Content-Type 为 application/x-www-form-urlencoded。首先我们先来看通用翻译 API 需要的输入参数,如下表所示:
参数名称 | 说明 |
---|---|
q | 待翻译内容,UTF-8 编码,长度不超过 6000 bytes |
from | 翻译源语言 |
to | 翻译目标语言 |
appid | 平台分配的应用程序的标识符 |
salt | 随机数(盐值) |
sign | appid+q+salt+密钥做 MD5 后得到的 32 位小写签名 |
为了确保调用 API 的安全性,通用翻译 API 要求使用参数sign
对请求进行签名,签名由平台分配的 appid、待翻译内容 q、随机值 salt 和密钥四部分构成,其生成方法为:将 appid、q、salt、密钥按顺序连接成一个字符串,再对该字符串做 MD5 计算,就可以获得 32 位小写的 sign。
成功调用 API 后返回 JSON 格式的响应结果,其中包含以下输出参数:
官方对输入参数和输出参数有更详细的说明,可自行进一步了解
参数名称 | 类型 | 说明 |
---|---|---|
from | String | 翻译源语言 |
to | String | 翻译目标语言 |
trans_result | Array | 翻译结果,包括原始内容 (src) 和翻译结果 (dst) |
error_code | Int | 错误码,仅在出现错误时显示,详细含义和解决方案见通用翻译 API 接入文档 |
下面我们就来调用通用翻译 API ,实现代码如下:
import requests
import random
from hashlib import md5
# GET 请求
def trans_Baidu_GET(query, APPID, APPKEY, fromlanguage = 'auto', tolanguage = 'en', action = 0):
'''
query: 待翻译内容
APPID: 申请的 APP ID
APPKEY: 申请的密钥
fromlanguage: 待翻译语言; 'auto' 表示自动识别
tolanguage: 翻译目标语言; 'zh' 表示中文
* 语言代码见: https://api.fanyi.baidu.com/doc/21
action: 1: 使用自定义术语干预API; 0: 不使用自定义术语干预API
'''
# 定义函数,作用是进行 MD5 并将散列值转换为 16 进制
def make_md5(s, encoding = 'utf-8'):
return md5(s.encode(encoding)).hexdigest()
# 在 32768 至 65536 的范围内取随机数
Salt = random.randint(32768, 65536)
# 使用 APPID、请求 query、随机数和密钥构成签名
Sign = make_md5(APPID + query + str(Salt) + APPKEY)
# 发送请求的 URL
url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
# 以字典形式编辑查询参数
parameters = {'appid': APPID, 'q': query, 'from': fromlanguage, 'to': tolanguage, 'salt': Salt, 'sign': Sign}
# 返回响应信息,并提取响应中的翻译结果
response = requests.get(url, params = parameters)
result_list = response.json()['trans_result']
## 提取翻译结果中的翻译后内容 (dst)
result = '\n'.join(item['dst'] for item in result_list)
return result
# POST 请求
def trans_Baidu_POST(query, APPID, APPKEY, fromlanguage = 'auto', tolanguage = 'zh', action = 0):
# 定义函数,作用是进行 MD5 并将散列值转换为 16 进制
def make_md5(s, encoding = 'utf-8'):
return md5(s.encode(encoding)).hexdigest()
Salt = random.randint(32768, 65536)
Sign = make_md5(APPID + query + str(Salt) + APPKEY)
# 发送通用翻译请求的 URL
url = 'https://fanyi-api.baidu.com/api/trans/vip/translate'
# 根据 API 接入文档,指定 Content-Type 为 application/x-www-form-urlencoded
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
parameters = {'appid': APPID, 'q': query, 'from': fromlanguage, 'to': tolanguage, 'salt': Salt, 'sign': Sign}
# 保存响应,并提取响应中的翻译结果
response = requests.post(url, params = parameters, headers = headers)
result_list = response.json()['trans_result']
# 提取翻译结果中的翻译后内容 (dst)
result = '\n'.join(item['dst'] for item in result_list)
return result
在上面的代码中,我们定义了函数trans_Baidu_GET()
和trans_Baidu_POST()
,两个函数分别使用 GET 请求和 POST 请求调用通用翻译 API。它们的功能是相同的,在调用函数时,我们只需要输入待翻译原文(默认自动识别语种)、APPID 和密钥,即可得到翻译的结果(默认英文),当然如果想要翻译其他语种或者修改翻译的目标语言,可以通过指定参数fromlanguage
和tolanguage
来实现。
当然我们也可以实现批量翻译多条语句,只需要将各个语句用换行符\n
隔开,此时翻译结果也使用换行符\n
输出。现在我们来调用上述函数,代码如下:
APPID = '分配的 APPID'
APPKEY = 'APPID 对应的密钥'
# GET 请求
answer1 = trans_Baidu_GET('成为企研·社科大数据平台会员,用最独家的数据,学最实用的Python,画最酷的图!', APPID, APPKEY)
answer1
'''
Become a member of the Enterprise Research Social Science Big Data Platform, use the most exclusive data, learn the most practical Python, and draw the coolest pictures!
'''
# POST 请求
answer2 = trans_Baidu_POST('成为企研·社科大数据平台会员,\n用最独家的数据,\n学最实用的Python,\n画最酷的图!', APPID, APPKEY)
answer2
'''
Becoming a member of the Enterprise Research · Social Science Big Data Platform,
Using the most exclusive data,
Learn the most practical Python,
Draw the coolest picture!
'''
Part4总结
本文介绍了 API 是如何实现访问外部数据和功能的,也对 HTTP 协议以及两个常用的请求方式——GET 请求和 POST 请求做了简单介绍,然后通过两个例子演示了如何利用 Python 中的 requests 库实现 API 的调用,并解析返回的响应结果来获得相应的内容,也向大家展示了两种请求方式的异同点,希望对大家有所帮助。