返回博客
指南
Gabriel CiociLast updated on Mar 31, 20262 min read

使用 Python 和 wget 轻松下载网页和文件

使用 Python 和 wget 轻松下载网页和文件

您是否厌倦了手动下载网页和文件?是否希望有一种更简单的方法来获取所需的数据?不用再找了!在本文中,我将向您展示如何使用 Python 和命令行工具 wget 来实现该过程的自动化。

在本文中,您将了解如何使用 Python 和 wget 实现网页下载的自动化,同时了解 wget 的功能与局限性,以及其他适用于网页抓取的替代工具。

为何选择 Python?

Python 是一种功能强大且广受欢迎的编程语言,广泛应用于自动化、数据科学和应用程序开发等多个领域。它易于学习,并拥有庞大的模块和框架库,能够显著增强其功能。

为何选择 wget?

wget 是一款命令行工具,可用于从互联网下载文件。它在大多数类 Unix 系统(包括 Linux 和 macOS)上广泛可用。wget 功能多样,既能下载单个文件,也能下载多个文件,甚至整个目录。

以下是 wget 的主要功能:

  • 从互联网下载文件:Wget 可用于从互联网下载文件,包括网页、图片及其他类型的文件。
  • 可自定义的下载选项:Wget 允许您指定各种选项来定制下载行为,例如文件的保存目录、文件名以及是否覆盖现有文件。
  • 恢复中断的下载:如果下载过程中断,wget 可以从中断处继续下载,从而节省时间和带宽。
  • 递归下载:wget 可以通过递归跟随链接来下载整个网站或目录。
  • 支持 HTTP、HTTPS 和 FTP:Wget 能够处理多种互联网协议,包括 HTTP、HTTPS 和 FTP,使其成为从不同类型服务器下载文件的通用工具。
  • 适用于大多数类 Unix 系统:wget 在大多数类 Unix 系统(包括 Linux 和 macOS)上广泛可用,使其在多种平台上都能轻松使用。

为何在 Python 中使用 wget?

Python 与 wget 结合使用,可以自动化网页和文件的下载过程,从而节省时间和精力。可以通过 Python 对 wget 进行定制,并将网页抓取或文件下载任务集成到现有的 Python 脚本中。

选择在 Python 中使用 wget 有以下几个原因:

  • 自动化:通过 Python 配合 wget,您可以实现从互联网下载文件的自动化。这能节省时间和精力,尤其是在需要下载大量文件或网页时。
  • 可定制性:Wget 允许您指定各种选项来定制下载行为,例如文件的保存目录、文件名以及是否覆盖现有文件。通过 Python 结合使用 Wget,您可以编程设置这些选项,并根据需求定制下载过程。
  • 易用性:Python 以其简单易懂和可读性强而著称,使其成为一种易于学习和使用的语言。通过在 Python 中使用 wget,您可以利用 Python 的强大功能,让网页抓取和文件下载任务变得更加轻松。
  • 可扩展性:Python 是一种可扩展的语言,能够处理海量数据。通过在 Python 中使用 wget,您可以扩展网络爬取或文件下载任务的规模,以处理更大的数据集。

入门指南

既然我们已经讨论了 Python 和 wget 的各自优势以及二者结合带来的好处,接下来让我们进入代码编写环节。

安装 wget

请确保您的计算机已安装 wget。如果您使用的操作系统是 Linux,则已预装该工具。

  • 如果您是 Windows 用户,可以从本页面下载二进制文件。请务必将二进制文件的路径添加到 PATH 环境变量中。另一种选择是使用 WSL(Windows 子系统 for Linux)。点击此处了解更多相关信息。
  • 如果您是 Mac 用户,请使用 brew 安装 wget

别忘了在此处查阅 wget 的详尽文档。

安装 Python

从官方网站获取 Python 的最新版本,并按照您所用平台的安装说明进行操作。安装完成后,您可以通过以下命令查看版本:

python3 --version

在 Python 中运行系统命令

Python 中的 `subprocess` 模块允许您运行系统命令并捕获其输出。这是在 Python 脚本内部与操作系统交互的一种强大且灵活的方式。

要使用 `subprocess` 模块,首先需要将其导入到 Python 脚本中。然后,您可以使用 `subprocess.run()` 函数来运行系统命令并捕获其输出。

`run()` 函数将待执行的命令作为字符串参数,并返回一个 `CompletedProcess` 对象,该对象包含命令的退出代码、标准输出(stdout)和标准错误(stderr)。

以下是一个使用 `subprocess.run()` 函数运行 `ls` 命令的示例,该命令用于列出目录中的文件:

import subprocess

result = subprocess.run(['ls', '-l'])

print(result.stdout)

使用 `python3 main.py` 命令运行此代码。结果应如下所示。

