如何使用 Python 从 URL 下载文件2024年8月29日 | 阅读 10 分钟 在本教程中,我们将讨论如何使用 Python 中的第三方库从 Web 下载文件。我们还将探索流数据以可管理块下载大文件,并使用线程池实现并行下载。 Python 提供了一系列全面的工具和库,这些工具和库在各种应用程序中都很有价值,从 Web 解析到脚本自动化以及获取信息的检查。它提供了从 URL 获取文件的能力,这是获取所需信息的重要任务。 使用 Python 简化文件下载除了编程语言,我们还可以使用命令行工具下载文件。然而,Python 提供了各种库,这些库有助于文件检索。Python 比命令行工具具有各种优势。灵活性是主要的优势,这归因于 Python 各种各样的库。这些资源包括管理各种文件格式、协议和身份验证方法的有效技术。它允许我们选择适合我们目标的 Python 工具,无论我们是从基本的 CSV 文件还是复杂的二进制文件检索内容。 另一点是关于您的代码可以移动的程度。有时您可能需要在不同类型的计算机上运行的应用程序。在这些情况下,Python 是一个不错的选择,因为它适用于所有类型的计算机。这意味着您的 Python 代码在 Windows、Linux 和 macOS 上将以相同的方式工作。 使用 Python 还可以让我们自动化我们手动完成的事情,这可以节省我们的时间和精力。例如,我们可以设置 Python 在第一次下载失败时重试下载,从互联网上获取大量文件并自动保存它们,并通过将数据放置到我们想要的位置来管理数据。 在 Python 中从 URL 下载文件在本节中,我们将开始下载一种特殊的文件,称为 ZIP 文件。此文件包含有关一个国家/地区经济收入的信息,称为国内生产总值 (GDP)。您将使用 Python 中两个常用的辅助工具 urllib 和 requests 来获取不同国家的 GDP 数据。尽管 Python 已经有一个名为 urllib 的辅助包,但它有一些限制。因此,我们还将探索如何使用另一个外部辅助工具,名为 requests。这个辅助工具非常有名,并且在您想从互联网上获取东西时,它具有更多的功能。 使用标准库中的 urllibPython 附带了一个名为“urllib”的库,它可以帮助您轻松地处理 Web 资源。它设计为易于使用,这在您刚开始或处理小型项目时非常有用。这个库可以让您完成各种与 Web 相关的工作,例如查看网站地址、从网站获取信息、保存文件以及处理在 Web 上工作时可能发生的问题。 由于 urllib 是 Python 基本工具集的一部分,因此您无需安装其他包即可使用它。这使得它非常易于使用。您可以将其用于构建和部署。它在不同类型的计算机上也能以相同的方式工作,因此您无需在 Windows、Linux 或 macOS 之间切换时更改任何内容。 除此之外,您可以通过添加其他外部辅助工具(例如 requests、BeautifulSoup 和 Scrapy)来使 urllib 工具箱功能更强大。这使得可以完成更高级的任务,例如从网站收集信息和与 Web 服务通信。 要使用 urllib 包从 URL 下载文件,您可以从 urllib.request 模块调用 urlretrieve()。此函数从指定的 URL 获取 Web 资源,然后将响应保存到本地文件。首先,从 urlllib.request 导入 urlretrieve()。 之后,我们需要定义要检索数据的 URL,还需要指定要保存数据的位置。否则,它将保存到临时文件中。由于我们知道将从该网站获取 ZIP 文件,因此我们可以通过提供文件的路径来选择其保存位置。 之后,您可以使用 urlretrieve() 下载文件。您只需提供 Web 地址和文件在您计算机上的路径。 该函数返回一对两项:您的文件现在的位置和 HTTP 消息对象。当您没有为文件定义路径时,它可能会向您显示一个临时文件的路径,例如 - /tmp/tmps7qjl1tj。此特殊消息表示互联网服务器返回的 HTTP 标头。它包含有关内容类型、内容长度和其他元数据或额外信息的详细信息。 让我们看看完整的代码 - 示例 - 输出 Date Thu, 19 Aug 2023 00:00:00 GMT Server Apache X-Powered-By PHP/5.6.33 Content-Encoding gzip Content-Disposition attachment; filename=API_NY.GDP.MKTP.CD_DS2_en_csv_v2_2760797.csv Content-Type application/zip Connection close Transfer-Encoding chunked 当您不确定下载的文件类型以及如何理解其内容时,此信息会很有用。这里,它是一个大约 128 千字节大小的 ZIP 文件。 既然您已经了解了如何使用 Python 的 urllib 库从 Web 地址获取文件,那么让我们尝试使用第三方库做同样的事情。这将帮助您找出哪种方法更容易。 使用第三方请求库虽然 urllib 是 Python 自带的一个好工具,但有时您可能希望使用外部的其他辅助工具,尤其是对于更棘手的工作,例如发出特殊的 Web 请求或需要某些类型的权限。其中一个辅助工具是 requests 库。它被广泛使用,易于使用,并且遵循 Python 的风格。它管理与互联网通信的复杂部分。 请求库因其适应性和对下载方式的控制而闻名。这意味着您可以更改内容以精确匹配您的项目需求。例如,您可以决定请求的外观、管理 cookie、进入需要登录的页面、逐位获取数据,以及做更多类似的事情。 此外,该库旨在通过许多有用的功能来提高下载效率,从而高效快速地工作。它擅长处理诸如保持连接就绪以供使用之类的事情,这使得互联网使用更少的能量并工作得更快。这样,事情就可以完成而不会浪费时间。 我们可以使用 pip 命令安装此库。 安装后,我们可以将其导入到本地机器中。众所周知,当我们向网络服务发出 HTTP 请求时,有两种常用的方法:
您将使用 GET 方法通过从远程资源获取副本而不更改服务器上的任何内容来获取信息。此方法通常用于获取图像、网页或原始数据等内容。您稍后将使用 GET 方法获取内容。 另一方面,POST 方法允许您发送服务器将使用或处理的数据以创建或更改某些内容。使用 POST,数据通常作为请求的一部分发送,您不会在网址中看到它。您可以将 POST 用于更改服务器上内容的任务,例如创建、更新或提供新的或现有的内容。 首先导入 requests 库并定义要下载的文件的 URL。要在 URL 中包含额外的查询参数,您将传入一个由字符串组成的键值对字典。 在之前的示例中,您像以前一样设置了 URL,但您还使用 Python 中称为字典的特殊单词和含义列表添加了“downloadformat=csv”部分。当您将此列表提供给 `requests.get()` 时,该库会自动将这些额外内容附加到网址中。 使用 GET 请求,它从您定义的网址获取信息,包括任何额外的详细信息。辅助工具以 HTTP 响应的形式返回来自互联网的响应。如果您想查看它使用的完整网址以及额外的参数,您可以使用响应的 `.url` 部分找到它。 您获得的响应还包含一些其他有用的信息供您查看。例如,您可以使用这两个信息来判断请求是否成功以及 Web 服务器返回了什么 HTTP 代码。 将下载的内容存储到文件现在您已经使用 requests 库从互联网获取了内容,您可以将其保存在您的计算机上。当您使用 Python 将内容放入文件时,最好使用 'with' 语句。这样,Python 确保一切顺利运行,包括文件,并在您完成时为您关闭它们。 以流方式下载大文件您已经学会了如何使用内置的 urllib 库和第三方 requests 库下载一个 ZIP 文件。但是,如果您需要下载大文件,您可能会遇到上述步骤的问题,因为整个文件无法容纳在您的计算机内存中。 为了解决这些问题,您可以以一种特殊的方式获取大量数据,称为“流式传输”。这意味着您不会试图一次性查看所有大量数据,而是每次取少量部分。流式传输允许您处理这些小部分,这样您就不会用尽整个计算机的内存,并且事情会更快。 流数据在其他情况下也有好处,例如在 Python 中下载文件时。以下是一些优点:
当您想一点一点地获取一个非常大的文件时,您会发出请求,但不会一次性获取所有内容。相反,您将开始只获取有关即将到来的信息并保持连接打开。这通过在 `requests.get()` 函数中使用特殊设置来完成。 我们将尝试下载一个大文件(约 72 兆字节),其中包含来自世界银行开放数据的世界发展指标信息。 当您使用 `stream=True` 时,请求库以一种特殊的方式请求文件,让您可以一点一点地获取它。这就像先请求文件的开头部分。您可以使用获取到的内容的 `.headers` 查看这部分,其中包含特殊信息。 示例 - 输出 {'Date': 'Wed, 14 Jun Aug 12:53:58 GMT', 'Content-Type': 'application/x-zip-compressed', 'Content-Length': '71855385', 'Connection': 'keep-alive', 'Last-Modified': 'Thu, 11 May 2023 14:56:30 GMT', 'ETag': '0x8DB522FE768EA66', 'x-ms-request-id': '8490ea74-101e-002f-73bf-a9210b000000', 'x-ms-version': '2009-09-19', 'x-ms-lease-status': 'unlocked', 'x-ms-blob-type': 'BlockBlob', 'Cache-Control': 'public, max-age=3600', 'x-azure-ref': '20230628T125357Z-99z2qrefc90b99ypt8spyt0dn40000...8dfa', 'X-Cache': 'TCP_MISS', 'Accept-Ranges': 'bytes'} 您可能已经注意到其中一个标头提到服务器正在保持连接打开。这被称为“HTTP 持久连接”。它就像有一条开放的线路用于通话,而不是每次都拨号和挂断。没有这个,每次您想发出连接请求时,您都需要拨号和挂断,这会花费更多的时间和精力。 在 requests 库中使用流模式的另一个好处是,即使您只发送一个请求,也可以分块获取数据。为此,您可以使用响应对象中的 `.iter_content()` 方法。此方法允许您以小而易于处理的块遍历数据。此外,您可以通过使用 `chunk_size` 设置来选择这些部分的大小。它告诉程序一次读取多少字节。 requests 库提供了广泛的功能,可在各种下载场景中发挥作用。虽然我们尚未深入探讨这些任务,但该库包含处理身份验证、管理重定向、控制会话等功能。这些功能提供了更大的控制和灵活性,尤其适用于更复杂的任务。 结论Python 是一个功能强大的工具,可用于自动化文件下载并在过程中获得精确的控制和适应性。Python 提供了从 URL 下载文件的一系列解决方案。这包括下载大文件、处理多个下载以及从需要特殊访问权限的网站检索文件。 在本教程中,您已掌握使用 Python 下载文件的过程。您还学习了如何
下一主题Python 中的日志函数 |
我们请求您订阅我们的新闻通讯以获取最新更新。