如何将 cURL 与代理一起使用

使用本详细指南和代码片段来帮助启动您的 cURL 代理之旅。
3 min read

在这篇文章中,我们将介绍:

什么是 cURL?

cURL 是 “客户端 URL” 的缩写,是一种通过 URL 在互联网发送和接收数据的工具。作为一个软件项目,cURL 提供库 (libcurl) 和命令行工具 (curl)。这里,我们将重点介绍 curl,一款通过 URL 语法传输数据的命令行工具。 

该项目支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SFTP、POP3、POP3S、IMAP、IMAPS、LDAP、LDAPS、SCP 等等。这使得 curl 成为世界上最受欢迎、使用最广泛的命令行 HTTP 客户端。 

cURL 用途广泛,是执行各种任务的常见解决方案,例如发出 HTTP 请求、下载文件、上传数据以及与 API 交互。它具备多种功能,包括请求自定义和代理支持。

安装 curl

现在我们来学习一下如何在计算机上安装 curl

macOS

你不需要在 macOS 上安装 curl。macOS 操作系统已包含此工具,可以在 Terminal 应用程序中本地使用。

Windows

从 Windows 10 开始,Windows 系统自带 curl 的副本。同时, curl 命令是 PowerShell Invoke-WebRequest 命令的别名。这意味着 Windows 终端中的 curl 命令将在后台调用 Invoke-Request。为了避免这种情况并实际使用 cURL 中的 curl ,请将 “curl” 替换为 “curl.exe”。这样,PowerShell 将运行 curl 而不是 Invoke-Request

例如,你可以使用以下命令在终端中验证安装在 Windows 计算机上的 curl 的当前版本:

curl.exe --version

这样会显示类似于以下的内容:

curl 8.0.1 (Windows) libcurl/8.0.1 Schannel WinIDN

Release-Date: 2023-03-20

Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp

Features: AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets

如果你是 Windows 用户,请将文章命令中的所有 “curl” 实例替换为 “curl.exe” 字符串。否则,请设置适用于 Linux 的 Windows 子系统 (WSL) 并按照以下说明进行操作。

Linux

在 Linux 上安装 curl 的过程会根据你使用的特定发行版而有所不同。默认情况下系统自带热门的 Linux 发行版,例如 Ubuntu 和 Fedora。因此,你可以直接在终端中使用 curl

其他发行版可能不包含 curl。这种情况下,你可以使用发行版软件包管理器来添加 curl。在基于 Debian 的操作系统上,你可以使用以下命令安装 curl:

sudo apt-get install curl

curl 中使用代理需要什么

代理在客户端和目标服务器之间充当媒介,拦截来自客户端的请求,将其转发到服务器,接收来自服务器的响应,然后将其发送回客户端。这种媒介方式更有助于保持匿名,避免网络限制。这是因为目标服务器会认为请求来自所选代理服务器的 IP 和位置以及来自你。

想要开始通过代理服务使用 curl,你首先需要访问代理。具体而言,代理 URL 的语法如下所示:

[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]

这包括:

  • <协议>用于连接代理服务器的协议。如果未指定协议,curl 将默认为 http://。
  • <主机>代理服务器的主机名所需 IP 地址或 URL。
  • <端口>代理服务器正在监听的端口号。如果未指定端口,curl 将默认使用 1080。
  • <用户名>需要身份验证时指定的可选用户名。
  • <密码>需要身份验证时指定的可选密码。

至于代理协议,最受欢迎的是 HTTP 和 HTTPS,其次是 SOCKS。

这时候要检索有效的 HTTP 代理!

你可以从免费代理列表中免费获取一个,如下所示:

IP Address: 71.19.249.97; Port: 8443

这意味着代理 URL 是:

http://71.19.249.97:8443

出于学习目的可以选择这样的解决方案,但在实际情况下不能采用。免费代理服务不可靠、容易出错、速度慢、时效短而且会收集大量数据。请勿使用这些服务!

有何解决方案?使用市面上最好的代理服务提供商 Bright Data 的高级代理 。订阅并免费试用我们的可靠代理。

请记住,高级解决方案具备身份验证保护机制。假设协议是 HTTP,主机是 71.103.203.109,端口是 9321,证书对是 admin-32458rTuJ3tEwf。这种情况下,curl 代理 URL 将为:

http://admin-32458:@rTuJ3tEwf71.103.203.109:9321

如何在 curl 中指定 HTTP/HTTPS 代理

开始之前,在终端中启动以下命令:

curl "https://httpbin.org/ip"

如你所见,curl 的基本语法是:

curl [optional_commands] <URL>

一项 curl 最佳实践建议在 URL 前后使用双引号,以避免出现特殊字符的问题。

运行后就会得到:

{

  "origin": "194.33.243.7"

}

HTTPBin 项目帮助你获取 HTTP 请求的相关信息。详细而言,/ip 端点返回请求的源 IP,即执行请求的计算机的 IP 地址。换句话说,它会返回你的 IP。 