total 4

-rw-r--r-- 1 dan dan 80 Jan 6 18:58 main.py

None

使用 wget 下载

下载文件

首先,让我们下载 WebScrapingAPI 的徽标。将参数列表替换为 `wget` 以及徽标 URL。命令将如下所示:

result = subprocess.run(['wget', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

脚本将返回以下输出:

--2023-01-06 19:06:32-- https://www.webscrapingapi.com/images/logo/logo-white.svg

Resolving www.webscrapingapi.com (www.webscrapingapi.com)... 76.76.21.61, 76.76.21.98

Connecting to www.webscrapingapi.com (www.webscrapingapi.com)|76.76.21.61|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 5391 (5.3K) [image/svg+xml]

Saving to: 'logo-white.svg'

logo-white.svg 100%[====================================================================================================================================================================>] 5.26K --.-KB/s in 0.06s

2023-01-06 19:06:33 (91.6 KB/s) - 'logo-white.svg' saved [5391/5391]

None

从输出中,我们可以看到 `wget` 如何解析域名、连接到该域名、收到 `200 OK` 响应码、获取文件长度(5.3k),并开始将文件以 `logo-white.svg` 的名称保存到本地。

您可以在项目文件夹中查找 `logo-white.svg` 文件。

下载到指定目录

您可以通过使用 `-P` 参数将文件下载到自定义目录中。让我们更新脚本并运行它以查看结果:

result = subprocess.run(['wget', '-P', 'images', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

输出结果几乎相同,唯一的区别是文件被存储在 `./images/` 目录中。

设置下载文件名

使用 `-O` 参数,您可以为下载的文件指定一个新名称。让我们试一试:

result = subprocess.run(['wget', '-O', 'named-logo.svg', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

请在项目文件夹中查找 `named-logo.svg` 文件。

若远程版本更新则下载文件

您可以使用 `-N` 参数,仅在远程文件的版本比本地文件新时才下载该文件。命令如下所示:

result = subprocess.run(['wget', '-N', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

恢复中断的下载

如果下载中断,`wget` 可以从中断处继续下载,从而节省时间和带宽。要实现这一点,您需要使用 `-c` 选项,该选项会指示 `wget` 继续中断的下载。

命令示例如下:

result = subprocess.run(['wget', '-c', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

如果文件下载已完成,您可以在输出中看到以下消息:

HTTP request sent, awaiting response... 416 Requested Range Not Satisfiable

The file is already fully retrieved; nothing to do.

递归下载

Wget 可以通过递归跟踪链接来下载整个网站或目录。要实现这一点,您需要使用 `-r` 和 `-l` 选项:`-r` 选项指示工具递归跟踪链接,而 `-l` 选项则指定递归的最大深度。

result = subprocess.run(['wget', '-r', '-l', '2', 'https://www.webscrapingapi.com'])

该命令将下载位于 "https://www.webscrapingapi.com" 的网站,并追踪该网站上其他页面的链接,最大递归深度为 2。

何时不应使用 wget?

在以下几种情况下,使用 curl、Beautiful Soup 或 Selenium 可能比 wget 更合适:

  • 当需要设置 HTTP 头部或 Cookie 时:Curl 允许设置 HTTP 头部和 Cookie,这在与 API 交互或访问受保护的网站时非常有用。`wget` 不具备此功能。
  • 当需要解析并从 HTML 中提取数据时:Beautiful Soup 是一个 Python 库,可轻松解析 HTML 文档并从中提取数据。wget 并非为解析网页并提取数据而设计。
  • 当您需要以用户身份与网站交互时:Selenium 是一款工具,可让您自动化以用户身份与网站交互的过程。它可用于填写表单、点击按钮以及执行 wget 无法实现的其他操作。

结论

Python 和 wget 是用于自动化下载文件和网页的强大工具。通过将 wget 与 Python 结合使用,您可以自定义下载设置,将网页抓取或文件下载任务集成到现有的 Python 脚本中,从而节省时间和精力。

不过,请务必遵守目标网站的服务条款,避免给服务器造成过载。

如果您正在寻找 wget 的替代方案用于网页抓取,不妨考虑使用 WebScrapingAPI。WebScrapingAPI 是一项专业的网页抓取服务,可让您轻松从网站中提取数据,而无需自行构建和维护网页抓取工具。

这是一款快速、可靠且经济高效的解决方案,适合各种规模的企业。

今天就试试吧!

关于作者
Gabriel Cioci, 全栈开发工程师 @ WebScrapingAPI
Gabriel Cioci全栈开发工程师

加布里埃尔·乔奇(Gabriel Cioci)是 WebScrapingAPI 的全栈开发工程师,负责构建和维护该平台的网站、用户面板以及面向用户的核心功能模块。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。