您是否厌倦了手动下载网页和文件?是否希望有一种更简单的方法来获取所需的数据?不用再找了!在本文中,我将向您展示如何使用 Python 和命令行工具 wget 来实现该过程的自动化。
在本文中,您将了解如何使用 Python 和 wget 实现网页下载的自动化,同时了解 wget 的功能与局限性,以及其他适用于网页抓取的替代工具。

您是否厌倦了手动下载网页和文件?是否希望有一种更简单的方法来获取所需的数据?不用再找了!在本文中,我将向您展示如何使用 Python 和命令行工具 wget 来实现该过程的自动化。
在本文中,您将了解如何使用 Python 和 wget 实现网页下载的自动化,同时了解 wget 的功能与局限性,以及其他适用于网页抓取的替代工具。
Python 是一种功能强大且广受欢迎的编程语言,广泛应用于自动化、数据科学和应用程序开发等多个领域。它易于学习,并拥有庞大的模块和框架库,能够显著增强其功能。
wget 是一款命令行工具,可用于从互联网下载文件。它在大多数类 Unix 系统(包括 Linux 和 macOS)上广泛可用。wget 功能多样,既能下载单个文件,也能下载多个文件,甚至整个目录。
以下是 wget 的主要功能:
Python 与 wget 结合使用,可以自动化网页和文件的下载过程,从而节省时间和精力。可以通过 Python 对 wget 进行定制,并将网页抓取或文件下载任务集成到现有的 Python 脚本中。
选择在 Python 中使用 wget 有以下几个原因:
既然我们已经讨论了 Python 和 wget 的各自优势以及二者结合带来的好处,接下来让我们进入代码编写环节。
从官方网站获取 Python 的最新版本,并按照您所用平台的安装说明进行操作。安装完成后,您可以通过以下命令查看版本:
python3 --version
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.pyNone
首先,让我们下载 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 SatisfiableThe 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。
在以下几种情况下,使用 curl、Beautiful Soup 或 Selenium 可能比 wget 更合适:
Python 和 wget 是用于自动化下载文件和网页的强大工具。通过将 wget 与 Python 结合使用,您可以自定义下载设置,将网页抓取或文件下载任务集成到现有的 Python 脚本中,从而节省时间和精力。
不过,请务必遵守目标网站的服务条款,避免给服务器造成过载。
如果您正在寻找 wget 的替代方案用于网页抓取,不妨考虑使用 WebScrapingAPI。WebScrapingAPI 是一项专业的网页抓取服务,可让您轻松从网站中提取数据,而无需自行构建和维护网页抓取工具。
这是一款快速、可靠且经济高效的解决方案,适合各种规模的企业。

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