如何使用 cURL 发送 HTTP 头

探索 HTTP 头在网络抓取中的强大功能,学习使用 curl 高效地发送自定义头,提升数据收集和服务器交互。
3 min read
如何使用cURL发送HTTP头

超文本传输协议(HTTP)是一种无状态协议,遵循客户端-服务器模型,其中客户端发出请求,然后等待服务器的响应。请求包括 HTTP 方法、服务器位置、路径、查询字符串和头信息等详细信息。

HTTP 头是以键值对形式存在的字段或字符串列表,用于传递元数据和指令。它们在定义内容类型、缓存行为和身份验证等参数时非常重要,确保客户端和服务器之间高效且安全的交互。在网络抓取中,HTTP 头允许你自定义请求,使网络爬虫能够模拟用户代理、控制内容协商和根据网站政策和协议处理身份验证。

在网络抓取中,HTTP 头的一些常见用例包括更改用户代理(UA)或响应类型、执行条件请求和对应用程序编程接口(API)进行身份验证。

本文将教你如何使用cURL发送 HTTP 头。

使用 cURL 发送 HTTP 头

在开始本教程之前,通过在终端运行以下命令验证你的操作系统上是否已安装 cURL:

curl --version

如果已安装,你会在输出中看到一个版本号,如下所示:

curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: [unreleased]
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 is not recognized as an internal or external command, operable program or batch filecommand not found,则需要安装 cURL

你还需要一个检查头信息的工具,例如httpbin.org,这是一个简单的 HTTP 请求和响应服务。

如果你以前使用过 cURL,你会知道 cURL 语法如下所示:

curl [options] [url]

这意味着如果你想从mywebpage.com下载一个网页,你需要运行以下命令:

curl www.mywebpage.com

cURL 头

要使用httpbin.org查看 cURL 发送的头信息,请打开命令行并运行以下命令:

curl http://httpbin.org/headers

你的输出应包括头信息列表:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd2eb0-0617353714d52f3777c9c267"
  }

AcceptHostUser-Agent头是 cURL 默认发送的。

Accept头告诉服务器客户端可以接受哪些媒体类型。它向服务器传达客户端愿意接受的内容类型,从而在客户端和服务器之间实现内容协商。

表示客户端偏好 JSON 的Accept头如下所示:

Accept: application/json

User-Agent字段包含你的客户端详细信息,在这种情况下,是运行版本为 7.55.1 的 cURL 应用程序(此版本号将与你的版本匹配)。

Host头唯一标识发送 HTTP 请求的 web 域(即主机)和端口。如果请求中未包含端口,则默认假定为 80(HTTP)或 443(HTTPS)。

X-Amzn-Trace-Id是输出中唯一一个不是默认头的头。此头表明你的请求已发送到亚马逊网络服务(AWS)服务,例如 AWS 负载均衡器,并可用于跟踪 HTTP 请求。

要验证这些头是由 cURL 默认发送的,可以使用verbose模式。该标志是-v--verbose,显示有关请求和响应的详细信息,包括头信息。

运行以下命令查看 cURL 发送的默认头:

curl -v http://httpbin.org/headers

你的输出应如下所示:

*   Trying 50.16.63.240...
* TCP_NODELAY set
* Connected to httpbin.org (50.16.63.240) port 80 (#0)
> GET /headers HTTP/1.1
> Host: httpbin.org
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 22 Mar 2024 07:18:00 GMT
< Content-Type: application/json
< Content-Length: 173
< Connection: keep-alive
< Server: gunicorn/19.9.0
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Credentials: true
<
{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd30a8-624365ad52781957578cd5b1"
  }
}
* Connection #0 to host httpbin.org left intact

带有大于号(>)的行显示客户端(cURL)发送到端点的内容。此输出确认发送了以下头:

  • HTTP 方法为GET到端点/headers
  • Host值为httpbin.org
  • User-Agent值为curl/7.55.1
  • Accept值为\*/\*

在输出中,带有小于号的行,如< Content-Type: application/json,反映了你发送的头信息。

