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

本文目录

一、前言

二、调用浙江·数据开放平台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 设计的参数如下:

参数名称

类型

说明

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 数据,若设置参数​​jsnotallow=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 的调用,并解析返回的响应结果来获得相应的内容,也向大家展示了两种请求方式的异同点,希望对大家有所帮助。

  • 32
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python+Vue+Django前后端分离项目实战,涉及到使用Python语言编写后端服务,使用Vue框架构建前端界面,并通过Django框架作为API接口实现前后端数据交互的方式。在实战项目中也会涉及到数据库设计和调用、权限控制、文件上传等问题的解决。 ### 回答2: Python、Vue和Django是现在非常流行的前后端开发技术。如果你想学习这些技术,那么前后端分离是一个很好的选择。在这个项目中使用Python作为后端编程语言,Django作为Web框架,Vue作为前端框架。我们可以在这个项目中学习到很多关于前后端分离的经验。 首先,前后端分离可以让我们更好地组织我们的代码。在一个分离的项目中,我们可以通过明确的接口来分离前端和后端。这样一来,我们可以专注于开发代码,而不必担心前后端之间的交互问题。 其次,前后端分离可以使我们更好地实现可重用性。在这个项目中,我们可以编写可重用的Vue组件,并在不同的前端页面中使用它们。同样地,我们也可以编写可重用的Django应用程序,并在不同的后端端点中使用它们。这会使我们的代码更加清晰简洁,也可以提高我们的开发效率。 最后,前后端分离可以让我们更好地实现可维护性。在一个分离的项目中,我们可以更轻松地进行单元测试和端到端测试。这可以帮助我们保持代码的质量,并尽早发现和解决潜在的问题。 总之,Python、Vue和Django前后端分离项目是一个非常好的学习项目。通过这个项目,我们可以从实践中学习如何使用这些技术,并在以后的项目中更好地应用它们。 ### 回答3: Python、Vue和Django是目前非常流行的技术栈之一,其中Python和Django主要用于后端开发,Vue则是一款流行的前端框架。Python和Django的优点在于它们易于学习、可扩展性强、社区活跃,并且可以用于构建各种类型的Web应用程序。而Vue的优点在于它简洁、高效、组件化,并且可以很好地配合其他框架和库使用。 前后端分离是一种可以将前端和后端分别开发的方法,这种方法具有很多优点。首先,可以使开发人员更加专注于各自的领域,减少互相干扰和影响。其次,这种方法可以提高应用程序的可维护性和可扩展性。最后,这种方法还可以提高开发效率,使开发人员能够更加高效地开发应用程序。 在前后端分离项目实战中,需要注意以下几点。首先,需要确定应用程序的需求,确定前端和后端的接口规范。其次,需要使用合适的工具和框架来完成前后端的开发任务。对于后端开发,可以使用Django的REST框架,这个框架可以很快地构建RESTful API,并且配合数据库使用。而对于前端开发,则可以使用Vue框架来开发,Vue可以很好地处理数据和UI逻辑。最后,需要着重测试和调试应用程序,确保应用程序的正确性和可用性。 总的来说,Python、Vue和Django是一组非常流行的技术栈,非常适合用于前后端分离项目的开发。在开发前需要确定好需求,选择好工具和框架,开发期间需要注重测试和调试,这样才能开发出高质量的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值