HTT原理
URI和URL
URI:统一资源标志符;Uniform Resource Identifier
URL:统一资源定位符;Uniform Resource Locator
URN:统一资源名称;Uniform Resource Name
通过一个链接可以从网上找到资源,这个链接就是URI/URL。

URL的一般格式:
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment]

scheme:协议,如http/https/ftp,也称protocal。
username:password@:身份验证,用户名和密码
hostname:主机地址/域名。爬虫目标的核心。
:port:端口号。服务器端口,http默认80,https默认443
/path:路径/资源路径。服务器上资源具体的资源的地址
;parameters:参数/路径参数,少见,老网站会用。指定访问某个资源时的附加信息。
?query:查询参数。查询某类资源,多条件用&分隔
#fragment:片段/片段锚点。类似书签,客户端定位页面内位置,不会发送给服务器。
例题:https://user:pass@api.example.com:443/v1/data;lang=zh?page=2&limit=10#list
- scheme:
https - username:password:
user:pass - hostname:
api.example.com - port:
443 - path:
/v1/data - parameters:
;lang=zh - query:
?page=2&limit=10 - fragment:
#list
HTTP和HTTPS
http:超文本传输协议。HyperText Transfer Protocol
https:安全超文本传输协议。HyperText Transfer Protocol Secure。在http下加入SSL层。
SSL,现在升级为TLS:1,建立一个信息安全通道,保证数据传输安全。2,确认网站真实性。通过浏览器地址的锁志,也可以看CA机构颁发的证书。
https更加流行。
HTTP请求流程
DNS解析 → TCP三次握手 →(HTTPS专属:SSL/TLS握手)→ 发送HTTP请求 → 服务器处理 → 返回HTTP响应 → TCP四次挥手断开
. DNS 域名解析:找到服务器的 "地址"
- 作用 :把你输入的域名(比如
www.baidu.com)翻译成服务器的 IP 地址,让客户端知道数据要发给谁。 - 爬虫里的你不用管 :Python 的
requests库会自动完成 DNS 解析,你只需要写对 URL 的域名即可。
TCP 三次握手:建立可靠的 "传输通道"
- 作用:客户端(浏览器 / 爬虫)和服务器通过三次握手,建立稳定的 TCP 连接,确保后续数据传输不会丢包、乱序。
- 为什么必须有?:HTTP 是基于 TCP 的应用层协议,没有 TCP 连接,就没法发送 HTTP 数据。
- 爬虫实操点:这一步是底层操作,你看不到,但如果网络不通 / 服务器防火墙拦截,就会在这里失败,表现为 "连接超时"。
(HTTPS 专属)SSL/TLS 握手:建立加密通道
- 作用 :你的请求是
https://开头的,所以必须经过这一步:- 服务器向客户端发送数字证书,证明自己的身份(比如 "我真的是百度")
- 客户端验证证书合法性,协商加密方式
- 双方生成对称密钥,之后的所有数据都用这个密钥加密传输,防止被窃听 / 篡改
- 对应 :请求网址开头的
https://就说明走了这一步。 - 爬虫常见坑 :如果服务器证书过期 / 自签名,
requests会报SSLError,解决方法是加verify=False关闭证书验证(仅学习阶段使用,正式项目不推荐)。
发送 HTTP 请求:客户端给服务器 "发消息"
表格
| 部分 | 你的截图里的例子 | 作用 |
|---|---|---|
| 请求行 | GET /sugrec?prod=pc_his... HTTP/1.1 |
告诉服务器:请求方法(GET)、资源路径(接口地址)、协议版本(HTTP/1.1) |
| 请求头 | User-Agent: Mozilla/5.0...、Cookie: ...、Host: www.baidu.com |
传递客户端信息(比如浏览器类型、用户身份凭证、请求来源),是反爬的关键 |
| 请求体 | 无(你的是 GET 请求) | POST 请求时携带表单 / JSON 数据,GET 请求一般没有 |
- 爬虫必记 :服务器会通过请求头判断你是不是爬虫,所以必须伪造
User-Agent、Referer等字段,不然大概率返回 403 错误。
服务器处理请求:服务器 "干活"
服务器收到请求报文后,会:
- 解析请求行和请求头,知道你要访问哪个接口、带了什么参数
- 执行对应的业务逻辑(比如你的
sugrec接口,会根据参数返回搜索建议数据) - 生成响应报文,准备返回给客户端
- 你看不到这一步:但可以通过「时间」列的耗时,大概判断服务器处理的速度(你的请求耗时 41ms,说明处理很快)。
返回 HTTP 响应:服务器给客户端 "回消息"
这一步对应你截图里的「响应标头」和「响应」面板,服务器把响应报文发回客户端,报文包含 3 部分:
表格
| 部分 | 你的截图里的例子 | 作用 |
|---|---|---|
| 状态行 | 200 OK |
告诉客户端请求结果:200 = 成功、404 = 资源不存在、403 = 被拦截、500 = 服务器错误 |
| 响应头 | Content-Type: application/json; charset=utf-8、Date: Mon, 18 May 2026... |
告诉客户端返回数据的格式(比如 JSON/HTML)、服务器时间、Cookie 等信息 |
| 响应体 | (你没展开,但就是接口返回的 JSON 数据) | 爬虫真正要拿的内容!比如 sugrec 接口返回的搜索建议列表 |
- 爬虫实操点 :你用
requests发送请求后,response.status_code就是状态码,response.text/response.json()就是响应体数据。
TCP 四次挥手:断开连接,释放资源
数据传输完成后,客户端和服务器通过四次挥手断开 TCP 连接,释放网络资源。如果开启了 HTTP 的长连接(Connection: keep-alive),连接会保持一段时间,后续请求可以复用。
- 协议必须写对 :URL 开头必须带
http://或https://,不然无法解析域名 - 请求头必须伪造 :
User-Agent是基础,不然会被识别为爬虫拦截 - 状态码判断 :
200才是请求成功,其他状态码要针对性排错(比如 403 补全请求头,404 检查 URL) - HTTPS 证书问题 :遇到
SSLError加verify=False解决(仅学习阶段使用)
请求
请求,request,请求方法,请求网址,请求头,请求体
请求方法(Request Method)
告诉服务器你要执行什么操作,是请求的 "动作指令",常见有GET,POST
GET:从服务器获取数据,爬网页,接口数据,搜索结果,参数拼接在URL,无请求体,可缓存
POST:向服务器提交数据,登录,表单提交,带参数查询,上传文件,参数放在请求体里,不直接显示在URL里,适合传大量参数
还有HEAD,PUT,DELETE,CONNECT,OPTIONS,TRACE