使用 -H 标志更改默认头

-H--header标志用于向服务器传递自定义头,也可用于测试。

例如,要将User-Agentcurl/7.55.1更改为Your-New-User-Agent,请使用以下命令:

curl -H "User-Agent: Your-New-User-Agent" http://httpbin.org/headers

你的输出如下所示:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "Your-New-User-Agent",
    "X-Amzn-Trace-Id": "Root=1-65fd5123-3ebe566a4681427c6996c72c"
  }
}

如果你想将Accept头从*/*(接受任何类型的内容)更改为application/json(仅接受 JSON 格式的内容),请使用以下命令:

curl --header "Accept: application/json" http://httpbin.org/headers

你的输出如下所示:

{
  "headers": {
    "Accept": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd55c3-05c21f81770c1c5e6343b1fc"
  }
}

注意:在第二个示例中,使用了--header而不是-H--header-H是可互换的,执行相同的功能。

自 cURL 版本 7.55.0 起,你还可以传递包含头信息的文件。例如,如果包含头信息的文件名为header_file,可以使用以下命令传递包含头信息的文件:

Curl -H @header_file

发送自定义头

自定义头由开发人员定义,包含关于 HTTP 请求的附加信息,超出标准头提供的范围。

要使用 cURL 发送自定义头,可以使用-H标志。例如,如果你想发送名为My-Custom-Header的自定义头,值为value of custom header,运行以下命令:

curl -H "My-Custom-Header: Value of custom header" http://httpbin.org/headers

你的输出如下所示:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "My-Custom-Header": "Value of custom header",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd7d2a-3b683be160ff2965023b3a31"
  }
}

发送空头

在某些情况下,发送空头是必要的,例如遵守要求某些头即使没有内容也必须存在的特定 API 要求。例如,HTTP 严格传输安全(HSTS)头用于强制执行网站的安全 HTTPS 连接。虽然此头通常包含关于 HSTS 持续时间和行为的指令,但发送它的空值可以确保立即强制执行 HSTS。

你还可以使用空头清除或重置头信息。例如,如果你想重置或清除之前默认设置的头,发送一个空头可以清除头的值。

要使用 cURL 发送空头,你需要指定头名称后跟一个分号表示空值。以下命令显示如何发送名为My-Custom-Header的空自定义头:

curl -H "My-Custom-Header;" http://httpbin.org/headers

输出显示My-Custom-Header为空值:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "My-Custom-Header": "",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd84e2-7a42d9d62a42741e448c426f"
  }
}

删除头信息

要使用 cURL 删除头,需要指定头名称后跟一个冒号且无值。

例如,要删除默认的User-Agent头,发送以下命令:

curl -H "User-Agent:" http://httpbin.org/headers

响应中不包含User-Agent头,验证了头已被删除:

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "X-Amzn-Trace-Id": "Root=1-65fd862d-13b181583501ae11046374a1"
  }
}

发送多个头

到目前为止,你看到的示例仅包含一个头,但使用 cURL 可以发送多个头。只需多次包含-H标志即可。

例如,如果你想发送两个头(Custom-Header-1Custom-Header-2),值分别为onetwo,运行以下命令:

curl -H "Custom-Header-1: one" -H "Custom-Header-2: two" http://httpbin.org/headers

你的输出如下所示:

{
  "headers": {
    "Accept": "*/*",
    "Custom-Header-1": "one",
    "Custom-Header-2": "two",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.55.1",
    "X-Amzn-Trace-Id": "Root=1-65fd8781-143be3502c559bc5605fc6f1"
  }
}

结论

在本文中,你了解了 HTTP 头以及如何使用 cURL 发送 HTTP 头。

如果你正在寻找全面的网络抓取解决方案,可以试试Bright Data。它提供的工具和服务,例如代理服务,可以帮助确保匿名性并防止 IP 封锁,以及Web Unlocker,帮助你在不需要 CAPTCHA 的情况下访问地理限制的内容。

立即开始你的免费试用吧!