curl 中设置代理后,你将能看到代理服务器的 IP 地址,而非自己的 IP 地址。

curl 中设置代理有若干方法。现在让我们来看看在 curl 中指定 HTTP/HTTPS 代理的最常用方法。

使用命令行参数

curl 提供两个命令行参数来设置代理 URL:

  • -x
  • --proxy

两者可以互换使用,因为它们的作用完全相同。后者只是前者的别名。

因此,通过代理服务使用 curl 的语法变为:

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] <URL>

或:

curl --proxy [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] <URL>

注意:在 curl 中,命令行选项区分大小写。例如, -x-X 有两种不同的含义。

如果你现在启动:

curl -x "http://71.19.249.97:8443" "https://httpbin.org/ip"

或等效的:\

curl --proxy "http://71.19.249.97:8443" "https://httpbin.org/ip"

你将得到:

{

  "origin": "71.19.249.97"

}

源与代理服务器 IP 相匹配。这意味着目标站点会如预期一样,认为请求来自代理。大功告成!

不要忘记免费代理的时效短,因此当你阅读本文时,上述服务器不太可能还有效。如果出现错误,请将其替换为新的代理。

使用环境变量

curl 中使用代理的另一种方法是设置以下两个环境变量:

  • http_proxy:用于访问涉及 HTTP 协议的 URL 的代理服务器 URL。
  • https_proxy:用于访问涉及 HTTP 协议的 URL 的代理服务器的 URL。

在 macOS 和 Linux 上,你可以使用以下语法设置这两个环境:

export http_proxy="[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

export https_proxy="[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

因此,这两个命令将变成:

export http_proxy="http://71.19.249.97:8443"

export https_proxy="http://71.19.249.97:8443"

在 Windows 上,你需要使用以下 PowerShell 语法:

$env:http_proxy = "[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

$env:https_proxy = "[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

然后,在我们的示例中:

$env:http_proxy = "http://71.19.249.97:8443"

$env:https_proxy = "http://71.19.249.97:8443"

从现在起,每个 curl 命令都将经过指定的代理,不必使用 -x 选项:

同样,这将返回:

curl https://httpbin.org/ip

{

  "origin": "71.19.249.97"

}

如需关闭 curl 代理,请使用以下命令取消环境变量的设置:

unset http_proxy

unset https_proxy

或者在 Windows 上:

$env:http_proxy = ""

$env:https_proxy = ""

curl 将恢复其标准行为, https://httpbin.org/ip 现在将返回你的 IP。

使用配置文件

您可以通过创建 .curlrc 配置文件为 curl 全局指定代理。

在 Linux 和 macOS 上打开终端并导航到你的主目录:

cd ~

然后,使用 nano 访问 .curlrc:

nano .curlrc

如果文件已存在,则文件将被打开。否则将首先创建文件然后再打开。

将以下行添加到 .curlrc 文件:

proxy="http://71.19.249.97:8443"

此指令的语法是:

proxy="[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

保存文件,关闭终端并重启。 

在 Windows 上,你需要在 %APPDATA% 目录内创建内容相同的 _curlrc 文件。将 %APPDATA% 粘贴到文件资源管理器地址栏中,然后按回车键访问该目录。 

这样你会来到 C:\Users\<YOUR_USER>\AppData\Roaming

现在,curl 将自动使用配置文件中指定的代理:

curl "http://httpbin.org/ip"

你会得到:

{

  "origin": "71.19.249.97"

}

太棒了!你刚刚学会了如何用三种不同的方式在代理服务器上使用 curl

如何在 curl 中设置 SOCKS 代理

如果你想使用 SOCKS 代理,命令结构保持不变:

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] <URL>

主要区别在于 <协议> 将是 socks4socks4asocks5socks5h,而非 http https

curl SOCKS 代理正在运行的完整示例是:

curl -x "socks5://94.14.109.54:2478" "http://httpbin.org/ip"

如你所料,结果将是:

{

  "origin": "94.14.109.54"

}

另一种方法涉及 --socks4--socks4a--socks5 命令行选项而不是 -x。这种情况下,必须在选项后设置不带用户名和密码的代理 URL,然后在 --proxy-user 后设置证书:

curl --socks4|--socks4a|--socks5 <HOST>[:<PORT>] <URL> --proxy-user <USERNAME>:<PASSWORD>

例如:

curl --socks4 "93.16.238.41:8721" "http://httpbin.org/ip" --proxy-user admin334:kv4NsDgc3

这将通过 93.16.238. 41:8721 socks4 代理连接到 HTTPBin,同时使用 admin334 作为身份验证的用户名、kv4NsDgc3 作为密码。

你应该了解的窍门和技巧

在本节中,您将看到专业使用 curl 代理的有趣技巧和宝贵诀窍。

快速开启和关闭代理

这里的方法是定义别名,通过带有自定义命令的环境变量,以编程方式设置和取消设置代理。 

