什么是 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
}
当你使用 cURL 命令调用 API 时,大多数 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
- Proxy password: <YOUR-API-KEY-HERE> // you can get one by registering here
- 目标网址: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
随后系统会提示您输入密码:
请输入用户 'webscrapingapi.proxy_type=datacenter.device=desktop' 的代理密码:
现在,您可以在那里输入 API 密钥,而无需在终端中暴露该密钥,从而使整个过程更加安全。此外,每次通过代理运行 cURL 命令时都必须输入凭据、主机和端口,这种操作体验可能并不理想,尤其是当您需要通过代理运行大量命令且使用的是同一家代理服务商时。
当然,你可以将凭据保存在本机上的一个单独文件中,每次使用时手动复制粘贴,但还有一种更自然的方法,即通过环境变量传递凭据,我们将在下面详细讨论。
通过环境变量使用 cURL 连接代理
环境变量就像一个对象,它在内存中存储一个可编辑的值,供一个或多个软件使用。在这种情况下,我们可以向 cURL 传递一个名为http_proxy或https_proxy的变量,其中包含我们的代理详细信息,这样就无需在每次执行命令时都进行指定。您可以通过运行以下命令来实现:
$ export http_proxy="http://webscrapingapi.proxy_type=datacenter.device=desktop:<YOUR-API-KEY>@proxy.webscrapingapi.com:80"
请注意,您必须将变量命名为http_proxy或https_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 在发送请求时不使用任何代理。具体操作如下:
$ curl --noproxy "*" http://httpbin.org/get
这样就能显示出我们的IP地址,而不是代理服务器的IP地址。
摘要
总而言之,结合代理使用 cURL 是一种绕过地理位置过滤的绝佳方式,它不仅能扩展我们从 Web 服务器获取资源的范围,也是涉足 Web 爬虫等领域的良好起点——在这些领域中,我们需要借助代理才能获取特定数据,或以期望的格式接收数据。希望本文能帮助您掌握如何结合代理使用 cURL,并鼓励您亲自尝试,编写自己的脚本,从采用地理位置过滤的服务器中提取数据。



