在这篇文章中,你将学习如何使用命令行工具cURL来使用代理服务器传输数据。代理服务器在客户端和目标服务器之间充当中间人。客户端可以将他们想要执行的每条命令转发给代理服务器,然后代理服务器执行这些命令并将结果返回给客户端。
当说目标服务上的数据使用地理本地化来限制显示的数据,或完全阻止某些国家的客户访问时,我们可能想这样做。在各种全球购物网站上,这种方法被用来显示当地货币的价格–例如,欧元而不是美元。如果我们直接访问该网站,我们最终会得到错误货币的数据。通过使用代理,我们可以根据代理的地区设置来获取我们需要的数据。
你将学习用cURL使用代理的不同方法。
什么是cURL?
cURL是一个用于传输数据的命令行工具,其根源可以追溯到1996年。它允许你以多种方式检索和发送数据,并输出到标准输出,以允许它与标准unix管道一起使用。它构成了许多开发者脚本的基础,因为它在大多数类似unix的操作系统上几乎是通用的,并且支持各种各样的协议,包括HTTP/HTTPS、FTP和SCP。
获取谷歌内容的一个简单例子是简单地针对一个URL调用cURL,它将把网页的内容输出到标准输出。
curl google.com
其中返回:
我们还可以通过附加-I
来获得更多的细节,这将显示标头的内容:
HTTP/1.1 301 Moved Permanently Location: http://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Wed, 14 Jul 2021 10:37:31 GMT Expires: Fri, 13 Aug 2021 10:37:31 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 219 X-XSS-Protection: 0 X-Frame-Options: SAMEORIGIN
这可能会让你感到困惑–谷歌的搜索框在哪里?我们可以看到cURL返回了一个301重定向,这也是我们的浏览器在访问该页面时得到的。我们的浏览器会跟随重定向,然后返回该网站的内容。由于cURL默认使用HTTP,并且默认不会跟随重定向,除非我们指定它,我们需要明确告诉cURL访问我们通常在浏览器中看到的www
子域以及我们喜欢使用的协议。
curl https://www.google.com
现在会像我们通常看到的那样返回google.com的全部内容。
这让你对我们在与cURL交互时的工作水平有一个很好的概念。cURL的驱动理念之一是 “垃圾进,垃圾出”,或者说,如果它提供的是垃圾,那么它就会返回垃圾。如果你试图提供错误的URL或者使用错误的协议,cURL不会试图引导你,它只会试图运行你的命令。因此,明确你的参数是非常重要的。
我们的代理设置
我们在本文后面的例子中使用的代理将被设置在我们的本地机器上,使用5000端口。默认情况下,代理声明中唯一需要的部分是主机,它默认使用HTTP作为方案,默认端口为80。我们将通过HTTP来传输数据,为了完整起见,我们将明确指定。在这里的大多数例子中,我们将使用一个向httpbin.org开发者服务发出的GET请求。这个服务特别有用,因为它允许我们在访问路径/ip时看到请求的来源。
- 代理主机名: 127.0.0.1
- 代理端口: 5000
- URL:https://httpbin.org/ip
- 用户名: 用户
- 密码: 密码
1: 使用命令行参数
使用代理的第一个也是最简单的选择是使用命令行参数。cURL内部有大量的帮助文档,你可以在命令行上过滤所有配置代理的选项。为了查看代理设置的文档,请使用以下命令:
curl --help proxy
-x, --proxy [protocol://]host[:port]
我们可以从帮助输出中看到 –proxy 语句行下的确切配置,这说明我们能够使用-x
标志速记或--proxy
参数来指定我们的代理。
因此,为了通过代理发送数据,我们要在终端运行以下任何一个程序:
curl --proxy http://127.0.0.1:5000 https://httpbin.org/ip curl -x http://127.0.0.1:5000 https://httpbin.org/ip
在我们的例子中,我们可以放弃协议规范,因为cURL默认为HTTP,允许我们只指定主机名:
curl -x 127.0.0.1:5000 https://httpbin.org/ip
代理认证
此外,如果我们的HTTP代理服务器也需要认证,我们可以使用-U
标志来指定它:
curl -U user:password --proxy http://127.0.0.1:5000 https://httpbin.org/ip
默认使用Basic认证方案,但有些代理服务器可能需要不同的认证方案。服务器会用标头信息来响应,详细说明应该使用哪种方案,但你可以指定让cURL来确定认证方案,并使用--proxy-anyauth
。
curl -U user:password --proxy http://127.0.0.1:5000 https://httpbin.org/ip --proxy-anyauth
如果你的密码包括特殊字符,请确保将你的认证字符串用双引号(””)表示:
curl -U "user:p@assword" --proxy http://127.0.0.1:5000 https://httpbin.org/ip
理想情况下,你应该寻求永远不需要在终端中暴露你的密码,相反,你可以只提供用户名,然后cURL会提示你的密码:
curl -U user --proxy http://127.0.0.1:5000 https://httpbin.org/ip > Enter proxy password for user 'user':
2: 使用环境变量
可以使用环境变量来配置cURL使用我们的代理。cURL允许通过设置变量[scheme]_proxy
为它支持的每个协议使用一个环境变量。如果这些都被设置了,那么当使用相应的协议时,cURL将默认使用它们。在我们使用http或https的例子中,我们会像这样设置http_proxy
或https_proxy
。
export http_proxy="http://127.0.0.1:5000" export https_proxy="http://127.0.0.1:5000"
必要时,我们还可以在这些声明中加入认证:
export http_proxy="http://username:[email protected]:5000" export https_proxy="http://username:[email protected]:5000"
这样,我们使用cURL的调用就只需要以下语句:
curl https://httpbin.org/ip
这意味着我们不再需要记住在会话期间提供参数。这种方法的一个限制是,它被用于所有支持其使用的应用程序(如wget),所以根据你的使用情况可能会导致问题。
与所有以这种方式设置的环境变量一样,这些只是临时变量,在我们的shell会话结束时或重启系统时将被删除。为了使它在所有会话中都可用,可以把它附加到一个shell启动文件中。根据你使用的shell和你的系统,你需要放置这个别名的文件会有所不同。在某些情况下,我们的命令会被附加到.bashrc或.zshrc文件的底部(分别用于bash和zshell),或者可以放在一个.profile文件中。这些类型的文件在你登录和启动shell实例时首先被执行,这意味着环境变量将被分配并在我们调用cURL时使用。
3: 使用别名
另一种更持久的配置代理的方法是通过一个别名,如果你总是需要定期以这种方式连接,这很有用。一个别名可以用来替代我们执行的任何系统命令。
使用这种方法,我们可以用我们的代理命令代替对curl
的调用。和环境变量一样,你用来做这件事的shell文件会有所不同。
alias curl="curl -x http://127.0.0.1:5000"
现在,当调用curl https://httpbin.org/ip时,
我们实际上是通过别名调用curl -x http://127.0.0.1:5000 https://httpbin.org/ip
,意味着我们不必每次都设置它。
4.使用.curlrc文件
我们已经看到了大量的可用于cURL的命令行选项。幸运的是,你可以在一个配置文件中配置你想让curl使用的选项,以节省重复的命令行使用。这个文件可以通过-K参数在命令行中指定,但是curl总是默认在你的主目录~/.curlrc(Windows下为_curlrc)中搜索一个文件。如果它不存在,你可以创建它,如果在每次调用时找到它,它将被使用。
为了配置cURL使用代理这种方式,我们可以在我们的~/.curlrc中与任何其他cURL配置变量一起指定如下:
proxy = "http://127.0.0.1:5000"
使用cURL来提取网页的标题
我们已经解释了cURL本身有多大的作用,所以让我们来演示一个更复杂的例子,我们用unix管道把它和其他工具结合起来。在这个例子中,我们要从https://snapshooter.com/,解析标题html标签。
curl --silent https://snapshooter.com/ | grep -Eo ''
下面是另一个解析元描述的例子,https://www.boxmode.com/
curl --silent https://www.boxmode.com/ | grep -Eo '\"description\":(.*)\"' [文中代码源自Scrapingbee]
为了抑制cURL输出的进度信息,有必要提供--silent
参数,我们使用grep来捕获正则表达式中的标题。你可以看到,作为一个简单的工具,它的用途很广,因为我们能够把它和其他工具如grep
、sed
和awk
结合起来。
总 结
在这篇文章中,我们展示了配置cURL的代理是多么的简单,我们使用了各种临时的和更永久的解决方案。如果你要通过同一个代理进行大量的请求,我们推荐的方法是使用 curl 配置文件,以便将 cURLs 的配置与其他工具分开。然而,这里的任何方法都同样可以接受,以使你能够达到你所需要的数据。
一些语言提供了cURL的绑定,例如,你可以通过PycURL包将 Python与cURL一起使用。