(22)100天python从入门到拿捏《【网络爬虫】网络基础与HTTP协议》
网络基础与 HTTP 协议
文章目录
- 网络基础与 HTTP 协议
- 一、网络爬虫的“底层通信”
- 二、URL:统一资源定位符
- 1. URL 的定义
- 2. URL的组成部分
- 3. URL编码
- 三、HTTP 协议
- 1. HTTP 请求与响应模型
- 2. HTTP请求报文结构
- 3. 常见请求方法
- 4. HTTP 响应结构
- 5. 常见HTTP状态码
- 四、HTML:超文本标记语言
- 1. 基本结构
- 2. 网页的层次结构
- 五、User-Agent用户代理
- 1. 定义
- 2. 常见UA
- 3. 爬虫中伪装UA
一、网络爬虫的“底层通信”
网络爬虫的本质就是:
模拟浏览器向服务器发送请求 → 获取网页内容 → 提取有用数据
这个过程主要依靠下面的机制实现:
- 网络协议(TCP/IP)
- HTTP(超文本传输协议)
- HTML 网页结构
- User-Agent 浏览器标识
二、URL:统一资源定位符
1. URL 的定义
URL是互联网上资源的地址,就像网页的“门牌号”。
格式结构:
协议://主机名:端口/路径?参数#锚点
案例:
https://blog.csdn.net/qq_64736204?type=blogColumn
解读
- 协议:https,是一种通过SSL/TLS对传输的数据进行加密的安全通信协议;
- 主机名:blog.csdn.net,主机名即服务器的域名,浏览器需要通过DNS域名解析协议把域名转为服务器的IP,才能与服务器进行通信;
- 端口:没有显示指定,此时使用https协议的默认端口443,完整的访问地址应该是
blog.csdn.net:443
; - 路径:/qq_64736204,指明了在服务器上要访问的特定资源位置,
qq_64736204
是用户的ID,应着CSDN博客平台上的个人博客主页; - 参数:type=blogColumn,以?开头,这里有一个参数对: 参数名: type,参数值: blogColumn,该参数告诉CSDN服务器需要访问用户qq_64736204的“博客专栏”;
- 锚点:无,锚点以**#开头,用于指向网页内部的某个特定片段或标题**。由于它不存在,浏览器会默认显示该页面的顶部。
2. URL的组成部分
部分 | 含义 | 如下案例 |
---|---|---|
协议 | 使用的通信方式 | http , https , ftp |
主机名 | 服务器域名或IP地址 | www.douban.com |
端口号 | 网络服务接口(默认80/443) | :443 |
路径 | 服务器资源的路径 | /search |
参数 | 请求携带的键值对 | q=python |
锚点 | 网页内部定位(不会发给服务器) | #result |
3. URL编码
某些特殊字符如空格、中文等在URL中不能直接使用,必须进行URL编码。
案例:
注意:当请求的URL中有中文参数时(如“电影/小说/天气”),必须使用
urllib.parse.quote()
编码后再请求。
三、HTTP 协议
HTTP是客户端与服务器之间通信的规则。爬虫中,我们使用Python构建HTTP客户端,通过模拟浏览器的请求头、会话管理和协议交互,遵循HTTP规范向目标服务器发起请求并处理响应,实现网页数据的自动化采集。
1. HTTP 请求与响应模型
通信流程图:
2. HTTP请求报文结构
一个完整的请求主要包括如下:
说明
GET:请求方法,表示客户端要获取资源;
/1.png?..:请求路径与查询参数URL。表明客户端要访问服务器的 /1.png 文件;
HTTP/1.1:表示使用的 HTTP 协议版本;
Accept:表示客户端能接收的响应类型,这里表示浏览器支持多种图片格式(avif、webp、apng、svg+xml),*/*
表示可以接受任何类型;
Accept-Encoding:支持的压缩格式。服务器可以用这些算法压缩响应体以减少传输体积。gzip是最常见的压缩方式,br是Google推出的压缩方法,zstd是Facebook开发的压缩算法;
Accept-Language:浏览器首选语言是中文;
Connection: keep-alive,表示建立持续的TCP连接,避免重复建立连接;
Cookie:存储了 用户身份信息、登录状态;作用是让服务器识别你是谁;
Host:目标服务器域名,在HTTP/1.1是必需字段;
Referer: https://blog.csdn.net/qq_64736204/article/details/153483402,表示当前请求的来源页面,即是谁触发了这次请求。这里说明图片请求来自笔者浏览的CSDN博客文章;
User-Agent:标识客户端信息,浏览器类型、操作系统,服务器用它判断请求来自浏览器、爬虫还是移动设备。
部分 | 说明 |
---|---|
请求行 | 请求方法 + 路径 + 协议版本 |
请求头 | 浏览器标识、接收类型、cookie |
请求体 | 一般在POST请求中携带数据 |
3. 常见请求方法
方法 | 功能 | 说明 |
---|---|---|
GET | 获取资源 | 获取网页、图片、API数据 |
POST | 提交数据 | 表单登录、搜索提交 |
PUT | 更新资源 | 更新数据库数据 |
DELETE | 删除资源 | 删除记录 |
HEAD | 获取响应头 | 检查网页是否存在 |
get请求
渲染并打印 HTML 内容
原文对比
post请求
4. HTTP 响应结构
响应头结构
响应体结构
网页主体内容
<body class="nodata " style=""><div id="toolbarBox" style="min-height: 48px;"></div>...
</body>
<body>
:承载网页主要可见内容;- 工具栏、正文区域、广告栏、评论区内容均在此定义;
- CSDN博客的页面是动态加载的,部分内容由 JavaScript 渲染
汇总表
部分 | 含义 | 案例 |
---|---|---|
状态行 | 协议版本 + 状态码 + 状态描述 | HTTP/1.1 200 OK |
响应头 | 服务器类型、内容格式、缓存策略 | Date: Tue, 21 Oct 2025 17:26:29 GMT |
响应体 | 实际网页内容 | … |
5. 常见HTTP状态码
状态码 | 类型 | 含义 |
---|---|---|
200 | 成功 | 请求成功 |
301 / 302 | 重定向 | 页面跳转 |
403 | 禁止访问 | IP封禁、无权限 |
404 | 未找到 | URL错误 |
500 | 服务器错误 | 程序异常 |
在爬虫中,我们需要用状态码判断爬取是否成功。
四、HTML:超文本标记语言
HTML 是网页的结构语言,爬虫要“提取数据”,必须理解它的标签层级。
1. 基本结构
<!DOCTYPE html>
<html><head><title>(21)100天python从入门到拿捏《XML 数据解析》-CSDN博客</title></head><body><h1 class="title-article" id="articleContentId">(21)100天python从入门到拿捏《XML 数据解析》</h1><p><strong>YAML</strong>:缩进表示层级 ,支持简短语法、序列及锚点 ,允许注释。</p><a href="https://blog.csdn.net/qq_64736204/article/details/153224770">100天python从入门到拿捏《JSON 数据解析》</a></body>
</html>
标签 | 含义 |
---|---|
<head> | 元信息如标题、编码 |
<body> | 页面主体 |
<h1>~<h6> | 标题 |
<p> | 段落 |
<a> | 超链接 |
<img> | 图片 |
<div> / <span> | 区块 / 内联容器 |
2. 网页的层次结构
HTML被浏览器解析成“文档对象模型,即DOM树”:
DOM层级图:
<html> ← 根节点(整个HTML文档)
├── <head> ← 文档头部(元数据、标题、样式)
│ ├── <meta charset="utf-8"> ← 指定字符编码
│ ├── <title>网页标题</title> ← 显示在浏览器标签页上
│ ├── <link rel="stylesheet" href="style.css"> ← 外部CSS
│ └── <script src="main.js"></script> ← 外部JavaScript文件
│
└── <body> ← 网页主体内容(用户可见部分)├── <header> ← 页眉,通常包含LOGO或导航栏│ └── <h1>网站主标题</h1>│├── <nav> ← 导航栏│ ├── <a href="#home">首页</a>│ ├── <a href="#about">关于</a>│ └── <a href="#contact">联系</a>│├── <main> ← 主体内容区域│ ├── <section> ← 内容区块│ │ ├── <h2>章节标题</h2>│ │ └── <p>正文段落内容……</p>│ └── <article> ← 单篇文章或独立内容│ ├── <h2>文章标题</h2>│ ├── <p>文章内容……</p>│ └── <a href="#"></a>│├── <aside> ← 侧边栏,可放广告、推荐链接等│ └── <p>侧栏内容</p>│└── <footer> ← 页脚,包含版权信息└── <p>© 2025 MyWebsite. All rights reserved.</p>
爬虫提取数据的本质:在 DOM 树中找到目标节点,读取标签属性或文本内容。
五、User-Agent用户代理
1. 定义
User-Agent
是HTTP请求头的一部分,用于向服务器表明客户端身份。
如:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/121.0
服务器会根据 UA:
- 判断你是 PC、手机还是爬虫
- 返回对应版本网页
- 有时用来识别和封禁爬虫
2. 常见UA
类型 | 例子 |
---|---|
Chrome 浏览器 | Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/121.0 |
iPhone Safari | Mozilla/5.0 (iPhone; CPU iPhone OS 15_0) AppleWebKit/605.1.15 |
爬虫工具 | Python-urllib/3.9, Scrapy/2.9 |
3. 爬虫中伪装UA
案例:
ua_list = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/121.0","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)",
]
这里的伪装UA列表中第一个是Windows系统,第二个是Mac OS系统
为什么要伪装?
- 防止被网站识别为爬虫,Python默认UA容易被封
- 模拟真实浏览器访问行为
python学习专栏导航
(1)100天python从入门到拿捏《Python 3简介》
(2)100天python从入门到拿捏《python应用前景》
(3)100天python从入门到拿捏《数据类型》
(4)100天python从入门到拿捏《运算符》
(5)100天python从入门到拿捏《流程控制语句》
(6)100天python从入门到拿捏《推导式》
(7)100天python从入门到拿捏《迭代器和生成器》
(8)100天python从入门到拿捏《函数和匿名函数》
(9)100天python从入门到拿捏《装饰器》
(10)100天python从入门到拿捏《Python中的数据结构与自定义数据结构》
(11)100天python从入门到拿捏《模块》
(12)100天python从入门到拿捏《文件操作》
(13)100天python从入门到拿捏《目录操作》
(14)100天python从入门到拿捏《Python的错误与异常机制》
(15)100天python从入门到拿捏《面向对象编程》
(16)100天python从入门到拿捏《标准库》
(17)100天python从入门到拿捏《正则表达式》
(18)100天python从入门到拿捏《网络编程》
(19)100天python从入门到拿捏《多线程》
(20)100天python从入门到拿捏《JSON 数据解析》
(21)100天python从入门到拿捏《XML 数据解析》