kp-002

HTTP 协议基础:请求、响应与会话

入门 ≈ 25 分钟 HTTP协议状态码Cookie请求头

前置知识

本文基于模型知识整理,建议核对官方文档(见 参考资料)。

一句话定义

HTTP 是浏览器与服务器之间的文本协议;爬虫的全部工作,就是以程序身份发出与浏览器语义等价的 HTTP 请求,并解析其响应。

为什么重要

「会爬虫」的分水岭不在会不会调库,而在能否读懂一次请求:URL 指向什么、带了什么头、服务器回了什么、为什么回这个。抓包(kp-014)、反爬识别(kp-016)、礼貌限速(kp-017)全部建立在本篇之上。

前置知识

kp-001;对「客户端—服务器」模型有直觉即可。

核心概念

  • 请求报文:请求行(方法 + 路径 + 版本)、请求头、请求体。
  • 响应报文:状态行(状态码)、响应头、响应体。
  • 常用方法:GET(取数据)、POST(提交数据,翻页接口常用 POST + JSON)。
  • 关键请求头:User-Agent(客户端标识)、Referer(来源页)、Cookie(会话凭证)、Accept 系(内容协商)。
  • 关键响应头:Content-Type(是 HTML 还是 JSON)、Set-Cookie、Location(重定向目标)。
  • 无状态与会话:HTTP 本身无状态,靠 Cookie 维持「登录态」等会话。
  • HTTPS:HTTP over TLS,传输加密,爬虫侧主要影响是需要处理证书校验。

原理与机制

一次完整交互的报文形态:

GET /search?q=python&page=2 HTTP/1.1        ← 请求行
Host: example.com                            ← 请求头(选取关键)
User-Agent: Mozilla/5.0 ...
Cookie: session=abc123

HTTP/1.1 200 OK                              ← 状态行
Content-Type: text/html; charset=utf-8
Set-Cookie: session=abc123; Path=/

<html><body>搜索结果页(节选)</body></html>

必须形成条件反射的状态码分组:

状态码含义爬虫动作
200成功解析响应体
301/302重定向跟随新地址(requests 默认自动跟随)
403禁止访问常是 UA/Referer/Cookie 缺失,先补头再想代理
404资源不存在URL 构造有误
429请求过多被限流,立即退避(见 kp-017)
5xx服务器错误重试 + 告警,不是你的错但要能扛

图示与公式

URL 结构拆解:https://host:port/path?query#fragment。翻页参数几乎总是藏在 query 里(?page=3),这正是 kp-010 分页模式的操作对象。

实例或案例

用 Python 标准库发一次裸请求,看清报文本相(所有库都是它的封装):

import urllib.request
req = urllib.request.Request(
    "http://httpbin.org/get",
    headers={"User-Agent": "learn-crawler/1.0"},
)
with urllib.request.urlopen(req, timeout=10) as resp:
    print(resp.status, dict(resp.headers))
    print(resp.read().decode()[:200])

httpbin.org 会把收到的请求头原样回显,是校验「我的请求长什么样」的免费实验室。

常见误区

  • 误区一:状态码 200 就一定有数据。 很多站点对异常访问返回 200 + 一段「验证中」的 HTML 或空 JSON,要靠内容特征而非状态码判断。
  • 误区二:GET 和 POST 随便换。 接口按方法与参数位置做了约定,方法错了一律 4xx;翻页接口尤其常是 POST + 表单/JSON。
  • 误区三:不设 UA 也能通。 默认客户端标识(如 python-requests/x)是最容易被识别的信号,至少要模拟常见浏览器 UA。

自测题

  1. 服务器返回 403,第一步应该检查什么?

答:请求头——UA、Referer、Cookie 是否与浏览器行为一致,再考虑 IP 层面问题。

  1. Cookie 的作用是什么?requests 里如何维持?

答:在无状态协议上维持会话(如登录态);用 requests.Session() 自动保存并回传 Set-Cookie。

  1. Content-Type: application/json 的响应该怎么处理?

答:不要当 HTML 解析,直接 resp.json() 取结构化字段(见 kp-009)。

与其他知识点的关系

kp-006 是本篇的工程化封装;kp-014 用抓包观察真实报文;kp-017 的限速退避建立在 429 语义之上。

延伸阅读

MDN HTTP 文档(developer.mozilla.org 的 HTTP 板块);《HTTP 权威指南》前几章。

相关知识点

学习进度