如何使用 cURL 下载文件

学习如何使用 cURL 高效下载文件,掌握相关基本语法、高级选项等知识,并快速了解 cURL 与Wget 之间的差异。
4 min read
使用 cURL 下载文件指南

在本指南中,您将学到:

  • 基本的 cURL 下载文件语法
  • 如何在使用 cURL 下载文件时处理较复杂的场景
  • 如何批量下载多个文件
  • 高效使用 cURL 的一些最佳做法
  • cURL 与 Wget 之间的快速对比

现在就来一探究竟吧!

基本的 cURL 下载文件语法

以下是使用 cURL 下载文件时会用到的最基本语法:

curl -O <file_url>

注意:如果使用的是 Windows 系统,需要将 curl 替换为 curl.exe。之所以这么做,是因为在 Windows PowerShell 中,curl 实际上是 Invoke-WebRequest 的别名,而 curl.exe 才是真正用于运行 cURL 命令行的工具。

-O 标记用于指示 cURL 从 <file_url> 中指定的 URL 下载目标文件后,将其以原名保存到本地。您也可以使用 --remote-name 语法:

curl --remote-name <file_url>

例如,请看下方的 cURL 下载文件命令:

curl -O "https://i.imgur.com/CSRiAeN.jpg"

如下所示,运行此命令后,会显示带下载进度条的输出:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 35354  100 35354    0     0   155k      0 --:--:-- --:--:-- --:--:--  158k

当进度达到 100% 时,名为 CSRiAeN.jpg 的文件将出现在您运行 cURL 命令的文件夹中:

已下载的 CSRiAeN.jpg 文件,保存在启动 cURL 命令的文件夹中

如想进一步了解 cURL 及其可用选项,请参阅我们的 cURL 指南。现在来探索更复杂的场景!

使用 cURL 下载文件:高级选项

您已了解基本的 cURL 下载文件语法,现在可以学习使用其他选项自定义命令的操作了。

更改下载文件的名称

默认情况下,使用 -O 选项下载目标 URL 中指定的文件后,cURL 会将其以原名保存到本地。如果 URL 中指定的远程文件不含文件名,则 cURL 会创建名为 curl_response 且不带扩展名的文件:

默认情况下,保存至启动 cURL 命令的文件夹的 curl_response 文件

cURL 还会打印一条警告来告知此行为:

Warning: No remote file name, uses "curl_response"

如要为下载的文件指定自定义名称,请使用 -o(或 --output)标记,具体如下所示:

curl "https://i.imgur.com/CSRiAeN.jpg" -o "logo.jpg"

该命令指示 cURL 对指定文件 URL 执行 GET 请求。然后,它将下载的内容以用户在 -o 后面指定的名称进行保存,而不是将其打印到标准输出。

这次输出文件将是名为 logo.jpg 的文件:

已下载的 logo.jpg 文件,保存在启动 cURL 命令的文件夹中

跟随重定向

一些 URL 并不直接指向所需文件,需要自动重定向才能到达最终目的地。

要指示 cURL 跟随重定向,您需要使用 -L 选项:

curl -O -L "<file_url>"

如未使用 -L 标记,cURL 将输出重定向响应标头(例如 “301 Moved Permanently” 或 “302 Found”)。具体而言,它不会自动跟随 Location 标头中提供的新位置。

向服务器进行身份验证

某些服务器会限制对其资源的访问,要求用户进行身份验证。要执行基本的 HTTP 或 FTP 身份验证,您可使用 -u(或 --user)选项。这让您能够按照以下格式指定用户名和密码:

<username>:<password>

用户名和密码之间用冒号 (:) 分隔,因此,用户名不能含有冒号。但密码可以包含冒号。

<password> 字符串为可选项。如果仅指定用户名,cURL 会提示您输入密码。

以下是使用 cURL 下载文件时,需要向服务器进行身份验证的语法:

curl -O -u <username>:<password> <file_url>

例如,您可以使用下方命令从需要进行身份验证的 URL 中下载 .png 文件:

curl -O -u "myUser:myPassword" "https://example.com/secret.txt"

cURL 将使用 myUser 和 myPassword 作为凭据,向服务器进行身份验证。之后,它会下载 secret.txt 文件。

限制带宽

默认情况下,cURL 会使用全部可用带宽来下载文件,但有时这并非可取之策。要控制下载速度,您可使用 --limit-rate 选项,并在其后面设置最大下载速度:

curl -O --limit-rate 5k "https://i.imgur.com/CSRiAeN.jpg"

输出结果如下所示:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 35354  100 35354    0     0   5166      0  0:00:06  0:00:06 --:--:--  5198

请注意,下载速度(每秒 5198 字节,相当于每秒 5 KB)会与选项中指定的速度保持一致。即使计算机的正常下载速度高于 --limit-rate 设置的值,也是如此。

--limit-rate 有助控制带宽使用情况,从而防止网络过载、遵守带宽限制或模拟较慢的网络条件以进行测试。

通过代理服务器下载

当您使用 cURL 执行下载请求时,您的 IP 地址会暴露给目标服务器。对于想要隐匿身份或绕过速率限制等反机器人检测措施的用户来说,这是个安全隐患。

