在本指南中,您将学到:
- 基本的 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 命令的文件夹中:
如想进一步了解 cURL 及其可用选项,请参阅我们的 cURL 指南。现在来探索更复杂的场景!
使用 cURL 下载文件:高级选项
您已了解基本的 cURL 下载文件语法,现在可以学习使用其他选项自定义命令的操作了。
更改下载文件的名称
默认情况下,使用 -O
选项下载目标 URL 中指定的文件后,cURL 会将其以原名保存到本地。如果 URL 中指定的远程文件不含文件名,则 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
的文件:
跟随重定向
一些 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 多家客户提供服务。其全球代理网络包括:
- 数据中心代理 – 超过 77 万个数据中心 IP。
- 住宅代理 – 超过 7200 万个住宅 IP,遍布 195 个以上国家/地区。
- ISP 代理 – 超过 70 万个 ISP IP。
- 移动代理 – 超过 700 万个移动 IP。
总体而言,Bright Data 拥有市面上规模最大且最可靠的抓取型代理网络。
立即注册并免费测试我们的代理和抓取解决方案!