在 macOS 和 Linux 上,你可以通过创建 .bashrc 文件来完成这项操作。这是用户每次登录时都会执行的脚本文件。

移至你的主文件夹:

cd ~

然后,创建或打开一个 .bashrc 文件:

nano .bashrc

将以下格式的内容添加到文件:

alias proxyon="export http_proxy='[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]';export https_proxy='[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]'"
alias proxyoff="unset http_proxy;unset https_proxy"

因此,在我们的示例中它将是:

alias proxyon="export http_proxy='http://71.19.249.97:8443';export https_proxy='http://71.19.249.97:8443'"

alias proxyoff="unset http_proxy;unset https_proxy"

保存文件并重启计算机。

现在,你可以使用以下命令激活和停用 curl 代理:

proxyon

curl "http://httpbin.org/ip"

# other HTTP requests...

proxyoff

注意自定义的 proxyonproxyoff 命令。这些命令执行 .bashrc 文件中的别名指定的操作。

在 Windows 上,你可以使用 PowerShell 别名实现类似的效果。

忽略单个请求的代理

如果你想阻止 curl 为特定请求使用已配置的代理,你可以使用 --noproxy “*” 参数,如下所示:

curl --noproxy "*" <URL>

这会指示 curl 不要对所有 URL 使用代理。

设置代理并运行:

curl --noproxy "*" "https://httpbin.org/ip"

生成的源将包含你的 IP,而非代理服务器的 IP。

避免 SSL 证书错误

curl中使用代理时,你的请求可能会由于 SSL 证书错误而失败。为避免这种情况,请按以下语法使用 -k 选项:

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] -k <URL>

-k 允许通过 SSL 进行不安全的服务器连接,从而帮助你避免证书错误。

例如,你可以通过以下方式避开 SSL 问题联系 HTTPBin:

curl -x "http://71.19.249.97:8443" -k "https://httpbin.org/ip"

获取请求相关的更多信息

curl 中的请求失败时,想要了解发生了什么并不容易。如需诊断错误并查看 curl 执行的所有操作,请设置 -v 选项:

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] -v <URL>

这将输出已建立的连接和该工具所使用的标头相关的详细信息:

$curl -x "http://71.19.249.97:8443" -v "https://httpbin.org/ip"

*   Trying 71.19.249.97:8443...

* Connected to 71.19.249.97 (71.19.249.97) port 8443 (#0)

* allocate connect buffer

* Establish HTTP proxy tunnel to httpbin.org:443

> CONNECT httpbin.org:443 HTTP/1.1

> Host: httpbin.org:443

> User-Agent: curl/8.0.1

> Proxy-Connection: Keep-Alive

>

< HTTP/1.0 200 OK

<

* CONNECT phase completed

* CONNECT tunnel established, response 200

* schannel: disabled automatic use of client certificate

* ALPN: offers http/1.1

* ALPN: server accepted http/1.1

* using HTTP/1.1

> GET /ip HTTP/1.1

> Host: httpbin.org

> User-Agent: curl/8.0.1

> Accept: */*

>

< HTTP/1.1 200 OK

< Date: Sat, 26 Aug 2023 10:39:13 GMT

< Content-Type: application/json

< Content-Length: 31

< Connection: keep-alive

< Server: gunicorn/19.9.0

< Access-Control-Allow-Origin: *

< Access-Control-Allow-Credentials: true

<

{

  "origin": "71.19.249.97"

}

* Connection #0 to host 71.19.249.97 left intact

哪些代理最适合 curl

这个问题的答案取决于你的用例和你提出的 curl 请求的性质。想要找到适合你需求的解决方案,请查看可用的不同类型的代理:

  • 数据中心代理:速度很快,但由于其 IP 范围可识别,可能很容易被站点检测和屏蔽。
  • 住宅代理:保证了高度的匿名性,因为它们提供来自特定位置真实设备的 IP 地址。住宅代理非常适合访问采用地理限制屏蔽或反机器人措施的站点,也是执行 curl 网页抓取的理想选择。
  • ISP 代理:提供的 IP 来自登记至 ISP 的设备,因此快速、安全且高度可靠。ISP 代理是 SEO 监控、网页浏览和市场调研的完美解决方案。
  • 移动代理:提供来自真实移动设备的 IP 以实现高度匿名性。它们对于访问特定于移动设备的应用程序、站点或内容很有用。

这只是一个简短的回顾,但你可以在我们的代理 IP 类型指南中了解更多信息。

结语

在本 curl 代理指南中,你了解了 cURL 是什么、它能提供什么,以及如何设置 HTTP/HTTPS/SOCKS 代理。事实证明,你不能信任由免费提供商提供代理服务的 curl。因此,需要做出的主要技术决定是采用哪个代理提供商。节省时间和精力,选择市面上最好的服务 — Bright Data

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

总体而言,这是市面上最大而且最可靠的抓取型代理网络之一。加入最大的代理网络并免费试用。