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 请求包含四部分:

  1. 请求行——方法 + URL + 版本。比如 GET /api/data HTTP/1.1
  2. 请求头——一堆键值对,告诉服务端你的信息
  3. 空行——分隔头部和体部
  4. 请求体——POST 时带的数据,GET 一般没有

响应也是类似的结构:

  1. 状态行——版本 + 状态码 + 原因短语。比如 HTTP/1.1 200 OK
  2. 响应头——服务端返回的元信息
  3. 空行
  4. 响应体——你真正想要的数据

小技巧:用 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 协议基础 - 知识体系 HTTP 协议 发展史 0.9 → 1.0 → 1.1 → 2 → 3 请求与响应模型 请求行/头/体 → 响应行/头/体 URL 结构 协议/主机/路径/参数/片段 版本对比 1.0 / 1.1 / 2.0 / 3.0 爬虫工程师必须掌握的基础知识 请求构造 响应解析 反爬对抗 理解 HTTP 协议,是做好数据采集的第一步 状态码 请求头 Cookie

嗯,这张图把 HTTP 协议的核心脉络理清楚了。从发展史到版本对比,从请求响应模型到 URL 结构,再到实际应用场景。你把这个框架记住了,后面学起来会轻松很多。

我的经验:刚开始学 HTTP 时,别急着背状态码。先把请求和响应的结构搞明白,知道每个部分干什么用的。状态码用多了自然就记住了。