如何在Python中下载一个文件


如何在Python中下载一个文件

你知道你可以在Python中以编程方式下载一个文件吗?我将向你展示如何在 Python 中获取并保存一个文件。这个过程被称为网络刮削,是任何与数据有关的项目的一个重要步骤。

网络刮削是从一个网站上收集数据的过程。虽然它可以由用户手动完成,但它通常是指在网络爬虫的帮助下自动收集数据的方法。

你可以在Python中以编程方式完成所有这些工作。在本文结束时,你将知道如何在 Python 中下载任何类型的文件,包括 PDF、图片、视频和网页。不同类型的文件之间的过程是相似的。

为了从这篇文章中获得最大的收获,最好对Python编程有一个基本的了解。另外,为了节省时间并加速学习,我鼓励你查看我们的Python编程轨道。

在Python中下载一个文件,我们需要获取它并保存它。这个过程可以通过调用 API 来完成,也可以用一个普通的 URL 指向你喜欢的 GIF。

在进一步讨论之前,让我们了解一下 REST APIs。REST API是一种服务,它允许您通过REST机制访问和操作服务器上的数据,如文本文件、图像、服务和其他资源集合。API有助于提高客户端应用程序的可移植性,并简化产品不同组件的演进过程。这些API通常返回UTF-8编码的JSON对象作为资源。

在使用REST API时,提出请求有两个基本步骤。首先,客户端访问REST API上的一个特定位置,并说明要执行的方法。这就是所谓的请求。其次,服务器执行该方法并将数据返回给客户端。这被称为响应。

认证是互联网安全的一个重要组成部分。任何允许客户访问或修改敏感或关键数据的REST API必须有一个认证系统。即使API是免费的,所有者也可以引入认证来限制每个用户的请求数量。

在本教程中,我们将用Python从place.dog和randomfox.ca获取和保存文件。不需要认证,所以你可以重复使用代码片段来下载Python中的文件。你可以在这里找到一个公共 API 的列表。

首先,我们将通过 HTTP 在 Python 中下载一个文件。稍后,我们将用 Python 从一个 API 中下载一个文件。让我们直接开始吧!

通过 HTTP 在 Python 中下载一个文件

在我们的第一个例子中,我们将获取并保存一个狗的图片。这个网站提供了随机的狗的图片,你可以将其作为你下一个项目的占位符。如果你刷新页面,它会生成另一张狗的图片。

我们将使用 requests 库,它使 HTTP 请求比使用内置的 urllib 库更简单。你可能需要用以下命令来安装 requests 库:

p install requests

然后,我们导入 requests,用我们的目标 URL 设置 url 变量,写一个 GET 请求并检查其状态。以下是你在编写GET请求时可能面临的不同类型的响应状态:

1xx 信息性。它表示已经收到了一个请求,客户端应该继续对数据有效载荷进行请求。2xx 成功。它表示已经收到、理解并接受了一个请求的操作。它帮助你在处理数据之前验证数据的存在。3xx 重定向。它表明客户端必须采取额外的行动来完成请求,如使用代理或不同的端点来访问资源。它表示客户端的问题,例如,不允许的方法、授权问题、禁止的访问,或试图访问不存在的资源。

让我们用Python写一个获取文件的请求。

>>> import requests

>> url = 'https://place.dog/300/200'

>> # fetch file

>> response = requests.get(url, allow_redirects=True)

>> # Get response status

>> response.status_code200

200状态代码表明请求成功,数据存在。从这里开始,我们继续下一步,在write()方法的帮助下在Python中保存一个文件。

200状态代码表明请求成功,数据存在。

现在,文件被保存为 dog1.jpg,包含了一张狗的图片。

关于在 Python 中保存文件的 write() 方法的良好复习,请查看我的文章:如何在 Python 中写入文件。

从 API 中下载文件

现在,让我们探索如何通过调用 API 和解析 JSON 文件来获取和保存一个 Python 文件。与我们之前所做的不同,我们将用 pathlib 保存文件。

大多数在线的数据都是以 JSON (JavaScript Object Notation) 的形式存在。它被用来在数据库中存储信息,是你在使用现代REST API时最常见的数据类型。JSON数据结构可以是无序的名-值对,如字典、哈希表、对象或有键列表,这取决于编程语言;也可以是有序的值列表,如数组、列表和向量。

JSON对于人类来说很难直接阅读和使用。Python 有不同的库来帮助我们阅读从网络上获取的 JSON 数据,以解决这个问题。其中,JSON 库内置支持将 JSON 组件转换为本地 Python 对象。下表显示了JSON和Python之间的转换映射:

JSONPython objectdictionary arrayList 或 tuple stringstring numberInteger 或 float trueTrue falseFalse nullNone

在使用REST API时,你必须经常处理JSON数据。你可以在我们的课程《如何在 Python 中读写 JSON 文件》中找到更多关于 JSON 的信息。

请求库有很多功能,但在下面的例子中我们只需要 GET 请求和 json() 格式化。正如我们之前所做的,第一步是导入 requests 库。然后,我们向我们想要访问的API端点创建一个GET请求。API提供了一个包括JSON数据的响应对象。我们只对JSON数据感兴趣,它是通过json()模块返回的。

>>> import requests

>>url = "<a href="https://randomfox.ca/floof"">https://randomfox.ca/floof"

>> # fetch file

>> response = requests.get(url, allow_redirects=True)

>> # get json data

>> json = response.json()

>> print(json){'image': 'https://randomfox.ca/images/2.jpg', 'link': 'https://randomfox.ca/?i=2'}

json的输出类似于一个Python字典。我们提取图片的URL,如下:

>>> img = json['image']>> print(img)https://randomfox.ca/images/2.jpg

接下来,我们要保存图片。如前所述,我们使用pathlib,一个面向对象的框架来处理文件系统路径。它的优点之一是在操作系统之间有更好的可移植性。你可以在我关于如何重命名文件的文章中找到更多关于pathlib的信息。

为了保存我们狐狸的图片,我们将使用Path.write_bytes(data)方法,以二进制/bytes模式打开路径并向其写入数据。

>>> # import Path class from pathlib

>> from pathlib import Path

>> # define filename

>> filename = Path('fox.jpg')

>> # fetch file

>> response = requests.get(img)

>> # save file

>> filename.write_bytes(response.content)

我们的文件现在已经被保存为fox.jpg。我们刚刚看到了如何通过检查json数据来提取API响应中的URL。

关于如何在Python中下载文件的结束语

我们现在已经学会了如何在Python中通过HTTP和从API中下载一个文件。我鼓励你玩玩这段代码,并从不同的 API 中获取文件。

关于 JSON 还有很多东西要学习,它是一种广泛而方便的数据存储格式。你可以通过我们的Python编程轨道找到更多关于它和Python编程的信息。

最后但并非最不重要的是,对你的Python编程技能进行反思始终是一个好主意。为了帮助你完成这个过程,请查看我的文章《可以帮助你写出更好的Python代码的事情》,并浏览我们intxue.com上的内容。坚持每天学习!



本文标签

热门标签

会员评论