查看原文
其他

Python实战 | 如何使用 Python 调用 API

分享技巧的 数据Seminar 2023-09-03

本文目录

一、前言

二、调用浙江·数据开放平台API获取数据

  (一)API获取数据的流程

  (二)HTTP请求

  (三)API的参数

  (四)使用request库获取API数据

三、调用百度通用翻译API

四、总结

本文共8914个字,阅读大约需要23分钟,欢迎指正!

Part1引言

API 的全称为"Application Programming Interface",即“应用程序编程接口”,是一组定义了不同软件组件之间如何相互通信的规则和协议,不同的软件系统可以通过 API 来交换数据和功能,以实现特定的任务目标。通过 API,我们就可以利用其他软件系统的功能,而不需要详细了解其内部是如何实现的。

在如下两篇文章中,我们介绍了如何使用 Python 来调用高德公司提供的地理服务 API 以及百度公司提供的图像识别 OCR API,从而可以借助地理编码和逆地理编码来自由地转换文本地址和经纬度,并且也能够通过 OCR 技术将不可读取的 PDF 或图片中的表格读到 Excel 中。

数据治理 | 根据地址获取经纬度及行政区划——API的妙用

数据治理 | 还在人工识别表格呢?Python 调用百度 OCR 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 协议下的一种数据格式,用于向服务器发送请求,其通常由请求行、请求头和请求体三部分构成,请求头和请求体之间用空行隔开,其中各部分包含的信息如下:

  1. 请求行 (Request Line):包括请求方法 (GET请求、POST请求等)、请求的 URL 和协议版本。
  2. 请求头 (Request Headers):包括一些关于请求的附加信息,如 User-Agent(用户代理,标识请求的客户端类型等)、Content-Type(指定请求体中发送的数据的类型)等。
  3. 请求体 (Request Body):HTTP 请求中可选的组成部分,用于向服务器传递请求所需的参数或数据,如表单数据、JSON 数据等。

GET 请求通过 URL 的查询字符串将参数传递给服务器,也就是说参数会附加在 URL 的末尾,而 POST 请求将参数放在请求体中传递给服务器,所以通常情况下 GET 请求的请求体为空,POST 请求的请求体不为空。

3API 的参数

通常在调用 API 时需要关注公共参数、请求参数和响应参数这三种参数,其中各部分包含的信息如下:

  1. 公共参数:调用 API 时经常使用的通用参数,用于标识请求的身份、版本、签名等信息,这些参数在调用不同 API 时不会随着 API 的变化而变化。
  2. 请求参数:调用具体的 API 时需要提供的参数,用于描述请求的具体内容(如传递查询条件、分页信息等),这些参数是必需的还是可选的需要根据具体 API 的设计而定。
  3. 响应参数:API 调用成功后返回的信息,通常包括 API 调用结果的状态码、错误信息、返回的数据等。根据 API 的设计,响应参数的内容和格式可能会有不同。

公共参数和请求参数是用于发起 API 请求的,而响应参数是 API 返回的结果,需要注意一点,不同的 API 可能有不同的参数要求。

本例中需要获取浙江省粮食企业信用评价数据,根据分页数据获取接口的介绍,该 API 设计的参数如下:

参数名称类型说明
appsecretString用户应用识别码,通过申请获得
pageNumInt页数
pageSizeInt每页个数(不超过200)

上表中的参数appsecret为公共参数,pageNumpageSize为请求参数。

参数名称类型说明
statusInt0代表失败,1代表成功
msgString返回信息
dataJSON返回数据

上表中的三个参数为响应参数,用于返回请求的结果,我们只需要根据参数的名称就可以在返回的响应信息中提取相应的内容。当然在使用浙江省数据开放平台接口前,需要先完成用户注册并登录平台创建数据应用、完善应用信息,应用信息保存后即可进行接口申请,在接口申请审核通过后,就可以进行数据接口对接工作,操作流程见下图:更加详细的注册和申请流程见官方提供的接口服务使用手册,本文不再赘述。

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。除了参数urlparams,函数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随机数(盐值)
signappid+q+salt+密钥做 MD5 后得到的 32 位小写签名

为了确保调用 API 的安全性,通用翻译 API 要求使用参数sign对请求进行签名,签名由平台分配的 appid、待翻译内容 q、随机值 salt 和密钥四部分构成,其生成方法为:将 appid、q、salt、密钥按顺序连接成一个字符串,再对该字符串做 MD5 计算,就可以获得 32 位小写的 sign。

成功调用 API 后返回 JSON 格式的响应结果,其中包含以下输出参数:

官方对输入参数和输出参数有更详细的说明,可自行进一步了解

参数名称类型说明
fromString翻译源语言
toString翻译目标语言
trans_resultArray翻译结果,包括原始内容 (src) 和翻译结果 (dst)
error_codeInt错误码,仅在出现错误时显示,详细含义和解决方案见通用翻译 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(3276865536)
    # 使用 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(3276865536)
    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 和密钥,即可得到翻译的结果(默认英文),当然如果想要翻译其他语种或者修改翻译的目标语言,可以通过指定参数fromlanguagetolanguage来实现。

当然我们也可以实现批量翻译多条语句,只需要将各个语句用换行符\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 的调用,并解析返回的响应结果来获得相应的内容,也向大家展示了两种请求方式的异同点,希望对大家有所帮助。

下期文章我们将以本期调用 API 的功能为基础,为大家介绍如何使用 OpenAI 公司的 API 实现 chatgpt 的连续对话功能,为我们的数据处理和分析助力!敬请期待!



星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧

往期推荐


Python 教学 | 列表推导式 & 字典推导式

Python 教学 | Pandas 时间数据处理方法

Python 教学 | Pandas 函数应用(apply/map)【下】

Python 教学 | Pandas 函数应用(apply/map)【上】

Python 教学 | Pandas 数据匹配(含实操案例)




数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 《社科领域大数据治理实务手册》


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存