用 Python 下载文件

Siddharth Swami 2023年1月30日
  1. 在 Python 中使用 requests 模块下载文件
  2. 在 Python 中使用 urllib 模块下载文件
  3. 在 Python 中使用 pycurl 模块下载文件
用 Python 下载文件

Python 经常用于访问 Internet 上的资源。我们可以使用不同的库生成请求和连接。这些库还可以帮助我们从 Web 下载或读取 HTTP 文件。

在本教程中,我们将使用 Python 从 Internet 下载文件。

在 Python 中使用 requests 模块下载文件

我们可以使用 requests 模块从互联网上检索信息和阅读网页。

get() 方法有助于从要下载文件的给定 URL 中检索文件的路径。open() 方法创建一个我们希望保存文件的文件对象,然后 write() 函数用于将文件内容写入所需的路径。

我们使用这些函数来下载文件,如下所示。

import requests as req

URL = "https://www.facebook.com/favicon.ico"
file = req.get(url, allow_redirects=True)

open("facebook.ico", "wb").write(file.content)

输出:

1150

上面的代码从其 URL 下载 Facebook 的徽标文件并将其存储在工作目录中。我们可以在 open() 函数中指定任何路径,但我们必须以 wb 模式打开它。这表明我们打算以二进制模式写入文件。

上面的例子适用于下载较小的文件,但对于大文件效率不高。file.content 函数用于以单个字符串的形式获取文件内容。由于我们在上面的例子中使用了一个小文件,它工作正常。

如果我们必须下载一个大文件,那么我们应该使用 file.iter_content() 函数,我们将在其中指定块大小。它以块的形式下载数据。

我们在以下示例中使用此函数。

import requests

URL = "http://codex.cs.yale.edu/avi/db-book/db4/slide-dir/ch1-2.pdf"

file = requests.get(URL, stream=True)

with open("Python.pdf", "wb") as pdf:
    for chunk in file.iter_content(chunk_size=1024):

        if chunk:
            pdf.write(chunk)

在 Python 中使用 urllib 模块下载文件

我们还可以使用 Python 中的 urllib 库从 Web 下载和读取文件。这是一个 URL 处理模块,具有不同的功能来执行给定的任务。

在这里,我们还必须指定要下载的文件的 URL。urllib.request.urlopen() 方法获取文件的路径并向正在下载文件的服务器发送请求。

要下载文件,我们可以使用 urllib.request.urlretrieve() 函数。它将从给定地址下载资源并将其存储在提供的目录中。

我们在下面的例子中使用这种方法下载 Facebook 的图标。

import urllib

urllib.request.urlretrieve("https://www.facebook.com/favicon.ico", "fb.ico")

输出:

('fb.ico', <http.client.HTTPMessage at 0x2d2d317a088>)

上面的输出表明文件下载成功。

在 Python 中使用 pycurl 模块下载文件

我们可以使用此模块的文件处理从 Internet 下载文件。首先,我们必须为我们希望下载所需文件的位置创建一个文件对象。然后,我们将使用 pycurl.Curl() 函数来创建一个对象并启动 curl 会话。

setopt() 方法用于设置文件的 URL 值。接下来,perform() 函数通过发送 HTTP 请求从服务器执行文件传输过程。接下来,我们将使用文件对象将检索到的数据写入文件。最后,close() 方法关闭会话,我们将文件下载到工作目录中。

请参考下面的代码。

import pycurl

file_name = "fb.ico"
file_src = "https://www.facebook.com/favicon.ico"

with open(file_name, "wb") as f:
    cl = pycurl.Curl()
    cl.setopt(cl.URL, file_src)
    cl.setopt(cl.WRITEDATA, f)
    cl.perform()
    cl.close()

相关文章 - Python HTTP