kp-002
HTTP 协议基础:请求、响应与会话
前置知识
本文基于模型知识整理,建议核对官方文档(见 参考资料)。
一句话定义
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。
自测题
- 服务器返回 403,第一步应该检查什么?
答:请求头——UA、Referer、Cookie 是否与浏览器行为一致,再考虑 IP 层面问题。
- Cookie 的作用是什么?requests 里如何维持?
答:在无状态协议上维持会话(如登录态);用 requests.Session() 自动保存并回传 Set-Cookie。
Content-Type: application/json的响应该怎么处理?
答:不要当 HTML 解析,直接 resp.json() 取结构化字段(见 kp-009)。
与其他知识点的关系
kp-006 是本篇的工程化封装;kp-014 用抓包观察真实报文;kp-017 的限速退避建立在 429 语义之上。
延伸阅读
MDN HTTP 文档(developer.mozilla.org 的 HTTP 板块);《HTTP 权威指南》前几章。