请求网址(Request URL)
服务器资源的地址,是请求的 "目标位置",格式遵循 URL 规范:scheme://host/path?query。
必须带完整协议前缀(http:///https://),否则请求会直接失败。
请求头(Request Headers)
请求的 "附加信息包",是客户端发给服务器的 "自我介绍" 和 "额外说明",以键值对形式传递。
表格
| 字段 | 作用 | 爬虫为什么要伪造? |
|---|---|---|
User-Agent(UA) |
客户端标识(浏览器 / 爬虫类型) | 服务器默认拦截无 UA 的请求,必须伪装成浏览器 |
Cookie |
用户身份凭证(登录态、会话信息) | 爬需要登录的网站时,必须带上 Cookie 才能维持会话 |
Referer |
请求来源页面 | 部分网站会校验 Referer,防止跨站盗链 |
Host |
目标主机名 | 服务器用来确认请求的域名,一般和 URL 的域名一致 |
Content-Type |
请求体数据格式(如application/json) |
发送 POST 请求时,必须设置正确格式,否则服务器无法解析 |
| Accept | 请求报头域,指定客户端接受哪些类型信息 | |
| Accept-Language | 客户端接受哪些语言 | |
| Accept_Encoding | 客户端接收的内容编码 |
在requests中,通过headers参数传入字典格式的请求头
请求体(Request Body)
请求的 "正文数据",是客户端要提交给服务器的具体内容。
只有POST/PUT等方法才有请求体,GET请求一般没有请求体(参数拼在 URL 里)
- 表单数据:用
requests.post(url, data=表单字典) - JSON 数据:用
requests.post(url, json=JSON字典)

响应
响应即Response,是服务器收到你的请求后,给客户端(浏览器 / 爬虫)的「回复消息」。爬虫最终要爬取的所有数据,都藏在响应里。
有状态行,响应头,响应体。
状态行(Status Line)
告诉客户端「请求结果」(成功 / 失败 / 重定向)
| 状态码 | 含义 | 爬虫中怎么处理? |
|---|---|---|
200 OK |
请求成功,服务器正常返回数据 | 直接解析响应体即可 |
301/302 Found |
永久 / 临时重定向,资源地址已变更 | requests默认自动跟随重定向,如需手动处理,可设置allow_redirects=False,通过Location响应头获取新地址 |
400 Bad Request |
请求参数错误,服务器无法解析 | 检查 URL、参数、请求体格式是否正确 |
401 Unauthorized |
未授权,需登录 / 认证 | 补充Cookie或Authorization请求头 |
403 Forbidden |
服务器拒绝访问,大概率被反爬拦截 | 检查User-Agent、Referer、Cookie等请求头是否伪造完整 |
404 Not Found |
资源不存在,URL 路径错误 | 核对请求的 URL 和路径 |
500 Internal Server Error |
服务器内部错误,和爬虫无关 | 重试请求,或等待服务器恢复 |
响应头(Response Headers)
传递响应的附加信息(数据格式、编码、Cookie 等)
| 响应头字段 | 作用 | 爬虫实操场景 |
|---|---|---|
Content-Type |
响应体的数据格式 | text/html= 网页源码、application/json=JSON 接口、image/jpeg= 图片 |
Set-Cookie |
服务器下发的会话凭证 | 登录后服务器设置的Cookie,爬虫需保存并在后续请求中带上 |
Location |
重定向的目标地址 | 状态码 301/302 时,用来获取新的 URL |
Content-Encoding |
响应体的压缩方式(如gzip) |
requests会自动解压,无需手动处理 |
Server |
服务器类型(如nginx/Apache) |
了解网站服务器环境,部分反爬会根据服务器做限制 |
响应体(Response Body)
服务器返回的实际数据 ,是爬虫的最终目标!根据数据类型不同,requests提供了 3 种获取方式:
用 response.text,会自动根据Content-Type的编码解析成字符串
用 response.json(),直接解析成 Python 字典 / 列表,方便提取数据
用 response.content,获取原始字节流,可直接保存为文件
HTTP 2.0
二进制分层
帧:数据通信的最小单位。一个请求被分为请求头帧和请求体/数据帧
数据流:一个虚拟通道,承载双向的消息。每个流都有唯一ID标识
消息:与逻辑请求或响应消息对应的完整一系列的帧
将 HTTP 消息拆成二进制帧
HEADERS 帧(请求头)、DATA 帧(响应体)、SETTINGS 帧(配置)等
| 长度(24位) | 类型(8位) | 标志(8位) | 流ID(31位) | 负载...
多路复用
单个 TCP 连接上同时传输多个请求 / 响应流,每个流用唯一 ID 标识
流控制
- 流优先级:客户端可指定请求的重要程度,服务器优先处理关键资源(如 HTML 优先于图片)
- 流量控制 :避免发送方压倒接收方,通过
WINDOW_UPDATE帧动态调整流量窗口

服务端推送
- 核心能力 :服务器可主动推送客户端可能需要的资源(如 CSS、JS),无需等待请求IETF HTTP Working Group
- 工作流程 :客户端请求
index.html→ 服务器预判需要style.css→ 发送PUSH_PROMISE帧 → 主动推送资源 - 爬虫注意:H2 推送的资源不会出现在请求列表中,需特殊处理才能捕获
第一章第一小节,终于完成了。还有博主好久没学习,已经接受被AI淘汰了。就打算学点东西取悦自己了。
参考书:《Python3 网络爬虫开发实战(第 2 版)》
辅助:豆包