杰瑞科技汇

Python中getheaders命令如何使用?

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

Python中getheaders命令如何使用?-图1
(图片来源网络,侵删)

在 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 内容本身。

Python中getheaders命令如何使用?-图2
(图片来源网络,侵删)

使用 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}")

代码解释:

  1. import urllib.request: 导入必要的模块。
  2. urllib.request.Request(url, headers=headers): 创建一个请求对象,可以自定义请求头。
  3. with urllib.request.urlopen(req) as response:: 发送请求。with 语句确保连接被正确关闭。
  4. response.headers: 这是一个 http.client.HTTPMessage 对象,它实现了类似字典的接口,可以方便地遍历和获取头信息。
  5. try...except: 网络请求容易出错,使用 try...except 来捕获 HTTPError (如404) 和 URLError (如DNS解析失败) 是非常好的实践。

使用 requests 库 (强烈推荐)

requests 是一个第三方库,被誉为“人类友好的 HTTP 库”,它的语法简洁、直观,是 Python 中处理 HTTP 请求的事实标准。

安装 requests

如果尚未安装,请打开终端或命令行运行:

Python中getheaders命令如何使用?-图3
(图片来源网络,侵删)
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}")

代码解释:

  1. import requests: 导入库。
  2. requests.get(url, headers=headers): 一行代码即可完成 GET 请求,非常简洁。
  3. response.headers: requests 将响应头封装在一个 CaseInsensitiveDict 中,它像一个字典,但键不区分大小写(response.headers['Content-Type']response.headers['content-type'] 都可以)。
  4. response.raise_for_status(): 这是一个非常方便的方法,如果响应的状态码表示 an error (4xx or 5xx), 它会自动抛出 HTTPError 异常。
  5. 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}")

代码解释:

  1. 需要手动将 URL 拆分为主机名和路径。
  2. http.client.HTTPSConnection(host): 创建一个 HTTPS 连接对象。
  3. conn.request("GET", path, ...): 发送请求。
  4. conn.getresponse(): 获取响应对象。
  5. response.status, response.reason, response.headers: 分别获取状态码、原因短语和响应头。
  6. 必须手动调用 conn.close() 来关闭连接,否则可能会导致资源泄露。

总结与对比

特性 urllib (标准库) requests (推荐) http.client (标准库)
易用性 较差,语法繁琐 极高,非常直观 较差,底层,代码量大
功能 基础功能齐全 功能强大,会话、Cookie、文件上传、JSON等 功能最底层,可定制性最高
依赖 无需安装 需要安装 (pip install requests) 无需安装
推荐场景 简单脚本、不想安装第三方库 绝大多数场景,快速开发 需要精细控制HTTP协议的特殊场景

对于绝大多数用户和项目,使用 requests 库是最佳选择,它简单、强大且功能丰富,能让你用最少的代码完成任务,同时还能优雅地处理各种异常情况。

如果你在一个无法安装第三方库的受限环境中,或者你的脚本需要极度轻量化,urllib 是一个可行的替代方案。http.client 则留给那些对性能和协议控制有极致要求的专家级开发者。

分享:
扫描分享到社交APP
上一篇
下一篇