如果您正在寻找一种可以同时测试代理和抓取站点的工具,那么您来对地方了。 cURL 是一个命令行工具,可让您测试代理并进行一些基本的网络抓取。 cURL 直观且易于学习,还可以发送请求、添加 cookie、调试和连接到代理等。
本分步指南将教您什么是 cURL、如何使用其各种命令、如何将其用于轻型网页抓取以及如何将 cURL 与代理服务器结合使用。该指南可能会有点复杂,因此在开始阅读之前请确保您对代理有基本的了解。了解一些网络抓取基础知识也会有所帮助。
目录
什么是卷曲?
cURL 是“客户端 URL”的缩写,是一种命令行工具,可促进互联网上的数据传输。它包括命令行curl.exe和一个名为的跨平台库 libcurl
,这使得服务器之间能够进行数据交换。
cURL 与使用互联网协议的各种现代操作系统兼容,可在从笔记本电脑到汽车等设备上运行。它支持多种互联网协议,例如:
- 数字信息通信技术
- 文件
- 文件传输协议
- FTPS
- 地鼠
- HTTP
- HTTPS
- IMAP
- IMAPS
- LDAP
- LDAPS
- MQTT
- POP3
- POP3S
- 实时传输协议
- SCP
- SFTP
- 中小企业
- 中小型企业系统
- 邮件传输协议
- 邮件传输协议
- 远程登录
- TFTP
一个重要的社区已经为 cURL 开发了各种工具,包括curl-loader,一个开源 Linux 软件性能测试工具。 Curl-loader 可以模拟众多 FTP/FTPS 和 HTTP/HTTPS 客户端的应用程序行为。单个curl-loader进程可以支持2,500到100,000个虚拟客户端,每个客户端都有一个唯一的源IP地址。
cURL 的起源
cURL 的历史可以追溯到 20 世纪 90 年代,当时命令行工具很流行。 1996年,瑞典开发商 丹尼尔·斯坦伯格 开始开发互联网中继聊天 (IRC) 房间脚本,为聊天参与者转换货币。这促使他开发了一个名为 httpget 的工具,这是一种通过服务器传输数据的流行 HTTP 方法。 Stenberg 的实验产生了 httpget 0.1,它由“不到 300 行的单个 C 文件”组成。
几个月后,文件传输协议 (FTP) 出现,促使 Stenberg 将 FTP 支持纳入他的工具中,并将其重命名为 urlget 2.0。 1998年3月30日,他添加了FTP上传支持,并将该工具再次重命名为cURL 3.0。
尽管 cURL 具有巨大的潜力,但它最初并没有引起多少关注。 1998 年,经过 15 次更新和重新发布后,cURL 从 Stenberg 的网站上获得了超过 300 次下载。同年晚些时候,Red Hat Linux 采用了 cURL,随后是 1999 年的 Debian 和 2001 年 8 月的 Mac OS X 10.1。自 2001 年以来,cURL 已成为几乎所有可连接互联网的软件的默认功能,包括 Windows 10、iOS 和 Android 设备。索尼 PS5、任天堂 Switch、Xbox,甚至汽车。
为什么使用 cURL?
cURL 因其能够有效处理复杂操作而成为开发人员的热门选择。它的多功能性、脚本能力和包含的库允许与其他程序无缝集成,而无需编写自定义 HTTP 解析和网络代码。
cURL 提供了大量 好处, 例如:
- 端点测试和调试能力
- 对发送和接收数据的详细洞察
- 全面的错误记录
- 支持多种协议
- 兼容http2、Metalink、gzip、自动解压和Content-Encoding
- 高级功能,如 FTP 上传、cookie、用户身份验证、代理支持、SSL 连接等
- 默认协议失败时自动切换协议
- 协议相关的 URL 语法
- 速率限制功能
- 能够使用括号指定 URL 部分或多个 URL(例如,https://google.{一、二、三}.com)
- 通过命令行指定任意数量的 URL 的选项
此外,开发人员非常欣赏 cURL 的默认 SSL 证书验证和 HTTPS 支持。当cURL通过HTTPS连接到服务器时,它会获取服务器的证书并将其与CA证书进行比较,以确保远程服务器的真实性。
如何安装 cURL
让我们探讨如何在计算机上安装 cURL。
苹果系统
无需在 macOS 上安装 cURL,因为它已集成到操作系统中。您可以在终端应用程序中本地使用它。
视窗
从 Windows 10 开始,操作系统包含 cURL 的副本。但是,cURL 命令充当 PowerShell 调用-WebRequest 命令。因此,在 Windows 终端中执行 cURL 命令将在幕后启动 Invoke-Request。要改用 cURL,请将“curl”替换为“curl.exe”,PowerShell 将运行 cURL 而不是 Invoke-Request。
例如,要检查 Windows 计算机上安装的 cURL 的当前版本,请在终端中输入以下命令:
curl.exe --version
输出应类似于:
curl 7.83.1 (Windows) libcurl/7.83.1 Schannel
Release-Date: 2022-05-13
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets
如果您想了解有关 cURL 和 Windows 的更多信息,我们建议您观看此视频。您将了解 cURL 是什么、如何在 Windows 上运行它以及如何使用 cURL 运行 API 请求 GET、POST、PUT、DELETE。
Linux
对于 Linux 用户,cURL 的安装过程因您的特定发行版而异。 Ubuntu 和 Fedora 等流行发行版都预装了 cURL,允许您直接在终端中使用它。
对于默认情况下不包含 cURL 的发行版,您可以使用发行版的包管理器来安装它。例如,在基于 Debian 的操作系统上,使用以下命令安装 cURL:
sudo apt-get install curl
如何使用 cURL
确保您的设备上安装了 cURL。在使用 cURL 之前,请确保您的系统上已安装它。如果没有,请从 cURL 网站下载。
A. 验证您设备上的 cURL 安装
要检查您的系统上是否安装了 cURL,请按照下列步骤操作:
- 在 Windows PC 或 MacBook 上,打开命令行界面或 PowerShell 终端。
- 类型
'curl --version'
- 按 Enter 键。
如果您的设备上安装了 cURL,您将收到类似以下内容的消息:
curl --version
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: 2017-11-14, security patched: 2020-11-05
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL
或者
curl --version
curl 7.31.0 (x86_64-apple-darwin12.4.0) libcurl/7.31.0 OpenSSL/0.9.8x zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz
如果您看到不同的消息,则表明您的设备上尚未安装 cURL,您需要安装它。
B. 确定要使用的适当 cURL 语法
默认情况下,cURL 使用 HTTP 协议,语法如下:cURL [options] [URL]
由于 cURL 支持多种协议,因此每种协议的语法可能略有不同。以下是针对不同网络协议的 cURL 命令的一些示例:
- 文件传输协议 (FTP): cURL -T“所选文件”“ftp://[目标目的地]”
- 简单邮件传输协议 (SMTP): cURL smtp://[smtp 服务器] –mail-from [发件人] –mail-rcpt [收件人] –upload-file [邮件内容文件]
- 字典网络协议[DICT]: cURL“dict://dict.org/d:hi”
了解您将使用哪些网络协议来优化您的 cURL 体验至关重要。
C. 针对您的目标采用适当的 cURL 语法
cURL 允许您执行各种任务,例如下载和上传文件或处理用户身份验证。每个任务都需要不同的 cURL 语法,主要是由于所涉及的特定参数和网络协议。
以下是一些常见任务及其相应的 cURL 命令:
- 下载文件: curl -o [文件名] [URL]
- 使用 FTP 协议上传文件: curl -u [用户名:密码] -T [本地文件路径] ftp://[URL]
- 请求 HTTP 标头: 卷曲-I [URL]
如何使用 cURL 进行轻度抓取
cURL 可以与 PHP 等编程语言结合用于轻型网络抓取。
在开始抓取之前,请确保查看目标网站的 robots.txt 文件。遵守规则,即使它们看起来不合逻辑,因为网站所有者有权建立参数和限制。在网络爬行时遵守 robots.txt 文件被视为标准做法,不遵守规定可能会导致法律纠纷。
考虑到这一点,这里有一个使用 cURL 进行轻型网络抓取的指南。
要开始抓取,请按照下列步骤操作:
- 选择一种用于抓取的编程语言,例如 PHP。本教程将使用 PHP。
- 创建一个新的 PHP 文件。
- 使用curl_init 初始化cURL 句柄。
$curl = curl_init
- 将 CURLOPT_RETURNTRANSFER 设置为 TRUE,这会将传输页面作为字符串返回。此命令告诉 cURL 将抓取的页面存储为变量,而不是默认显示整个页面:curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
- 发起请求并进行错误检查:
$page = curl_exec($curl)
;if(curl_errno($curl)) // check for execution errors { echo 'Scraper error: ' . curl_error($curl); exit; }
- 关闭连接:
curl_close($curl);
要仅提取信息的特定部分,您需要在 id=”case_textlist” 下指明要提取的内容。默认情况下,cURL 将提取整个页面:
$regex = '<div id="case_textlist">(.*?)</div>/s';
if (preg_match($regex, $page, $list)) echo $list[0]; else echo "Not found";
要在 PHP 中使用代理服务器解析网站,可以使用 cURL 库。下面是一个使用代理服务器获取网页的 PHP 脚本示例:
PHP代码:
<?php
// Set the URL to fetch
$url = "http://www.example.com";
// Set the proxy server and port
$proxy = "proxy.example.com:8080";
// Create a new cURL resource
$ch = curl_init();
// Set the cURL options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Fetch the URL and output the response
$response = curl_exec($ch);
echo $response;
// Close the cURL resource
curl_close($ch);
?>
在上面的脚本中,您可以将$url变量更改为您要解析的网站的URL,并将$proxy变量更改为您要使用的代理服务器的地址和端口。 curl_setopt() 函数用于设置 cURL 选项,包括 URL、代理服务器,并将响应作为字符串返回,而不是直接输出。最后,使用curl_exec()函数获取URL并通过echo输出响应。调用curl_close()函数来关闭cURL资源。
在下面的视频中,您将学习如何通过使用 cURL 加载网站的 URL 并将其与正则表达式进行匹配来创建代理抓取器。
如何使用 cURL 进行高级抓取
以下是一些精炼的 cUrl 配置,可以帮助优化您的网页抓取会话。
副标题:合并用户代理
当使用 cURL 下载或抓取链接时,它会将自己标识为 cUrl 。在某些情况下,您可能不希望这样做,因为特定网站可能会将 cUrl 识别为机器人并阻止它。
要避免这种情况,请使用 -A 或 –user-agent 选项包含用户代理。在此示例中,我们在 Windows 10 上使用了 Firefox 65 用户代理:
curl -x https://fineproxy.de/ -v -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0"
或者,您可以使用 -H 选项在标头中发送用户代理:
curl -x https://fineproxy.de/ -v -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0"
副标题:配置标头
抓取网站时,避免被视为机器人非常重要。许多网站现在阻止机器人提取数据,因为它们可能会压垮服务器并损害人类用户的服务。
为此,您需要使用 cURL 发送适当的标头。
首先,通过右键单击并选择“检查”来确定您通常发送到目标网站的标头。接下来,导航到“网络”选项卡。刷新目标站点,您将看到站点加载期间发出的请求。要更仔细地检查请求,您还可以右键单击它并将其复制为 cUrl 命令行。
然后,使用 -H 或 –header 选项在 cUrl 中配置标头。例如,以下是向目标站点发送“Accept”标头的方法:
curl -x https://fineproxy.de/ -v -H "Accept: text/html"
如何将 cURL 与代理服务器结合使用
将 cURL 与代理结合使用可以实现各种用例,例如网络抓取,其中需要代理来防止网站禁止和阻止。在本指南中,您将了解如何使用 cURL 通过代理服务器发送数据。
请按照以下步骤将 cURL 与代理结合使用:
1. 设置代理服务器
首先,根据代理提供商提供的说明设置代理。要验证您的代理设置是否正确,请在终端中输入以下命令:
curl https://httpbin.org/ip
此命令返回您设备的 IP 地址。如果这些值与您设备的原始 IP 地址匹配,则您的代理服务器设置不正确。如果它们不匹配,则说明您的代理服务器配置正确。
2. 配置您的代理以使用 cURL 命令
可通过三种方法配置代理以与 cURL 一起使用:
A. 使用配置文件(.curlrc)
配置文件是包含所需设置的文本文件,以 .curlrc 文件格式保存在系统目录中,以便在运行 cURL 命令时轻松访问。
代理配置文件包含以下格式的数据:
proxy = "[protocol://][host][:port]"
您可以在文件中保存多个配置设置并根据需要激活它们。在运行 cURL 命令之前,请打开该文件,您执行的任何 cURL 命令都将使用配置文件中的代理设置。
对于那些反复使用 cURL 和代理并提取大量数据的人来说,创建配置文件是最好的方法。无需每次都为 cURL 配置代理,从而节省了时间。
B. 使用命令行参数
此方法适合与 cURL 命令一起使用的一次性代理,因为它只需要直接 cURL 代理语法。语法如下:
curl -x "[protocol://][host][:port]" [URL] [options]
由于 cURL 的默认协议是 HTTP,因此您必须指定协议和代理服务器详细信息,尤其是在使用不同的网络协议时。
C. 使用环境变量
第三种方法涉及设置 http_proxy 和 https_proxy 变量(称为环境变量),它们会影响在系统级别运行的进程。这些命令是操作系统的一部分,可以覆盖其他参数。
通过环境变量进行 cURL 代理设置的语法如下:
export http_proxy="[protocol://][host][:port]"
export https_proxy="[protocol://][host][:port]"
运行这些命令后,您执行的任何 cURL 命令都将自动通过代理服务器。现在让我们详细讨论一下这个方法。
通过环境变量将 cURL 与代理一起使用
环境变量类似于在内存中存储可供一个或多个软件程序使用的可编辑值的对象。在这种情况下,我们可以将一个名为 http_proxy 或 https_proxy 的变量传递给 cURL,其中包含我们的代理信息,并且不需要每次运行命令时都指定它。您可以通过运行以下命令来完成此操作:
$ export http_proxy="http://fineproxy.proxy_type=datacenter.device=desktop:<YOUR-API-KEY>@proxy.fineproxy.de: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 地址是代理的 IP 地址,这确认您已经出色地设置了代理。此时,我们可以运行任何 cURL 命令而无需指定代理信息,因为 cURL 会为我们处理它。
7 个重要的技巧和技巧
在本节中,我们将根据您的特定需求,介绍一些使用 cUrl 代理的有趣技巧和宝贵技巧。
技巧 1:为 cUrl 专门设置代理
要仅为基于 cUrl 的任务指定代理,请使用以下命令序列:
-
cd ~ $ nano .curlrc
- 将此行添加到文件中:
proxy=http://user:pwd@IP_address_or_FQDN:port
例子:
proxy=http://testuser:[email protected]:3128
- 像往常一样运行 cUrl:
$ curl "https://www.reddit.com"
提示 2:启用和禁用代理
在编辑器中的 .bashrc 文件中创建一个别名来完成此操作:
$ cd ~
alias proxyon="export http_proxy='http://user:pwd@Proxy_IP_or_FQDN:Port';export https_proxy='http://user:pwd@Proxy_IP_or_FQDN:Port'"
alias proxyoff="unset http_proxy;unset https_proxy"
例子:
alias proxyon="export http_proxy='http://testuser:[email protected]:3128';export https_proxy='http://testuser:[email protected]:3128'"
通过在终端中运行 alias 命令来快速检查别名设置。保存 .bashrc 并使用以下命令更新 shell:
$ ~/.bashrc
技巧 3:绕过 SSL 证书错误
当 cUrl 遇到 SSL 证书错误时,它会阻止这些请求。要“跳过”SSL 证书错误进行调试,尤其是在一次性情况下,请将 -k 或 –insecure 添加到 cUrl 命令行:
curl -x "[protocol://][host][:port]" -k [URL]
提示 4:获取有关请求的更多信息
如果您的请求未按预期工作,您可能需要检查请求路径、标头和各种错误。要调查请求,请在 cUrl 后面添加 -v (–verbose),这将输出所有请求标头和经历的连接。
技巧 5:忽略单个请求的代理
要覆盖特定请求的代理,请使用以下命令行:
curl --proxy "http://user:pwd@Proxy_FQDN_or_IPAddress" "https://reddit.com"
或者使用:
$ curl --noproxy "*" https://www.reddit.com
完全绕过代理。使用 -v 选项,它显示直接到 Reddit 的连接,而不使用任何代理。
技巧 6:使用 SOCK 代理
如果您想使用任何类型的 SOCK 代理 (4/4a/5/5h),代码结构与以前相同,只是将相关部分替换为适当的 SOCKS 类型:
curl -x "socks5://user:pwd@Proxy_IP_or_FQDN:Port" https://www.reddit.com
例子:
$ curl -x "socks5://testuser:[email protected]:3128" https://www.reddit.com
专业提示 7:如果未指定协议,cURL 默认为 SOCKS4!
Curl 与 Wget
Wget 是一个命令行工具,具有许多功能,可以使用 HTTP、HTTPS 和 FTP 等标准网络协议进行文件传输。它的名称是 WWW 和“get”的第一个字母的组合,这表明 Wget 主要是为了 Web 数据交换而创建的。
Wget 命令的标准语法是:
Wget [option] [URL]
Wget 命令与 cURL 命令相当,它们执行类似的功能,但以不同的方式执行。
cURL 和 Wget 之间的 5 个相似之处
- 两者都是命令行实用程序,可以从 FTP 和 HTTP 或 HTTPS 下载文件,并支持 HTTP POST 请求。
- 两者都是开源软件。
- cURL 和 Wget 均于 1996 年推出。
- 两者都有类似的许可证,即 GPLv3 许可证。
- 两者都是可在多种操作系统上运行的轻量级软件包。
cURL 和 Wget 之间的 10 个区别
cURL 和 Wget 之间的主要区别在于这些实用程序执行请求的方式以及它们用于实现目标的资源。下表突出显示了这些差异:
卷曲 | 获取 | |
---|---|---|
1. 图书馆 | 由 libcURL 库支持 | 无需图书馆 |
2. 运营 | 单次操作传输数据,无需递归下载 | 支持递归下载 |
3. 协议 | 支持一系列网络协议 | 仅支持 HTTP(S) 和 FTP |
4. 下载 | 需要 -o 或 -O 将远程 URL 下载到本地文件 | 不需要 -o 或 -O 来下载远程 URL |
5. 上传 | 可以双向上传和传输数据 | 只支持简单的HTTP POST请求 |
6. 代理 | 支持 HTTPS、SOCKS 4 和 SOCKS 5 代理类型 | 支持 HTTP 代理,但不支持 SOCKS 代理类型 |
7. 授权 | 支持 HTTP 代理的附加身份验证技术 | 仅支持 HTTP 代理的基本身份验证过程 |
8. 便携性 | 更便携并预装在 Windows 和 macOS 上 | 便携性较差且未预安装在 Windows 和 macOS 上 |
9. 特点 | 要求直接指定每个功能 | 默认启用 cookie 和时间戳等功能 |
10. 要求 | 不需要 gnulib 包或 C99 编译器 | 需要 gnulib 和 C99 编译器何时使用 cURL 或 Wget |
在大多数情况下,cURL 是最佳选择,但在某些情况下 Wget 更合适。您必须确定哪些命令行实用程序将帮助您更快、更有效地完成任务。例如:
- Wget 比 cURL 更好地处理不稳定连接上的下载重试。
- Wget 提供了 cURL 所缺乏的下载功能,例如决定性的递归下载和带宽控制。
因此,在这种情况下最好使用 Wget 命令。此外,当使用 HTTP/HTTPS 和 FTP 以外的网络协议时,cURL 是更好的选择。您选择使用 cURL 还是 Wget 将始终取决于您正在执行的任务的特殊性。
结论
cURL 命令对于需要通过网络传输大量数据的任何人来说都是功能强大且多功能的工具。将 cURL 与代理结合使用是一项理想的升级,它允许您完成几乎任何任务。这种组合确保了数据隐私和安全,同时又不失去 cURL 命令的多功能性。尽管 Wget 庞大,但 cURL 更可取,因为它具有用户友好的界面和强大的功能。
根据我们到目前为止所讨论的内容,您可能正在考虑尝试 cURL 的炫酷效果。如果你还没有考虑过,你应该考虑一下。保持卷曲(双关语)。