python3爬虫基础--HTTP基本原理

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:// 开头的,所以必须经过这一步:
    1. 服务器向客户端发送数字证书,证明自己的身份(比如 "我真的是百度")
    2. 客户端验证证书合法性,协商加密方式
    3. 双方生成对称密钥,之后的所有数据都用这个密钥加密传输,防止被窃听 / 篡改
  • 对应 :请求网址开头的 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-AgentReferer 等字段,不然大概率返回 403 错误。

服务器处理请求:服务器 "干活"

服务器收到请求报文后,会:

  1. 解析请求行和请求头,知道你要访问哪个接口、带了什么参数
  2. 执行对应的业务逻辑(比如你的 sugrec 接口,会根据参数返回搜索建议数据)
  3. 生成响应报文,准备返回给客户端
  • 你看不到这一步:但可以通过「时间」列的耗时,大概判断服务器处理的速度(你的请求耗时 41ms,说明处理很快)。

返回 HTTP 响应:服务器给客户端 "回消息"

这一步对应你截图里的「响应标头」和「响应」面板,服务器把响应报文发回客户端,报文包含 3 部分:

表格

部分 你的截图里的例子 作用
状态行 200 OK 告诉客户端请求结果:200 = 成功、404 = 资源不存在、403 = 被拦截、500 = 服务器错误
响应头 Content-Type: application/json; charset=utf-8Date: 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 证书问题 :遇到 SSLErrorverify=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 未授权,需登录 / 认证 补充CookieAuthorization请求头
403 Forbidden 服务器拒绝访问,大概率被反爬拦截 检查User-AgentRefererCookie等请求头是否伪造完整
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 版)》

辅助:豆包

相关推荐
靠谱品牌推荐官9 小时前
【架构实战】如何设计一套原生支持 GEO 大模型爬虫语义索引的 HTML5/CSS3 纯净白盒前端架构?
前端·爬虫·架构
烟雨江南aabb10 小时前
Python第七弹:爬虫篇:BeautifulSoup库
爬虫·python·beautifulsoup
深蓝电商API1 天前
请求签名算法破解:从Chrome DevTools到Python还原的完整流程
爬虫·反爬
DevnullCoffe2 天前
用 MCP 让 AI Agent 直接批量下载亚马逊商品图片——原理、踩坑与实现
爬虫·python·api
深蓝电商API2 天前
电商网站IP封禁绕过:代理池+流量指纹模拟的实战方案
爬虫
川冰ICE3 天前
Python爬虫实战⑳|Pandas时间序列,趋势分析一网打尽
爬虫·python·pandas
小白学大数据3 天前
Python 爬虫动态 JS 渲染与无头浏览器实战选型指南
开发语言·javascript·爬虫·python
WL_Aurora3 天前
Python爬虫实战(三):水果行情网站大规模分页爬取
爬虫·python
Pocker_Spades_A3 天前
Python快速入门专业版(五十八)——正则表达式(re):爬虫文本提取利器(从语法到实战)
爬虫·python·正则表达式