首页 >后端开发 >Python教程 >用Python从HTTP API获取数据

用Python从HTTP API获取数据

Christopher Nolan
Christopher Nolan原创
2025-02-10 15:11:12755浏览

Fetching Data from an HTTP API with Python

Python高效访问HTTP API:requests库与请求缓存

本文节选自《实用Python》,作者Stuart演示了如何利用Python和几个第三方模块轻松访问HTTP API。

大多数情况下,处理第三方数据需要访问HTTP API,即向设计为机器读取而非人工读取的网页发出HTTP请求。API数据通常采用机器可读格式,通常为JSON或XML。 让我们看看如何使用Python访问HTTP API。

使用HTTP API的基本原则很简单:

  1. 向API的URL发出HTTP请求,可能包括一些身份验证信息(例如API密钥)以证明我们已获得授权。
  2. 获取数据。
  3. 利用数据完成有用的操作。

Python标准库提供了足够的函数来完成所有这些操作,无需任何附加模块,但如果我们使用几个第三方模块来简化流程,将会使我们的工作更轻松。第一个是requests模块。这是一个用于Python的HTTP库,它使获取HTTP数据比Python内置的urllib.request更便捷,可以使用python -m pip install requests安装。

为了展示其易用性,我们将使用Pixabay的API(此处有文档)。Pixabay是一个图片网站,所有图片都可以重复使用,这使其成为一个非常方便的资源。我们将关注水果图片。稍后在操作文件时,我们将使用收集到的水果图片,但现在我们只想找到水果图片。

首先,我们将快速查看Pixabay上有哪些图片可用。我们将抓取一百张图片,快速浏览它们,然后选择我们想要的图片。为此,我们需要一个Pixabay API密钥,因此我们需要创建一个帐户,然后从API文档的“搜索图片”部分获取密钥。

requests模块

使用requests模块向API发出HTTP请求的基本版本包括构建HTTP URL、发出请求以及读取响应。此处,响应采用JSON格式。requests模块使每个步骤都非常简单。API参数是一个Python字典,get()函数发出调用,如果API返回JSON,requests会将其作为响应中的.json提供。因此,简单的调用如下所示:

<code class="language-python">import requests

PIXABAY_API_KEY = "11111111-7777777777777777777777777"

base_url = "https://pixabay.com/api/"
base_params = {
    "key": PIXABAY_API_KEY,
    "q": "fruit",
    "image_type": "photo",
    "category": "food",
    "safesearch": "true"
}

response = requests.get(base_url, params=base_params)
results = response.json()</code>

这将返回一个Python对象,正如API文档所建议的那样,我们可以查看其各个部分:

为了获取一百个结果,我们可以简单地决定进行五次调用,每次调用获取20个结果,但这不够稳健。更好的方法是循环请求页面,直到获得所需的一百个结果,然后停止。这可以防止在Pixabay更改默认结果数量(例如更改为15)时出现问题。它还可以让我们处理搜索词没有一百张图片的情况。因此,我们使用一个while循环,每次递增页码,如果我们已经达到100张图片,或者没有图片可检索,我们就退出循环:

缓存HTTP请求

避免多次向HTTP API发出相同的请求是个好主意。许多API都有使用限制,以避免被请求者过度使用,请求需要花费时间和精力。我们应该尽量避免重复之前的请求。幸运的是,在使用Python的requests模块时,有一种有用的方法可以做到这一点:使用python -m pip install requests-cache安装requests-cache。这将无缝记录我们进行的任何HTTP调用并保存结果。然后,稍后如果我们再次进行相同的调用,我们将获得本地保存的结果,而无需再次访问API。这节省了时间和带宽。要使用requests_cache,请导入它并创建一个CachedSession,然后使用session.get而不是requests.get来获取URL,我们将无需额外努力即可获得缓存的好处:

生成输出

为了查看查询结果,我们需要在某个地方显示图片。一种便捷的方法是创建一个简单的HTML页面来显示每个图片。Pixabay提供了每个图片的小缩略图,它在API响应中称为previewURL,因此我们可以创建一个HTML页面来显示所有这些缩略图,并将它们链接到主要Pixabay页面——我们可以从中选择下载我们想要的图片并为摄影师署名。因此,页面中的每个图片可能如下所示:

我们可以使用列表推导式从images列表构建它,然后使用"n".join()将所有结果连接成一个大的字符串:

然后,如果我们写出一个包含该列表的非常简单的HTML页面,则很容易在Web浏览器中打开它,快速查看我们从API获得的所有搜索结果,并单击其中任何一个跳转到完整的Pixabay页面进行下载:

Fetching Data from an HTTP API with Python

本文节选自《实用Python》,可在SitePoint Premium和电子书零售商处购买。

(以下为FAQs,已根据原文进行改写和精简)

关于使用Python的HTTP API获取数据的常见问题 (FAQs)

  • HTTP和HTTPS的区别是什么? HTTP是超文本传输协议,HTTPS是安全超文本传输协议。主要区别在于HTTPS使用SSL证书建立服务器和客户端之间安全的加密连接,而HTTP则没有。这使得HTTPS在传输敏感数据(如信用卡信息或登录凭据)时更安全。

  • Python中HTTP是如何工作的? Python中可以使用多个库发出HTTP请求,最常用的是requests。该库允许您发送HTTP请求并处理响应,包括处理Cookie、表单数据、多部分文件等等。它是与Web服务交互的强大工具,可用于各种应用程序。

  • 常见的HTTP方法有哪些?如何在Python中使用它们? 最常见的HTTP方法是GET、POST、PUT、DELETE、HEAD、OPTIONS和PATCH。在Python中,可以使用requests库使用这些方法。例如,要发送GET请求,可以使用requests.get(url),要发送POST请求,可以使用requests.post(url, data)

  • 如何在Python中处理HTTP响应? 当您使用requests库在Python中发送HTTP请求时,会得到一个Response对象。此对象包含服务器对您请求的响应。如果响应采用JSON格式,您可以使用response.textresponse.json()访问响应的内容。您还可以使用response.status_code检查响应的状态代码。

  • 如何在Python中使用HTTP标头? 通过将HTTP标头作为字典传递给requests函数的headers参数,可以在Python中使用它们。例如,requests.get(url, headers={'User-Agent': 'my-app'})。标头可用于提供有关请求或客户端的其他信息,例如用户代理、内容类型、授权等等。

  • 如何在Python中处理Cookie? 可以使用Response对象的cookies属性在Python中处理Cookie。您可以使用response.cookies访问服务器发送的Cookie,并通过将Cookie作为字典传递给requests函数的cookies参数来将Cookie发送到服务器。

  • 如何在Python中使用POST请求发送表单数据? 通过将表单数据作为字典传递给requests.post函数的data参数,可以在Python中使用POST请求发送它。例如,requests.post(url, data={'key': 'value'})requests库将自动以正确的格式编码数据。

  • 如何在Python中使用POST请求发送文件? 通过将文件作为字典传递给requests.post函数的files参数,可以在Python中使用POST请求发送文件。字典应包含文件字段的名称作为键,以及包含文件名和文件对象的元组作为值。

  • 如何处理requests库在Python中的错误和异常? Python中的requests库会针对某些类型的错误(例如网络错误或超时)引发异常。您可以使用try/except块捕获这些异常并适当地处理它们。您还可以检查响应的状态代码来处理HTTP错误。

  • 如何在Python中发出异步HTTP请求? 可以使用aiohttp库在Python中发出异步HTTP请求。该库允许您异步发送HTTP请求和处理响应,这在处理大量请求时可以显着提高应用程序的性能。

以上是用Python从HTTP API获取数据的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn