返回博客
用例
Andrei OgiolanLast updated on Mar 31, 20262 min read

了解如何在代理环境下使用 cURL

了解如何在代理环境下使用 cURL

什么是 cURL?

为了达到本文的目的——即学习如何在代理环境下使用 cURL,我们首先需要介绍一下 cURL。Client URL(cURL)简而言之,是一个专为开发者设计的、易于使用的命令行工具,用于从服务器获取数据。

如何使用 cURL?

如前所述,使用 cURL 非常简单,仅需一行命令即可提取信息。首先,您需要打开终端,输入 curl 并跟上网站链接,例如:

$ curl 'https://www.webscrapingapi.com/'

恭喜,您已成功使用 cURL 发送了第一个请求。这条简单的命令就像传统浏览器一样向服务器请求信息,并返回页面的 HTML 内容。并非所有网站都会返回 HTML,有些接口会以 JSON 对象的形式返回数据。请看这个示例:

$ curl 'https://jsonplaceholder.typicode.com/todos/3'

在终端中输入此命令,你应该会收到如下响应:

{
  "userId": 1,
  "id": 3,
  "title": "fugiat veniam minus",
  "completed": false
}

当你对 API 运行 cURL 命令时,大多数 API 会返回 HTML 或 JSON 格式。不过,这还不是 cURL 能为我们做的一切。实际上,它是一个非常复杂的工具,需要花费大量时间才能掌握。如果你想进一步了解 cURL,我强烈建议你查阅 cURL 文档,以便更好地理解其参数。或者,你可以运行以下命令:

$ curl --help

这将向您展示 cURL 可设置的一些选项:

Usage: curl [options...] <url>
-d, --data <data> HTTP POST data
-f, --fail Fail silently (no output at all) on HTTP errors
-h, --help <category> Get help for commands
-i, --include Include protocol response headers in the output
-o, --output <file> Write to file instead of stdout
-O, --remote-name Write output to a file named as the remote file
-s, --silent Silent mode
-T, --upload-file <file> Transfer local FILE to destination
-u, --user <user:password> Server user and password
-A, --user-agent <name> Send User-Agent <name> to server
-v, --verbose Make the operation more talkative
-V, --version Show version number and quit

This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.
For all options use the manual or "--help all".

如你所见,这甚至还不是 cURL 所有可设置的选项,它是一个按类别划分的菜单。你可能已经猜到了,若要获取所有可用的选项,你需要运行:

$ curl --help all

然而,仅使用 cURL 在可选数据源服务器数量方面存在一定局限。例如,部分服务器可能采用地理定位机制,并因您的地理位置而拒绝提供所需数据。此时,我们就需要一个代理,它将充当我们与目标服务器之间的中间人。

什么是代理?

代理服务器的概念其实非常容易理解。 如前所述,代理服务器就像是请求资源的客户端与提供该资源的服务器之间的中间人。代理的存在正是为了让我们能够从任何地方获取数据。为了更好地理解这个概念,假设我们有一个名为 Bob 的服务器,它拥有我们感兴趣的一些数据,但 Bob 只会在我们位于欧洲时才提供这些数据,而我们却身在美国。

我们该如何应对?我们将请求发送给位于欧洲的代理服务器(而非直接发送给Bob),并告知代理服务器我们希望从Bob处获取数据。代理服务器会将请求转发给Bob,而Bob会将数据返回给代理服务器(因为代理服务器位于欧洲)。随后,代理服务器将Bob的数据转发给我们。

这就是代理服务器工作原理的主要流程。代理的另一个典型应用场景是,例如当我们希望获取以特定货币显示价格的数据时,以此避免混淆。若想进一步了解代理,我强烈建议您查阅维基百科

代理设置

要使用代理,您通常需要一个主机、一个端口、一个用户名、一个密码以及您想要获取数据的目标 URL。在本示例中,我将使用 WebScrapingAPI 提供的代理来发送请求,您可以在此处找到更多相关信息。WebScrapingAPI 并非代理提供商,而是一个提供代理服务的网络爬虫服务。在我们的示例中,配置如下:

  • 代理主机名:proxy.webscrapingapi.com
  • 代理端口:80
  • 代理用户名:webscrapingapi.proxy_type=datacenter.device=desktop
  • 代理密码:<YOUR-API-KEY-HERE> // 您可通过在此处注册获取
  • 目标 URL:http://httpbin.org/get

