为何选择 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
安装 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 是一项专业的网页抓取服务,可让您轻松从网站中提取数据,而无需自行构建和维护网页抓取工具。
这是一款快速、可靠且经济高效的解决方案,适合各种规模的企业。




