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

Suciu Dan,2023 年 4 月 21 日

博客图片

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

在本文中,你将了解如何使用 Python 和 wget 自动完成从网上下载的过程,同时了解 wget 的功能和局限性,以及用于网络搜刮的其他工具。

为什么是 Python?

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 可以结合使用,实现网页和文件下载过程的自动化,从而节省时间和精力。Wget 可通过 Python 进行定制,网页抓取或文件下载任务可集成到现有的 Python 脚本中。

在 Python 中使用 wget 有几个原因:

  • 自动化:通过将 wget 与 Python 结合使用,您可以将从互联网下载文件的过程自动化。这可以节省时间和精力,尤其是当你需要下载大量文件或网站时。
  • 自定义Wget 允许您指定各种选项来定制下载,例如保存文件的目录、文件名以及是否覆盖现有文件。通过将 wget 与 Python 结合使用,您可以以编程方式设置这些选项,并根据自己的需要定制下载。
  • 易于使用:Python 以其简单和可读性著称,是一种易于学习和使用的语言。通过将 wget 与 Python 结合使用,您可以充分利用 Python 的强大功能,让网络搜索和文件下载任务变得更轻松。
  • 可扩展性:Python 是一种可扩展的语言,能够处理大量数据。通过将 wget 与 Python 结合使用,您可以扩展网络搜索或文件下载任务,以处理更大的数据集。

开始

现在,我们已经讨论了 Python 和 wget 的各自优势和组合优势,下面我们来讨论代码编写部分。

安装 wget

确保计算机上安装了 wget。如果你选择的操作系统是 Linux,那么你已经安装了它。

  • 如果您是 Windows 用户,可以从本页面下载二进制文件。确保将二进制文件路径添加到PATH 环境变量中。另一种方法是使用 WSL(Windows Subsystem 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

解析 www.webscrapingapi.com (www.webscrapingapi.com)...76.76.21.61, 76.76.21.98

连接到 www.webscrapingapi.com (www.webscrapingapi.com)|76.76.21.61|:443... 已连接。

HTTP 请求已发送,等待响应... 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' 已保存 [5391/5391]

从输出结果中,我们可以看到 `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 请求,正在等待响应...416 请求范围无法满足

文件已全部检索完毕,无事可做。

递归下载

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 中解析和提取数据时:wget 并不是为解析和提取网页数据而设计的。
  • 当你需要以用户身份与网站交互时:Selenium 是一款能让你以用户身份与网站进行交互的自动化工具。它可以用来填写表格、点击按钮和执行其他 wget 无法实现的操作。

结论

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

不过,重要的是要尊重下载网站的服务条款,避免服务器超载。

如果您正在寻找一种可替代 wget 的网络抓取工具,请考虑使用WebScrapingAPI。WebScrapingAPI 是一种专业的网络搜刮服务,它能让你轻松地从网站中提取数据,而无需构建和维护自己的网络搜刮器。

它是一种快速、可靠、经济高效的解决方案,适用于各种规模的企业。

今天就试试吧

新闻和更新

订阅我们的时事通讯,了解最新的网络搜索指南和新闻。

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

相关文章

缩图
指南Scrapy Splash 教程:掌握使用 Scrapy 和 Splash 抓取 JavaScript 渲染的网站的艺术

学习如何使用 Scrapy 和 Splash 抓取 JavaScript 渲染的动态网站。从安装到编写 spider、处理分页和管理 Splash 响应,本综合指南为初学者和专家提供了循序渐进的指导。

Ștefan Răcila
作者头像
Ștefan Răcila
6 分钟阅读
缩图
指南网络抓取 API 快速入门指南

开始使用 WebScrapingAPI - 终极网络搜索解决方案!收集实时数据,绕过反僵尸系统,享受专业支持。

米赫内亚-奥克塔维安-马诺拉什
作者头像
米赫内亚-奥克塔维安-马诺拉什
9 分钟阅读
缩图
网络抓取科学轻松进行网络抓取:数据解析的重要性

了解如何通过数据解析、HTML 解析库和 schema.org 元数据有效地提取和组织数据,以便进行网络搜刮和数据分析。

Suciu Dan
作者头像
Suciu Dan
12 分钟阅读