AI 学院 · Python 入门线 · 节点 ⑧ / ⑨

网络与 API

手把手教程:让程序上网——调 API、拿 JSON、抓数据。这是"程序联网"的一课,也是以后调大模型 API 的预演。约 5-7 个番茄。

状态 进行中 前置 ⑦ 数据与 CSV 下一步 ⑨ 毕业项目

第 0 步 · API 是什么

API = 别人服务器上提供数据的"窗口"。你发一个请求(URL + 参数),它返回数据(通常是 JSON)。你每天都在用:天气 App、地图、AI 对话——背后都是 API。

你 ──请求──▶ 服务器 你 ◀──JSON 数据── 服务器

本节点需要安装第三方库 requests(Python 自带的 urllib 能用但难用):pip install requests。装好后开始。

第 1 步 · HTTP 基础(请求的"信封")

心智模型:调 API = 发一封信。地址(URL)写对、问法(GET)选对、附上名片(headers),等回信(response)——先看"邮戳"(status_code),再读内容。

第 2 步 · 第一次请求(requests.get)

import requests

resp = requests.get("https://api.github.com/users/octocat")
print(resp.status_code)      # 200 状态码
print(resp.json()["login"])   # 'octocat' JSON 自动解析成字典
print(resp.text[:200])        # 原始文本(调试用)
resp.json() 是什么:服务器返回的是 JSON 文本.json() 方法把它解析成 Python 字典/列表(等价于 json.loads(resp.text))。拿到的结构直接 .json() 看,别猜。

第 3 步 · 带参数与头(params / headers)

import requests

# params:参数自动拼到 URL,中文自动编码
resp = requests.get(
    "https://api.github.com/search/repositories",
    params={"q": "python", "sort": "stars", "per_page": 3},
    headers={"User-Agent": "doxa-study"},   # 很多 API 要求标明身份
    timeout=10,                                   # 10 秒超时,防卡死(必须写!)
)
data = resp.json()
for repo in data["items"]:
    print(repo["full_name"], repo["stargazers_count"])
timeout 必须写——没有它,服务器不响应时你的程序会无限卡住。网络代码三件套:timeout + 状态码检查 + try/except。

第 4 步 · 完整的健壮请求模式

import requests

def fetch_json(url, **params):
    """安全请求:超时 + 状态码 + 异常,返回解析后的 JSON 或 None"""
    try:
        resp = requests.get(url, params=params, timeout=10)
    except requests.Timeout:
        print("超时"); return None
    except requests.ConnectionError:
        print("连不上"); return None
    if resp.status_code != 200:
        print(f"HTTP {resp.status_code}"); return None
    try:
        return resp.json()
    except ValueError:
        print("响应不是合法 JSON"); return None
这是"可上生产"的请求函数:任何脚本直接 import 用。真实项目里这类"带兜底的封装"就是你的基础设施。

第 5 步 · 实战项目:天气查询工具

需求:输入城市名,用 Open-Meteo(免费无需 key 的天气 API)返回温度。两次请求:先按城市名查坐标,再按坐标查天气。

Step 1:城市 → 坐标

GEO = "https://geocoding-api.open-meteo.com/v1/search"
resp = requests.get(GEO, params={"name": "南京", "count": 1}, timeout=10)
city = resp.json()["results"][0]
lat, lon = city["latitude"], city["longitude"]
print(city["name"], lat, lon)   # 南京 32.06 118.78

Step 2:坐标 → 天气

WX = "https://api.open-meteo.com/v1/forecast"
resp = requests.get(WX, params={
    "latitude": lat, "longitude": lon,
    "current": "temperature_2m,wind_speed_10m",
}, timeout=10)
cur = resp.json()["current"]
print(f"{city['name']}:{cur['temperature_2m']}°C,风速 {cur['wind_speed_10m']}")

Step 3:串起来 + 异常兜底

def weather(city_name):
    """城市名 → 天气(两次请求)"""
    r1 = requests.get(GEO, params={"name": city_name, "count": 1}, timeout=10)
    if r1.status_code != 200 or not r1.json().get("results"):
        return "查不到这个城市"
    c = r1.json()["results"][0]
    r2 = requests.get(WX, params={"latitude": c["latitude"], "longitude": c["longitude"], "current": "temperature_2m"}, timeout=10)
    return f"{c['name']}:{r2.json()['current']['temperature_2m']}°C"

print(weather(input("城市:")))
调 API 的核心素养:① 先看文档确定 URL/参数/返回结构 ② 用浏览器或 curl 先试一次 ③ 代码里永远 timeout + 状态码 + 异常。今天调天气,明天就能调大模型 API——骨架完全一样。

第 6 步 · 预告:AI API 就在这里等你

你之后调 LLM API(ChatGPT / Claude 等)时,流程一模一样:POST 请求 + Authorization 头 + JSON body → 返回 JSON 里取回复文本。本节点的「健壮请求模式」就是你的第一版 AI 客户端骨架。

第 7 步 · 报错手册(本节点新增)

1. requests.exceptions.ConnectionError —— 网络不通/域名错/被墙。修法:ping 一下域名;检查代理设置;确认 URL 拼写。
2. requests.exceptions.Timeout —— 服务器没按时响应。修法:加大 timeout、加 retry(重试 2-3 次)、检查是不是请求太频繁。
3. JSONDecodeError —— 服务器返回的不是 JSON(可能是 404 的 HTML 页)。修法:先看 status_code 和 resp.text,别直接 .json()。
4. 403 Forbidden —— 服务器拒绝(可能要求 API key 或 User-Agent)。修法:读 API 文档,按要求加 headers / 参数。
5. ModuleNotFoundError: requests —— 没装。修法pip install requests(或 pip3)。

节点自测清单

全勾 → 节点 ⑧ 完成,进入节点 ⑨(毕业项目)。未勾 → 回看对应步骤。

推荐资料