Python爬虫零基础入门【第二章:网页基础·第1节】网页是怎么工作的:URL、请求、响应、状态码?

🔥 本期专栏《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 开发环境的配置,安装了必要的依赖库,并熟悉了抓包工具的使用。现在,你的开发环境已经就绪,接下来我们将真正进入爬虫的核心知识体系。

🎯 本节目标

通过本节学习,你将能够:

  1. 理解浏览器与服务器之间的通信机制
  2. 掌握 HTTP 请求的核心要素(URL、方法、头部)
  3. 识别并解读常见的 HTTP 状态码
  4. 使用浏览器开发者工具分析网络请求
  5. 交付验收:能够打开任意网页,在 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>

三个核心部分:

  1. 状态行 :HTTP/1.1 200 OK (协议版本 + 状态码 + 状态描述)
  2. 响应头:服务器返回的元信息(内容类型、长度、缓存策略等)
  3. 响应体:实际的数据内容(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 打开开发者工具
  1. 在 Chrome/Edge 浏览器按 F12 或右键→检查
  2. 切换到 Network(网络) 标签页
  3. 刷新页面(F5),观察所有网络请求
5.2 找到关键请求

假设我们要分析某新闻网站的首页加载:

步骤:

  1. 清空请求列表(垃圾桶图标)
  2. 访问目标网页
  3. 在请求列表找到 文档类型 (通常是第一个)或包含数据的 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 为什么浏览器能访问,代码却不行?

可能原因:

  1. 缺少必要的请求头(特别是 User-Agent)
  2. Cookie 未携带(需要登录或会话)
  3. Referer 校验(某些站点检查来源)
  4. 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 面板的使用

问题排查:为什么代码请求失败的常见原因

核心原则:

  • 先用浏览器观察网络请求,理解数据从哪里来
  • 再用代码模拟浏览器的行为
  • 遇到问题对比浏览器请求与代码请求的差异

📝 课后作业(必做,验收标准)

任务:选择一个你感兴趣的网站(新闻、博客、论坛等),完成以下步骤:

  1. 打开浏览器 Network 面板

  2. 找到获取列表数据的请求(可能是 HTML 或 JSON 接口)

  3. 截图保存请求的 Headers 和 Response

  4. 用文字描述:

    • 这个请求的完整 URL 和参数含义
    • 使用了哪些关键请求头
    • 返回的状态码和数据格式
    • 如果要用 Python 复现,需要注意什么

验收方式:提交一份分析报告(可参考上文模板)+ 截图

🔮 下期预告

下一节《你要抓的到底是什么:HTML、CSS 选择器、XPath 入门》,我们将学习:

  • HTML 文档结构与 DOM 树
  • 如何用 CSS 选择器精准定位元素
  • XPath 表达式的实战技巧
  • 编写第一个字段提取脚本

预习建议:观察你常访问的网页,右键→检查元素,看看 HTML 代码长什么样?


💬 有疑问?欢迎留言讨论!记得完成作业哦~加油!

🌟文末

好啦~以上就是本期 《Python爬虫实战》的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持! ❤️🔥

📌 专栏持续更新中|建议收藏 + 订阅

专栏 👉 《Python爬虫实战》,我会按照"入门 → 进阶 → 工程化 → 项目落地"的路线持续更新,争取让每一篇都做到:

✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)

📣 想系统提升的小伙伴:强烈建议先订阅专栏,再按目录顺序学习,效率会高很多~

✅ 互动征集

想让我把【某站点/某反爬/某验证码/某分布式方案】写成专栏实战?

评论区留言告诉我你的需求,我会优先安排更新 ✅


⭐️ 若喜欢我,就请关注我叭~(更新不迷路)

⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)

⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)


免责声明:本文仅用于学习与技术研究,请在合法合规、遵守站点规则与 Robots 协议的前提下使用相关技术。严禁将技术用于任何非法用途或侵害他人权益的行为。

相关推荐
忧郁的橙子.2 小时前
26期_01_Pyhton判断语句
python
快乐小胡!2 小时前
【自动化测试】Selenium选择/定位元素的基本方法
python·selenium·测试工具
高洁013 小时前
数字孪生与数字样机的技术基础:建模与仿真
python·算法·机器学习·transformer·知识图谱
喵手3 小时前
Python爬虫零基础入门【第二章:网页基础·第4节】新手最常栽的坑:编码、时区、空值、脏数据!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·python爬虫编码时区·爬虫编码时区
淡忘旧梦3 小时前
词错误率/WER算法讲解
人工智能·笔记·python·深度学习·算法
癫狂的兔子3 小时前
【Python】【爬虫】爬取虎扑网NBA排行数据
数据库·爬虫·python
Aurora-Borealis.3 小时前
Day40 早停策略和模型权重的保存
python
好大哥呀3 小时前
如何在手机上运行Python程序
开发语言·python·智能手机
_codemonster3 小时前
手语识别及翻译项目实战系列(一)环境准备
人工智能·python·计算机视觉