请注意,某些代理提供商可能需要其他认证方案。

如何使用 cURL 配合代理?

既然我们已经介绍了 cURL 和代理,现在就可以将它们结合起来,通过代理发送请求了,这是一个相当简单的过程。我们首先需要进行身份验证,然后才能使用代理。

cURL 中的代理身份验证

cURL 中的代理认证非常简单,对于上文的示例,操作如下:

$ curl -U webscrapingapi.proxy_type=datacenter.device=desktop:<YOUR-API-KEY> --proxy @proxy.webscrapingapi.com:80 http://httpbin.org/get

执行该命令后,httpbin 会返回我们的 IP 地址以及其他一些属性:

​​{
  "args": {}, 
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "httpbin.org", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5173.0 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-633af93b-35faf8637f37f7f075f185ec"
  }, 
  "origin": "45.9.120.69", 
  "url": "http://httpbin.org/get"
}

如您所见,返回的源地址并非您的 IP 地址,而是代理服务器的地址。此外,您甚至无需在终端中显示密码即可运行该命令,具体操作如下:

$ curl -U webscrapingapi.proxy_type=datacenter.device=desktop --proxy @proxy.webscrapingapi.com:80 http://httpbin.org/get

随后系统会提示您输入密码:

Enter proxy password for user 'webscrapingapi.proxy_type=datacenter.device=desktop':

现在你可以在此处输入 API 密钥,而无需在终端中暴露密钥,从而使整个过程更加安全。此外,每次通过代理运行 cURL 命令时都需手动输入凭据、主机和端口,这种做法可能并不理想,尤其是在需要通过同一代理提供商运行大量命令时。 

当然,您可以将凭据保存在本机上的独立文件中,每次运行时复制粘贴,但还有一种更自然的方法,即通过环境变量传递凭据,我们将在下面详细讨论。

通过环境变量在 cURL 中使用代理

环境变量就像一个对象,它在内存中存储可编辑的值,供一个或多个软件使用。在这种情况下,我们可以向 cURL 传递一个名为 http_proxyhttps_proxy 的变量,其中包含我们的代理详细信息,这样就无需在每次执行命令时都进行指定。您可以通过运行以下命令来实现:

$ export http_proxy="http://webscrapingapi.proxy_type=datacenter.device=desktop:<YOUR-API-KEY>@proxy.webscrapingapi.com:80"

请注意,您必须将变量命名为 http_proxyhttps_proxy,cURL 才能识别其含义。就这样,现在您无需在每次运行时都传递凭据,只需像这样简单地运行 cURL:

$ curl http://httpbin.org/get

这将返回以下输出:

{
  "args": {}, 
  "headers": {
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "httpbin.org", 
    "Upgrade-Insecure-Requests": "1", 
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-633bf912-66ace1104304ddaf5ea8ac65"
  }, 
  "origin": "132.255.134.104", 
  "url": "http://httpbin.org/get"
}

如您所见,IP 地址即为代理地址,这证实您已成功配置了代理。至此,我们运行任何 cURL 命令时均无需指定代理信息,cURL 会自动为您处理。

为特定命令禁用代理

不过,如果你需要发送一个不通过代理的特定请求,无需担心删除 http_proxy 变量的值。作为一款功能强大且选项丰富的工具,cURL 可以通过其 proxy 参数来处理此事,该参数会指示它在发送请求时不使用任何代理。操作如下:

$ curl --noproxy "*" http://httpbin.org/get

这样,返回的将是您的 IP 地址,而非代理服务器的地址。

总结

总而言之,结合 cURL 与代理使用是绕过地理位置过滤的绝佳方式,它不仅能扩展我们从 Web 服务器获取资源的范围,也是涉足 Web 爬虫等领域的良好起点——在这些场景中,我们需要借助代理才能获取特定数据或以期望的格式接收数据。希望本文能帮助您掌握如何在 cURL 中使用代理,并鼓励您亲自尝试,编写自己的脚本,从采用地理位置过滤的服务器中提取数据。

关于作者
Andrei Ogiolan, 全栈开发工程师 @ WebScrapingAPI
Andrei Ogiolan全栈开发工程师

安德烈·奥吉奥兰(Andrei Ogiolan)是 WebScrapingAPI 的全栈开发工程师,他在产品各领域均有贡献,并协助为该平台构建可靠的工具和功能。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。