WEEK 06 / 16 数据获取 · HTTP / API / 爬虫
PYTHON 程序设计 · V2 · 第 6 周(100 分钟 · L12–L14)

从网上拿数据
API、爬虫与边界

你从 W2 就在调大模型 API——今天揭开它底层的面纱:HTTP 请求-响应模型。 然后用 requests 调真实 API、爬真实网页,并回答一个 AI 回答不了的问题:该不该爬?

所属模块 M3 数据获取与处理← → 翻页 · F 全屏

今日课表(100 分钟)

时间环节要点
0–10HTTP 模型请求四要素 / 响应三要素 / 状态码口诀(2xx 你对 4xx 你错 5xx 服务器错)
10–22F12 实测打开网站 Network 面板:找请求、看响应——原来 chat.completions 就是 POST
22–36requests 五分钟get/params/headers/timeout;json() 解析;错误三连处理
36–48动手练习运行场:探索无文档 API 响应结构 + .get() 安全取值
48–60三个真实 API天气 / 名言 / 假数据——不同结构逐层提取
60–72爬虫三步requests 拿 HTML → BeautifulSoup 解析 → select 提取;CSS 选择器速记
72–84靶场演示quotes.toscrape.com 爬名言+作者+标签
84–94伦理三问能不能爬(robots)/ 该不该爬(频率)/ 用来干什么——只有人能回答
94–100小测随堂小测 3 题

伦理三问没有标准答案——讨论比结论重要。

HTTP:互联网的说话方式

客户端(浏览器/你的代码)
发请求
→
服务器
处理
→
响应(状态码 + JSON/HTML)
请求四要素
  • 方法:GET 取数据 / POST 提交
  • URL:去哪拿
  • 请求头:我是谁(User-Agent…)
  • 请求体:POST 带的数据
状态码口诀
  • 2xx 成功(200 OK)
  • 4xx 你错了(404 没找到 / 429 太频繁)
  • 5xx 服务器错了(500 内部错误)

现场实测:F12 Network 面板

打开任意网站 → F12 → Network → 刷新:

GET /v1/now?city=beijing  HTTP/1.1        # ← 请求行
Host: api.weather.cn
User-Agent: Mozilla/5.0 ...              # ← 你是谁(爬虫要伪装的就是它)

HTTP/1.1 200 OK                          # ← 响应:成功
Content-Type: application/json

{"city": "北京", "temp": "26℃", "aqi": 42}  # ← JSON:字典的模样
恍然大悟时刻:client.chat.completions.create() 底层就是一个 HTTP POST—— openai SDK 只是帮你把 HTTP 细节包装好了。

requests:五分钟上手

import requests

resp = requests.get(
    "https://api.example.com/now",
    params={"city": "beijing"},       # 查询参数自动拼接
    headers={"Authorization": "Bearer sk-..."},  # 认证放请求头
    timeout=10,                             # 一定要设超时!
)
resp.status_code      # 200
data = resp.json()      # JSON 响应 → Python 字典
data["temp"]           # 逐层取值

动手:处理无文档的 API 响应

交互 · 浏览器内运行(模拟 requests 环节)

真实场景:拿到了响应,但没文档——先探索结构,再取值:

没有 API 怎么办:网页爬取

三步流程,核心代码只有五行:

from bs4 import BeautifulSoup
import requests

html = requests.get("https://quotes.toscrape.com", timeout=10).text
soup = BeautifulSoup(html, "html.parser")

for q in soup.select("span.text"):        # CSS 选择器:class="text" 的 span
    print(q.get_text()[:30])

爬虫伦理三问

① 能不能爬? 先访问 域名/robots.txt 看是否允许;尊重网站条款与个人信息保护法。
② 该不该爬? 加 time.sleep()、避开高峰——你的每次请求都是别人的服务器成本。课堂演示过请求过快被封 IP 的真实案例。
③ 用来干什么? 学习研究可以;商用、转卖、爬隐私数据不行。AI 能一键生成爬虫代码,但「该不该」只有人能回答。

随堂小测(3 题)

交互 · 点击选项作答

课后与下周预告

本周课后
  • 练习:调一个公开 API(天气/名言),格式化输出三个字段
下周:W7 数据处理与工程化起步 拿到手的数据怎么「说话」——Pandas 筛选统计 + Matplotlib 画图;再解决「装库把环境搞坏」的虚拟环境。 提前看下周课件 →

深入阅读:M3 模块页 · 经典笔记 12.1 Web 概念 · 13.5 数据接口爬取