🔥 本期专栏《Python爬虫实战》已收录,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~持续更新中!!

全文目录:
-
-
- 🌟开篇语
- [📌 上期回顾](#📌 上期回顾)
- [🎯 本节目标](#🎯 本节目标)
- 一、从"打开网页"说起:你看到的不是魔法
-
- [1.1 完整的请求-响应流程](#1.1 完整的请求-响应流程)
- 二、URL:网络资源的门牌号
-
- [2.1 URL 的组成结构](#2.1 URL 的组成结构)
- [2.2 实战技巧:识别参数规律](#2.2 实战技巧:识别参数规律)
- [三、HTTP 请求:告诉服务器"我要什么"](#三、HTTP 请求:告诉服务器"我要什么")
-
- [3.1 请求方法(Method)](#3.1 请求方法(Method))
- [3.2 请求头(Headers):身份证明与协商](#3.2 请求头(Headers):身份证明与协商)
- [3.3 Cookie:保持会话的钥匙](#3.3 Cookie:保持会话的钥匙)
- [四、HTTP 响应:服务器的回复](#四、HTTP 响应:服务器的回复)
-
- [4.1 响应的组成](#4.1 响应的组成)
- [4.2 状态码:解读服务器的态度](#4.2 状态码:解读服务器的态度)
- [4.3 重定向:自动跳转的处理](#4.3 重定向:自动跳转的处理)
- [五、实战演练:用浏览器 Network 面板分析请求](#五、实战演练:用浏览器 Network 面板分析请求)
-
- [5.1 打开开发者工具](#5.1 打开开发者工具)
- [5.2 找到关键请求](#5.2 找到关键请求)
- [5.3 验收任务:完整解释一个请求](#5.3 验收任务:完整解释一个请求)
- 六、常见问题与排查技巧
-
- [6.1 为什么浏览器能访问,代码却不行?](#6.1 为什么浏览器能访问,代码却不行?)
- [6.2 缓存导致的数据不更新](#6.2 缓存导致的数据不更新)
- 七、本节小结
- [📝 课后作业(必做,验收标准)](#📝 课后作业(必做,验收标准))
- [🔮 下期预告](#🔮 下期预告)
- 🌟文末
-
- [📌 专栏持续更新中|建议收藏 + 订阅](#📌 专栏持续更新中|建议收藏 + 订阅)
- [✅ 互动征集](#✅ 互动征集)
-
🌟开篇语
哈喽,各位小伙伴们你们好呀~我是【喵手】。
运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO
欢迎大家常来逛逛,一起学习,一起进步~🌟
我长期专注 Python 爬虫工程化实战 ,主理专栏 👉 《Python爬虫实战》:从采集策略 到反爬对抗 ,从数据清洗 到分布式调度 ,持续输出可复用的方法论与可落地案例。内容主打一个"能跑、能用、能扩展 ",让数据价值真正做到------抓得到、洗得净、用得上。
📌 专栏食用指南(建议收藏)
- ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
- ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
- ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
- ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用
📣 专栏推广时间 :如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅/关注专栏《Python爬虫实战》
订阅后更新会优先推送,按目录学习更高效~
📌 上期回顾
在上一节《环境搭建:Python/虚拟环境/依赖/抓包工具一次搞定!》中,我们已经完成了 Python 开发环境的配置,安装了必要的依赖库,并熟悉了抓包工具的使用。现在,你的开发环境已经就绪,接下来我们将真正进入爬虫的核心知识体系。
🎯 本节目标
通过本节学习,你将能够:
- 理解浏览器与服务器之间的通信机制
- 掌握 HTTP 请求的核心要素(URL、方法、头部)
- 识别并解读常见的 HTTP 状态码
- 使用浏览器开发者工具分析网络请求
- 交付验收:能够打开任意网页,在 Network 面板找到一个请求并完整解释其组成部分
一、从"打开网页"说起:你看到的不是魔法
当你在浏览器地址栏输入 https://example.com 并按下回车,短短几秒内发生了什么?
1.1 完整的请求-响应流程
让我们把这个过程拆解成清晰的步骤:
第一步:URL 解析
浏览器会解析你输入的网址(URL),提取出协议(https)、域名(example.com)、路径(/)等信息。
第二步:DNS 查询
浏览器向 DNS 服务器询问"example.com 对应的服务器 IP 地址是什么",获得类似 93.184.216.34 这样的 IP。
第三步:建立连接
浏览器与服务器建立 TCP 连接(HTTPS 还会进行 TLS 握手加密)。
第四步:发送 HTTP 请求
浏览器构造一个 HTTP 请求报文发送给服务器,告诉服务器"我要什么资源"。
第五步:服务器处理并返回响应
服务器接收请求、处理逻辑、查询数据库,然后返回 HTTP 响应报文。
第六步:浏览器渲染
浏览器接收到 HTML、CSS、JavaScript 等资源后进行解析渲染,最终呈现出你看到的网页。
💡 爬虫的本质:我们的程序扮演的就是"浏览器"的角色,模拟第四步发送请求、接收第五步的响应数据。
二、URL:网络资源的门牌号
2.1 URL 的组成结构
一个完整的 URL 包含以下部分:
json
https://www.example.com:443/api/articles?page=2&size=10#section-3
└─┬─┘ └──────┬──────┘└┬┘└─────┬─────┘└──────┬──────┘└────┬────┘
协议 域名 端口 路径 查询参数 锚点
各部分说明:
- 协议(scheme):http 或 https(加密版本)
- 域名(domain):服务器的网络地址
- 端口(port):默认 http=80,https=443,通常可省略
- 路径 (path):具体资源的位置,如
/api/articles - 查询参数 (query):传递给服务器的额外信息,
?key=value&key2=value2 - 锚点(fragment):页面内跳转位置,不会发送到服务器
2.2 实战技巧:识别参数规律
很多网站的分页、筛选都通过 URL 参数实现,观察这些参数是爬虫的第一步:
python
# 示例:某新闻站点的列表页
https://news.example.com/list?page=1&category=tech&date=2025-01-20
# 分析参数含义:
# page=1 → 第1页
# category=tech → 分类为科技
# date=2025-01-20 → 指定日期
当你需要批量抓取时,只需要修改这些参数:
python
base_url = "https://news.example.com/list"
for page in range(1, 11): # 抓取前10页
params = {"page": page, "category": "tech"}
# 构造完整 URL 发起请求
三、HTTP 请求:告诉服务器"我要什么"
3.1 请求方法(Method)
最常见的两种方法:
| 方法 | 用途 | 特点 |
|---|---|---|
| GET | 获取资源 | 参数在 URL 中,可缓存,幂等(多次请求结果相同) |
| POST | 提交数据 | 参数在请求体中,不可缓存,可能改变服务器状态 |
📌 爬虫90%的场景用 GET,除非遇到搜索表单、登录等需要提交数据的情况。
3.2 请求头(Headers):身份证明与协商
请求头是一系列键值对,告诉服务器额外信息:
http
GET /api/articles HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/json
Accept-Language: zh-CN,zh;q=0.9
Referer: https://www.example.com/home
Cookie: session_id=abc123; user_pref=dark_mode
关键头部解读:
- User-Agent:标识客户端类型(浏览器、爬虫等)
- Accept:声明能接受的数据格式
- Referer:从哪个页面跳转过来的(某些站点会校验)
- Cookie:身份凭证或会话信息
⚠️ 新手常犯错误:直接用 Python 请求时没有设置 User-Agent,被服务器识别为"机器人"而拒绝访问。
3.3 Cookie:保持会话的钥匙
Cookie 是服务器存储在客户端的小数据块,用于:
- 会话保持:登录后保持登录状态
- 个性化:记住用户偏好设置
- 追踪:分析用户行为
在爬虫中,Cookie 的作用场景:
python
# 场景1:需要登录才能访问的内容
headers = {
"Cookie": "session_id=xyz789; auth_token=abc123"
}
# 场景2:使用 Session 对象自动管理
import requests
session = requests.Session()
session.get("https://example.com/login", data={"user": "...", "pass": "..."})
session.get("https://example.com/profile") # 自动携带 Cookie
四、HTTP 响应:服务器的回复
4.1 响应的组成
http
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 3456
Set-Cookie: session_id=new_value; Path=/; HttpOnly
<!DOCTYPE html>
<html>
...响应体(页面内容)...
</html>
三个核心部分:
- 状态行 :
HTTP/1.1 200 OK(协议版本 + 状态码 + 状态描述) - 响应头:服务器返回的元信息(内容类型、长度、缓存策略等)
- 响应体:实际的数据内容(HTML、JSON、图片等)
4.2 状态码:解读服务器的态度
| 状态码范围 | 含义 | 常见示例 |
|---|---|---|
| 2xx 成功 | 请求被正确处理 | 200 OK(成功), 201 Created(已创建) |
| 3xx 重定向 | 需要进一步操作 | 301 永久重定向, 302 临时重定向, 304 未修改(缓存) |
| 4xx 客户端错误 | 请求有问题 | 400 错误请求, 403 禁止访问, 404 未找到, 429 请求过多 |
| 5xx 服务器错误 | 服 网关错误, 503 服务不可用 |
爬虫中的应对策略:
python
import requests
response = requests.get(url, timeout=10)
if response.status_code == 200:
print("✅ 成功获取数据")
elif response.status_code == 404:
print("❌ 页面不存在,可能已被删除")
elif response.status_code == 403:
print("⛔ 被拒绝访问,检查 headers 或 Cookie")
elif response.status_code == 429:
print("要降速或等待")
elif response.status_code >= 500:
print("🔧 服务器错误,稍后重试")
4.3 重定向:自动跳转的处理
当遇到 301/302 时,服务器在响应头的 Location 字段告诉你"资源搬家了":
python
# requests 默认会自动跟随重定向(最多30次)
response = requests.get("http://old-site.com/page")
print(response.url) # 输出实际访问的 URL
print(response.history) # 显示重定向历史
# 如果不想自动跟随:
response = requests.get(url, allow_redirects=False)
if response.status_code in [301, 302]:
new_url = response.headers['Location']
print(f"需要跳转到:{new_url}")
五、实战演练:用浏览器 Network 面板分析请求
5.1 打开开发者工具
- 在 Chrome/Edge 浏览器按
F12或右键→检查 - 切换到 Network(网络) 标签页
- 刷新页面(F5),观察所有网络请求
5.2 找到关键请求
假设我们要分析某新闻网站的首页加载:
步骤:
- 清空请求列表(垃圾桶图标)
- 访问目标网页
- 在请求列表找到 文档类型 (通常是第一个)或包含数据的 XHR/Fetch 请求
点击某个请求查看详情:
- Headers 标签:查看请求头、响应头
- Preview 标签:预览响应内容(JSON 会格式化显示)
- Response 标签:原始响应数据
- Timing 标签:各阶段耗时分析
5.3 验收任务:完整解释一个请求
选择一个请求,按以下模板记录:
json
【请求分析报告】
目标网站:https://example.com/news/list
1. 请求 URL:https://example.com/api/news?page=1&size=20
2. 请求方法:GET
3. 关键请求头:
- User-Agent: Mozilla/5.0...
- Referer: https://example.com/home
- Cookie: session_id=...
4. 响应状态码:200 OK
5. 响应内容类型:application/json
6. 响应数据示例:
{
"code": 0,
"data": {
"list": [...],
"total": 150
}
}
7. 分析结论:
- 这是一个分页接口,通过 page 和 size 参数控制
- 返回 JSON 格式,方便解析
- 需要携带 Cookie 才能访问(可能需要登录)
六、常见问题与排查技巧
6.1 为什么浏览器能访问,代码却不行?
可能原因:
- 缺少必要的请求头(特别是 User-Agent)
- Cookie 未携带(需要登录或会话)
- Referer 校验(某些站点检查来源)
- JavaScript 渲染(浏览器看到的是 JS 执行后的结果,直接请求 HTML 是空的)
排查步骤:
python
import requests
# 1. 添加完整的请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Referer": "https://example.com/",
"Accept": "text/html,application/json"
}
# 2. 设置超时避免卡死
response = requests.get(url, headers=headers, timeout=10)
# 3. 检查状态码
print(f"状态码:{response.status_code}")
# 4. 查看实际返回内容
print(response.text[:500]) # 只看前500字符
6.2 缓存导致的数据不更新
浏览器会缓存某些资源,如果需要强制获取最新数据:
python
headers = {
"Cache-Control": "no-cache",
"Pragma": "no-cache"
}
七、本节小结
本节我们系统学习了 Web 通信的核心机制:
✅ URL 结构 :协议、域名、路径、参数的作用
✅ HTTP 请求 :方法(GET/POST)、请求头、Cookie
✅ HTTP 响应 :状态码含义、响应头、响应体
✅ 实战工具 :浏览器 Network 面板的使用
✅ 问题排查:为什么代码请求失败的常见原因
核心原则:
- 先用浏览器观察网络请求,理解数据从哪里来
- 再用代码模拟浏览器的行为
- 遇到问题对比浏览器请求与代码请求的差异
📝 课后作业(必做,验收标准)
任务:选择一个你感兴趣的网站(新闻、博客、论坛等),完成以下步骤:
-
打开浏览器 Network 面板
-
找到获取列表数据的请求(可能是 HTML 或 JSON 接口)
-
截图保存请求的 Headers 和 Response
-
用文字描述:
- 这个请求的完整 URL 和参数含义
- 使用了哪些关键请求头
- 返回的状态码和数据格式
- 如果要用 Python 复现,需要注意什么
验收方式:提交一份分析报告(可参考上文模板)+ 截图
🔮 下期预告
下一节《你要抓的到底是什么:HTML、CSS 选择器、XPath 入门》,我们将学习:
- HTML 文档结构与 DOM 树
- 如何用 CSS 选择器精准定位元素
- XPath 表达式的实战技巧
- 编写第一个字段提取脚本
预习建议:观察你常访问的网页,右键→检查元素,看看 HTML 代码长什么样?
💬 有疑问?欢迎留言讨论!记得完成作业哦~加油!
🌟文末
好啦~以上就是本期 《Python爬虫实战》的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持! ❤️🔥
📌 专栏持续更新中|建议收藏 + 订阅
专栏 👉 《Python爬虫实战》,我会按照"入门 → 进阶 → 工程化 → 项目落地"的路线持续更新,争取让每一篇都做到:
✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)
📣 想系统提升的小伙伴:强烈建议先订阅专栏,再按目录顺序学习,效率会高很多~

✅ 互动征集
想让我把【某站点/某反爬/某验证码/某分布式方案】写成专栏实战?
评论区留言告诉我你的需求,我会优先安排更新 ✅
⭐️ 若喜欢我,就请关注我叭~(更新不迷路)
⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)
⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)
免责声明:本文仅用于学习与技术研究,请在合法合规、遵守站点规则与 Robots 协议的前提下使用相关技术。严禁将技术用于任何非法用途或侵害他人权益的行为。