1. HTTP 协议基础:从诞生到现在的演进之路
说实话,做爬虫这么多年,我见过太多人一上来就写代码,结果被各种反爬搞得焦头烂额。其实很多问题,归根结底是对 HTTP 协议理解不够深。今天咱们就从最基础的东西聊起。
1.1 HTTP 发展史:一个协议的四十年
HTTP 协议诞生于 1989 年,蒂姆·伯纳斯-李在 CERN 搞出来的。那时候的想法很简单——让科学家们能方便地共享文档。
- HTTP/0.9 (1991)——只有 GET 方法,没有请求头,没有响应头。返回的只能是 HTML。说白了就是个文件下载协议。
- HTTP/1.0 (1996)——增加了 HEAD、POST 方法,引入了请求头和响应头。我记得第一次看到
Content-Type这个头时,觉得这东西太有用了。 - HTTP/1.1 (1997)——这是目前最常用的版本。引入了持久连接、分块传输、缓存控制等。我在项目中遇到过很多网站还在用 1.1,但配置得乱七八糟。
- HTTP/2 (2015)——基于 Google 的 SPDY 协议。多路复用、头部压缩、服务器推送。说实话,对爬虫来说,2.0 的改动影响挺大的。
- HTTP/3 (2022)——基于 QUIC,用 UDP 替代 TCP。目前还在普及中,但大厂已经开始用了。
我的建议:做爬虫时,优先用 HTTP/1.1。2.0 和 3.0 虽然快,但很多反爬系统对它们的支持还不完善,容易触发风控。
1.2 请求与响应模型:你问我答的对话
HTTP 本质上就是个「请求-响应」模型。客户端发请求,服务端给响应。就这么简单。
我习惯把 HTTP 通信比作点外卖:
- 你(客户端)告诉店家(服务端)你要什么(请求)
- 店家做好后送给你(响应)
- 如果店家忙不过来,可能会告诉你「稍等」(状态码 503)
- 如果你点的菜没了,店家会说「换一个吧」(状态码 404)
一个完整的 HTTP 请求包含四部分:
- 请求行——方法 + URL + 版本。比如
GET /api/data HTTP/1.1 - 请求头——一堆键值对,告诉服务端你的信息
- 空行——分隔头部和体部
- 请求体——POST 时带的数据,GET 一般没有
响应也是类似的结构:
- 状态行——版本 + 状态码 + 原因短语。比如
HTTP/1.1 200 OK - 响应头——服务端返回的元信息
- 空行
- 响应体——你真正想要的数据
小技巧:用 Chrome 的开发者工具看网络请求时,重点关注 Request Headers 和 Response Headers。很多反爬的线索都藏在这里。
1.3 URL 结构详解:地址里的门道
URL 这东西,看着简单,但坑不少。我曾经因为一个 URL 编码问题,排查了整整两天。
一个完整的 URL 长这样:
https://user:pass@www.example.com:8080/path/to/resource?key1=value1&key2=value2#fragment
拆开来看:
| 组成部分 | 示例 | 说明 |
|---|---|---|
| 协议 | https:// |
HTTP 或 HTTPS,后者有加密 |
| 认证信息 | user:pass@ |
基本认证,现在很少用了 |
| 主机名 | www.example.com |
域名或 IP 地址 |
| 端口 | :8080 |
HTTP 默认 80,HTTPS 默认 443 |
| 路径 | /path/to/resource |
资源在服务器上的位置 |
| 查询参数 | ?key1=value1 |
以 ? 开头,& 分隔 |
| 片段 | #fragment |
页面内锚点,不会发给服务器 |
注意:URL 中的中文和特殊字符必须进行百分号编码。比如中文「数据」会变成 %E6%95%B0%E6%8D%AE。我见过有人直接拼中文 URL,结果请求一直失败。
1.4 HTTP 版本对比:选哪个版本干活?
不同版本差异挺大的。我整理了个对比表,方便你快速了解:
| 特性 | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| 连接方式 | 短连接 | 持久连接 | 多路复用 | 多路复用 |
| 头部压缩 | 无 | 无 | HPACK | QPACK |
| 服务器推送 | 无 | 无 | 有 | 有 |
| 队头阻塞 | 有 | 有 | 无 | 无 |
| 传输层 | TCP | TCP | TCP | QUIC (UDP) |
| 爬虫友好度 | 低 | 高 | 中 | 低 |
你想想看,为什么 1.1 对爬虫最友好?因为它的实现最成熟,各种工具和库支持最完善。2.0 虽然快,但很多老旧的爬虫框架不支持。3.0 就更别提了,目前还在推广阶段。
我个人习惯是:
- 日常采集用 HTTP/1.1
- 高并发场景考虑 HTTP/2
- HTTP/3 先观望,等生态成熟再说
1.5 知识体系总览
下面这张图把本章的核心知识点串起来了。我建议你多看几遍,建立整体认知:
嗯,这张图把 HTTP 协议的核心脉络理清楚了。从发展史到版本对比,从请求响应模型到 URL 结构,再到实际应用场景。你把这个框架记住了,后面学起来会轻松很多。
我的经验:刚开始学 HTTP 时,别急着背状态码。先把请求和响应的结构搞明白,知道每个部分干什么用的。状态码用多了自然就记住了。