要隐藏 IP 并通过代理路由请求,您可在 cURL 命令中使用 -x(或 --proxy)选项:

curl -x <proxy_url> -O <file_url>

<proxy_url> 必须按照以下格式指定:

[protocol://]host[:port]

请注意,代理 URL 将随您使用的代理(HTTP、HTTPS 或 SOCKS 代理)而变化。如想了解更详细的说明,请参阅 “cURL 代理集成指南”。

例如,如果您使用 HTTP 代理,则命令将变为:

curl -x "http://proxy.example.com:8080" -O "https://i.imgur.com/CSRiAeN.jpg"

在后台执行下载任务

默认情况下,cURL 下载文件命令会显示进度条,或在下载失败时显示错误信息。如想禁用这些输出,您可使用 -s(或 --silent)选项启用“无声”或“静默”模式:

curl -O -s "https://i.imgur.com/CSRiAeN.jpg"

这将使 cURL 静默运行。如果下载成功,文件会显示在当前目录中,但不会在终端显示任何反馈。

打印详细信息

如果下载过程中出现错误或您想要更好地了解 cURL 的后台执行情况,则建议使用 -v(或 --verbose)选项启用“详细”模式:

curl -O -v "https://i.imgur.com/CSRiAeN.jpg"

执行该命令后,您将看到额外的输出结果,提供有关请求和响应进程的详细信息:

* IPv6: (none)
* IPv4: 146.75.52.193
*   Trying 146.75.52.193:443...
* schannel: disabled automatic use of client certificate
* ALPN: curl offers http/1.1
* ALPN: server accepted http/1.1
* Connected to i.imgur.com (146.75.52.193) port 443
* using HTTP/1.x
> GET /CSRiAeN.jpg HTTP/1.1
> Host: i.imgur.com
> User-Agent: curl/8.10.1
> Accept: */*
>
* Request completely sent off
* schannel: failed to decrypt data, need more data
< HTTP/1.1 200 OK
< Connection: keep-alive
< Content-Length: 35354
< Content-Type: image/jpeg
< Last-Modified: Wed, 08 Jan 2025 08:02:49 GMT
< ETag: "117b93e0521ba1313429bad28b3befc8"
< x-amz-server-side-encryption: AES256
< X-Amz-Cf-Pop: IAD89-P1
< X-Amz-Cf-Id: wTQ20stgw0Ffl1BRmhRhFqpCXY_2hnBLbPXn9D8LgPwdjL96xarRVQ==
< cache-control: public, max-age=31536000
< Accept-Ranges: bytes
< Age: 2903
< Date: Wed, 08 Jan 2025 08:51:12 GMT
< X-Served-By: cache-iad-kiad7000028-IAD, cache-lin1730072-LIN
< X-Cache: Miss from cloudfront, HIT, HIT
< X-Cache-Hits: 1, 0
< X-Timer: S1736326272.410959,VS0,VE1
< Strict-Transport-Security: max-age=300
< Access-Control-Allow-Methods: GET, OPTIONS
< Access-Control-Allow-Origin: *
< Server: cat factory 1.0
< X-Content-Type-Options: nosniff
<
{ [1371 bytes data]
100 35354  100 35354    0     0   212k      0 --:--:-- --:--:-- --:--:--  214k
* Connection #0 to host i.imgur.com left intact

其中包括连接详情、请求标头、响应标头以及额外的下载进度信息。

设置简洁进度条

标准的 cURL 下载文件进度条可能不符您的需求。您可使用 -#(或 --progress-bar)选项启用更简洁的进度条:

curl -O -# "https://i.imgur.com/CSRiAeN.jpg"

这将显示采用字符 # 表示的进度条,它将随文件下载进度的推进而被逐步填充:

########################################################### 100.0%

与默认输出的 cURL 进度条相比,# 进度条提供更简洁的下载进度视图。

如何使用 cURL 下载多个文件

您刚才学习了使用 cURL 下载单个文件的方法,那如何通过一个命令下载多个文件呢?赶快做好准备,开始探索这一操作吧!

文件分片下载

cURL 支持使用 URL 扩展一次下载多个文件。具体而言,您可使用大括号 {} 指定具有相同远程 URL 的多个文件,从而批量下载它们:

curl -O "https://example.com/images/{1.jpg,2.jpg,3.jpg}"

这将下载三个指定文件:

1.jpg
2.jpg
3.jpg

请注意,{} 中指定的文件可以有不同的扩展名。

您也可以使用方括号 [] 语法来批量下载文件:

curl -O "https://example.com/files/file[1-3].jpg"

这将达到与第一个示例相同的结果。但使用此语法时,[] 中的所有文件都必须具有相同的扩展名。

注意:如果包含自定义选项(例如使用 -s 选项开启静默模式或 --limit-rate 选项限制带宽),则这些选项将应用于所有正在下载的文件。

多文件下载

要从不同的 URL 下载文件,需要多次指定 -O 选项:

curl -O "https://i.imgur.com/CSRiAeN.jpg" -O "https://brightdata.com/wp-content/uploads/2020/12/upload_blog_20201220_153903.svg"

运行此命令后,cURL 将从 i.imgur.com 下载 CSRiAeN.jpg,并从 brightdata.com 下载 upload_blog_20201220_153903.jpg

输出结果将包含每个给定 URL 的下载进度条:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 35354  100 35354    0     0   271k      0 --:--:-- --:--:-- --:--:--  276k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 22467    0 22467    0     0  34657      0 --:--:-- --:--:-- --:--:-- 34724

您也可以使用多个 -o 选项:

curl "https://i.imgur.com/CSRiAeN.jpg" -o "logo.jpg" "https://brightdata.com/wp-content/uploads/2020/12/upload_blog_20201220_153903.svg" -o "blog_post.svg"

运行上述命令后,cURL 将下载 CSRiAeN.jpg 并将其另存为 logo.jpg,以及下载 upload_blog_20201220_153903.svg 并将其另存为 blog_post.svg

注意,您还可以将 -O 选项和 -o 选项一起使用:

curl "https://i.imgur.com/CSRiAeN.jpg" -o "logo.jpg" -O "https://brightdata.com/wp-content/uploads/2020/12/upload_blog_20201220_153903.svg"

运行上图命令后,cURL 将如之前一样,采用同一方式下载 logo.jpg ,但下载 upload_blog_20201220_153903.svg 后会将其以原名进行保存。

请注意,其他选项(如 -v-s 或 --limit-rate)均适用于所有 URL,因此必须指定一次。

使用 cURL 下载文件的最佳做法

以下列举了使用 cURL 下载文件时的一些最佳做法:

  • 在 Windows 上使用 curl.exe 下载,而非 curl:在 Windows 系统中,使用 curl.exe 下载文件,而非 curl,以免与 Invoke-WebRequest cmdlet 产生冲突。
  • 忽略 HTTPS 和 SSL/TLS 错误(谨慎使用):使用 -k(或 --insecure)选项忽略 SSL/TLS 证书验证错误。但请注意,这会降低安全性,只能在受信任环境中使用。
  • 指定正确的 HTTP 方法:发起请求时,使用适当的 HTTP 方法,例如 GET、POST 或 PUT。所使用的方法会影响服务器响应请求的方式。请使用 -X 选项指定方法。
  • 将 URL 括在引号中并转义特殊字符:始终使用单引号或双引号将 URL 括在其中,以便 cURL 能正确处理特殊字符。使用转义字符 (\) 来避免 URL 中出现空格、与号 “&” 和其他特殊字符。
  • 指定代理来保护身份:使用 -x(或 --proxy)选项来通过代理路由 cURL 请求。这有助保护您的 IP 地址并在抓取或下载文件时隐匿身份。
  • 在不同请求中保存和复用 cookie:使用 -c 和 -b 选项可在后续请求中保存和复用 cookie。这有助维持会话的持久性、保持身份验证状态或进行状态追踪。
  • 限制下载速度以增强控制:使用 --limit-rate 选项来控制下载速度,并避免网络连接过载或触发服务器的速率限制机制。
  • 添加详细输出结果以便调试:使用 -v 选项启用详细模式,获取有关请求和响应的详细信息。这有助进行调试和故障排除。
  • 检查错误响应:始终使用 -w 选项检查 HTTP 响应代码,以验证文件下载是否成功(例如 “200 OK” 状态码提示)或是否出现错误(例如 “404 Not Found” 错误提示)。

文件下载工具 cURL 与 Wget 的区别

cURL 和 Wget 都是用于从远程服务器获取文件的命令行工具。两者的区别主要体现在以下方面:

  • Wget 是专为从网络下载文件而打造的工具。它支持 HTTP、HTTPS、FTP 和其他各项协议。Wget 因可以递归下载文件、恢复中断的下载并能在后台可靠运行而闻名。详情请参阅“如何在 Python 中使用 Wget 下载网页”。
  • cURL 是一种多功能命令行工具,旨在与使用各种互联网协议的服务器进行通信,传输数据。它常用于测试端点、执行简单的 HTTP 请求和下载单个文件。cURL 还可用于网页抓取

cURL 和 Wget 之间的主要区别在于 cURL 在数据传输方面提供更精细化的控制。具体而言,它支持自定义标头、身份验证和更多的协议。相比之下,Wget 更简单,更适合批量下载、递归下载和处理中断的传输。

结语

在本指南中,您学习了使用 cURL 下载文件的各种操作。您先了解了基本的 cURL 下载文件语法,然后对更复杂的场景和用例进行了探索。现在您已知道如何使用 cURL 抓取单个或多个文件。

请记住,任何时候,只要您发起 HTTP 请求,就会在互联网上留下踪迹。为保护您的身份和隐私并提高安全性,您应将代理与 cURL 集成。值得庆幸的是,Bright Data 可为您解决这一问题!

Bright Data 掌控着全球最好的代理服务器,为财富 500 强企业和 20,000 多家客户提供服务。其全球代理网络包括:

总体而言,Bright Data 拥有市面上规模最大且最可靠的抓取型代理网络。

立即注册并免费测试我们的代理和抓取解决方案!