getheaders 这个命令通常不是一个独立的 Python 内置命令,而是源自像 curl 或 wget 这样的命令行工具,它的核心功能是向指定的 URL 发送一个 HTTP 请求,并获取服务器返回的 HTTP 响应头。

在 Python 中,我们有多种方式可以实现这个功能,从最基础的到最现代和推荐的。
场景理解:什么是 HTTP 响应头?
在浏览器或客户端向服务器请求一个网页(https://www.example.com)时,服务器除了返回网页的 HTML 内容(响应体),还会返回一些元数据,这就是 HTTP 响应头,这些头信息包含了关于响应、服务器、请求的资源等关键信息。
你可能会看到这些头:
Content-Type: 响应内容的类型,如text/html,application/json。Content-Length: 响应体的大小(字节)。Server: 使用的服务器软件,如nginx,Apache。Status-Code: HTTP 状态码,如200 OK,404 Not Found。Set-Cookie: 服务器设置的 cookie。
getheaders 的目标就是获取这些信息,而不是网页的 HTML 内容本身。

使用 urllib (Python 标准库)
这是 Python 内置的库,无需安装,适合简单的任务,它属于较老的库,语法相对繁琐。
代码示例
import urllib.request
import urllib.error
# 目标 URL
url = "https://www.example.com"
try:
# 创建一个请求对象
# 我们可以添加请求头,模拟浏览器访问,防止被服务器拒绝
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
req = urllib.request.Request(url, headers=headers)
# 发送请求并获取响应
with urllib.request.urlopen(req) as response:
# response.headers 就是一个类似字典的对象,包含了所有的响应头
headers = response.headers
# 打印响应头
print("--- HTTP Response Headers ---")
# 遍历并打印每一行头信息
for key, value in headers.items():
print(f"{key}: {value}")
# 也可以直接打印整个 headers 对象,格式略有不同
# print("\n--- Raw Headers Object ---")
# print(headers)
except urllib.error.HTTPError as e:
# 处理 HTTP 错误,404 Not Found, 500 Server Error
print(f"HTTP Error occurred: {e.code} {e.reason}")
# 对于错误响应,我们也可以获取其响应头
print(f"Error Response Headers: {e.headers.items()}")
except urllib.error.URLError as e:
# 处理 URL 错误,例如域名不存在、连接超时
print(f"URL Error occurred: {e.reason}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
代码解释:
import urllib.request: 导入必要的模块。urllib.request.Request(url, headers=headers): 创建一个请求对象,可以自定义请求头。with urllib.request.urlopen(req) as response:: 发送请求。with语句确保连接被正确关闭。response.headers: 这是一个http.client.HTTPMessage对象,它实现了类似字典的接口,可以方便地遍历和获取头信息。try...except: 网络请求容易出错,使用try...except来捕获HTTPError(如404) 和URLError(如DNS解析失败) 是非常好的实践。
使用 requests 库 (强烈推荐)
requests 是一个第三方库,被誉为“人类友好的 HTTP 库”,它的语法简洁、直观,是 Python 中处理 HTTP 请求的事实标准。
安装 requests
如果尚未安装,请打开终端或命令行运行:

pip install requests
代码示例
import requests
# 目标 URL
url = "https://www.example.com"
try:
# 发送 GET 请求
# headers 参数和 getheaders 命令的用途一致,用于自定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers, timeout=10) # timeout 设置超时时间(秒)
# 如果请求失败 (例如状态码是 4xx 或 5xx),requests 会抛出 HTTPError 异常
response.raise_for_status()
# 获取响应头
# response.headers 是一个 requests.structures.CaseInsensitiveDict 对象,不区分大小写
headers = response.headers
print("--- HTTP Response Headers ---")
# 遍历并打印
for key, value in headers.items():
print(f"{key}: {value}")
# 也可以直接打印
# print("\n--- Raw Headers Object ---")
# print(headers)
# 获取状态码
print(f"\n--- Status Code ---")
print(f"Status Code: {response.status_code}")
except requests.exceptions.HTTPError as e:
print(f"HTTP Error occurred: {e}")
# 即使发生错误,我们也可以尝试获取响应头
if e.response is not None:
print(f"Error Response Headers: {e.response.headers}")
except requests.exceptions.RequestException as e:
# 捕获所有 requests 相关的异常(连接超时、DNS错误等)
print(f"Request Error occurred: {e}")
代码解释:
import requests: 导入库。requests.get(url, headers=headers): 一行代码即可完成 GET 请求,非常简洁。response.headers:requests将响应头封装在一个CaseInsensitiveDict中,它像一个字典,但键不区分大小写(response.headers['Content-Type']和response.headers['content-type']都可以)。response.raise_for_status(): 这是一个非常方便的方法,如果响应的状态码表示 an error (4xx or 5xx), 它会自动抛出HTTPError异常。requests.exceptions.RequestException: 这是requests库中所有异常的基类,用它来捕获网络请求相关的错误非常全面。
使用 http.client (更底层)
http.client 是 Python 标准库中更底层的 HTTP 客户端实现,它提供了对 HTTP 协议更精细的控制,但使用起来比 urllib 更复杂,通常只在需要极高定制化时使用。
代码示例
import http.client
import socket
# 将 URL 拆分为主机名和路径
host = "www.example.com"
path = "/"
try:
# 创建一个 HTTPS 连接
# context 参数用于 SSL 证书验证
conn = http.client.HTTPSConnection(host, timeout=10)
# 发送 GET 请求
conn.request("GET", path, headers={'User-Agent': 'MyPythonScript/1.0'})
# 获取响应对象
response = conn.getresponse()
# 获取状态码和响应头
status_code = response.status
reason_phrase = response.reason
headers = response.headers
print(f"--- Status ---")
print(f"{status_code} {reason_phrase}")
print("\n--- HTTP Response Headers ---")
# response.headers 是一个 email.message.Message 对象
# 可以像字典一样遍历
for key, value in headers.items():
print(f"{key}: {value}")
# 记得关闭连接
conn.close()
except socket.timeout:
print("The request timed out.")
except http.client.HTTPException as e:
print(f"An HTTP error occurred: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
代码解释:
- 需要手动将 URL 拆分为主机名和路径。
http.client.HTTPSConnection(host): 创建一个 HTTPS 连接对象。conn.request("GET", path, ...): 发送请求。conn.getresponse(): 获取响应对象。response.status,response.reason,response.headers: 分别获取状态码、原因短语和响应头。- 必须手动调用
conn.close()来关闭连接,否则可能会导致资源泄露。
总结与对比
| 特性 | urllib (标准库) |
requests (推荐) |
http.client (标准库) |
|---|---|---|---|
| 易用性 | 较差,语法繁琐 | 极高,非常直观 | 较差,底层,代码量大 |
| 功能 | 基础功能齐全 | 功能强大,会话、Cookie、文件上传、JSON等 | 功能最底层,可定制性最高 |
| 依赖 | 无需安装 | 需要安装 (pip install requests) |
无需安装 |
| 推荐场景 | 简单脚本、不想安装第三方库 | 绝大多数场景,快速开发 | 需要精细控制HTTP协议的特殊场景 |
对于绝大多数用户和项目,使用 requests 库是最佳选择,它简单、强大且功能丰富,能让你用最少的代码完成任务,同时还能优雅地处理各种异常情况。
如果你在一个无法安装第三方库的受限环境中,或者你的脚本需要极度轻量化,urllib 是一个可行的替代方案。http.client 则留给那些对性能和协议控制有极致要求的专家级开发者。
