一、案例背景与采集目标
天气是离日常生活最近的一类公开数据:早上要不要带伞、今天适不适合户外跑、老人要不要减少外出,都靠它。它同时也是最适合练「整月采全」的数据源——页面结构规整,但里面藏着两个机关:页面只给半截数据,剩下半截要走接口;站点还会反过来限你的速。把这两个机关都过了,你就掌握了采集真实站点最核心的两样本事。
本案例的目标站点:天气网 · 历史天气(广州),网址 https://lishi.tianqi.com/guangzhou/202608.html。它的网址规律很好记:城市拼音 + 年月,换一个月份就换一个页面,例如 https://lishi.tianqi.com/guangzhou/202607.html 就是 2026 年 7 月。
1.1 为什么挑这个站点
- 公开、无需登录,属于本课鼓励的「可运行示范」数据;
- 结构规整但暗藏机巧——页面上明明写着整月的统计结论,逐日明细却只肯给你前十天,剩下的必须自己拼接,正好用来练「页面 + 接口」的组合拳;
- 站点会限流,而且限得很真——连续请求两次就可能被拦,还会给回一个「伪装成正常页面的 404」。这是课堂上学「断点续跑 + 双通道兜底」的最佳现场。
1.2 这个案例要拿到什么
- 广州 2011 年 1 月至今、逐月连续的逐日天气明细(每天一行:日期、天气现象、最高温、最低温、风向、风力、空气质量指数、PM2.5;实测 2011 年 1 月与 2026 年 9 月页面均在线);
- 每个月的官方统计卡(平均高温、平均低温、极端高温、极端低温、平均空气质量);
- 每个月的气温走势图(站点页面上那张原生图表);
- 把逐日明细独立重算一遍,与站点的月度统计卡逐月交叉校验,验证我们采到的数据可信。
1.3 这个站点最关键的一个机关
打开任意一个历史月份页面,你会看到一整月的表格——但只有 1 日到 10 日是真数据,11 日以后的表格是空壳,要等你点「查看更多」时才由前端去后台取。也就是说:
| 你以为的 | 实际上的 | 正确做法 |
|---|---|---|
页面 = 整月数据 | 页面只服务端渲染 1~10 日 | 把「页面」和「接口」两份数据取并集 |
接口只是锦上添花 | 11 日至月末只能从接口拿,页面上根本没有 | 接口是必需品,不是可选项 |
两段数据接不上 | 11 日附近两段有重叠 | 按日期去重,页面优先 |
所以本案例的采集逻辑是:先用页面把前十天与统计卡拿到,再用接口把 11 日到月末补齐,最后按日期合并去重。这也解释了一个新手常犯的错误——「我明明看到整月都在,为什么采下来只有十天」。
1.4 这个案例的难点在哪
| 难点 | 具体表现 | 对策 |
|---|---|---|
| 页面只给十天 | 服务端只渲染 1~10 日,其余靠前端异步加载 | 页面 + 接口取并集,接口路径 /monthdata/{城市}/{年月} |
| 接口要加密参数 | 接口要求 POST 一个加密字段,明文是「城市_时间戳」 | 按站点自身脚本里的算法生成,密钥与算法见第二节 |
| 站点会限流 | 连续约 2 次页面请求就被重定向到 404 页;限流时还会返回「200 + 一个约 700 字节的假 404 页面」 | 有效性判定必须看内容(页面 ≥20KB、接口是合法 JSON),不能只看状态码 |
| 只能等,不能硬闯 | 换 UA、换路径都无效 | 断点续跑 + 自适应节流:命中限流就成倍拉长间隔,冷却后自动接着跑 |
| 空气质量只有近些年才有 | 早期月份的空气质量指数是空的,站点用 0 占位 | 标成缺失(留空),不要当成 0 参与计算 |
目标站点与交付产物
下表是本篇用到的真实站点。绿色是课堂可稳定复现的示范站点;橙色是延伸站点,多数有登录墙或风控,课堂上只讲结构、原理与合规边界,不教绕过。
| 项目 | 内容 |
|---|---|
| 示范站点 | 天气网 · 历史天气(广州) https://lishi.tianqi.com/guangzhou/202608.html 网址规律=城市拼音+年月;页面只服务端渲染每月 1~10 日,其余必须走 /monthdata 接口补齐;站点限流严格,页面连续约 2 次请求即被重定向到 404 页 |
| 延伸站点 |
|
| 交付产物 |
|
| 难度 | ★★★ 高 |
| 合规提示 | 站点有明确限流,采集必须低频、断点续跑;数据版权归原站,仅限学习研究,不得商业分发。 |
二、数据源与字段设计
这个站点有两套结构相同的通道:PC 端与移动端。数据字段完全一样,区别只在于路径与限流强度——这正是我们能在 PC 端被限流时用移动端兜底的原因。
| 通道 | 地址形态 | 提供什么 | 限流情况 |
|---|---|---|---|
PC 页面 | https://lishi.tianqi.com/{城市}/{年月}.html | 月度统计卡 + 每月 1~10 日明细 | 严格 |
PC 接口 | POST https://lishi.tianqi.com/monthdata/{城市}/{年月} | 11 日至月末明细(含 AQI、PM2.5) | 较严 |
移动页面 | https://m.tianqi.com/lishi/guangzhou/202608.html | 同 PC,结构同构 | 宽松 |
移动接口 | POST https://m.tianqi.com/lishi/monthdata/{城市}/{年月} | 同 PC 接口 | 宽松 |
2.1 逐日明细字段(14 个)
| 字段名 | 字段含义 | 示例值 | 口径与备注 |
|---|---|---|---|
日期 | 记录对应的日期 | 2026-08-15 | 统一成 YYYY-MM-DD |
年月 | 由日期派生的月份键 | 2026-08 | 做月度透视表用 |
星期 | 中文星期 | 周六 | 由日期派生 |
城市 | 中文城市名 | 广州 | 多城市采集时的区分主键 |
天气现象 | 站点原始天气描述 | 中雨 | 照录原文,不要改写 |
天气类型 | 归并后的主要天气 | 中雨 | 把「多云转阴」「阴转多云」归成同一类,便于统计 |
最高温 | 当天最高气温 | 33 | 纯数字,单位统一为摄氏度 |
最低温 | 当天最低气温 | 27 | 纯数字 |
温差 | 最高温 − 最低温 | 6 | 由前两列派生 |
风向 | 风向原文 | 西南风 | 如为「无持续风向」照录 |
风力 | 风力等级原文 | 2 级 | 保留原文口径,不擅自换算 |
空气质量指数 | AQI 数值 | 25 | 2017 年 11 月之前为空,缺失要留空不是 0 |
PM2.5 | 细颗粒物浓度 | 17 | 与 AQI 同时段才有值 |
数据来源通道 | 这条记录来自哪条通道 | pc / wap | 双源采集时用于追溯与交叉校验 |
2.2 月度统计卡字段(站点自己算好的结论)
| 字段名 | 字段含义 | 示例值 | 口径与备注 |
|---|---|---|---|
平均高温 | 当月平均最高气温 | 32 | 站点统计卡上的值 |
平均低温 | 当月平均最低气温 | 27 | 站点统计卡上的值 |
极端高温 | 当月出现的最高气温 | 38 | 站点统计卡上的值 |
极端低温 | 当月出现的最低气温 | 25 | 站点统计卡上的值 |
平均AQI | 当月平均空气质量指数 | 25 | 早期月份为空 |
缺失天数 | 该月未采到的天数 | 0 | 老月份站点本身可能缺日,如实记录 |
2.3 三个必须写死的口径
- 数据要「页面 + 接口」取并集。只采页面会丢掉每月后二十天;只采接口会丢掉统计卡。两段在 11 日附近有重叠,按日期去重、页面数据优先。
- 空气质量缺失要留空。这个站点的空气质量数据大约从 2017 年 11 月才有,更早的月份站点用
0占位。必须要求「把这类占位值标成缺失、留空」,否则算出来的「历史平均空气质量」会被一堆假 0 拉低。 - 「数据来源通道」这一列不能省。双源采集时,同一个日期可能两条通道都有数据,留下来源列,才能做「两源是否一致」的交叉校验,也才能在发现问题时定位是哪条通道出的错。
AI 助手小贴士|如果页面上的字段你分不清该归到哪一列,可以让 AI 先把原始文本原样列出来,你再来定拆列规则。
打开 WorkBuddy 或任意 AI 对话工具,试试这样问:请把这个天气页面上所有能看到的文字原样列出来,先不要做任何拆分或改写,我来决定怎么分列。
课程思政|工匠精神与严谨求实 · 一个小数点,一条错误结论
温度拆列、缺失留空、来源标注,这些动作看着琐碎,却决定了后面能不能正确计算。把空值当成 0,算出来的平均气温就会出错;不留来源列,出了问题就查不出来是哪条通道的锅。结论的可靠性,永远建立在这些不起眼的单元格上。
三、零代码操作步骤
工具与技能|先看清三个角色,再动手
本篇全程零代码:你把要求说清楚,AI 去执行,你负责验收。三个角色分工如下——浏览器技能指的是腾讯开源的 BrowserSkill,它能让 AI 直接操作你电脑上真实的浏览器(可复用已经登录的状态),自己开一个独立窗口干活,不打扰你正在看的网页;遇到验证码、登录或确认弹窗,它会停下来交给你本人处理。
| 角色 | 负责什么 | 在本案例里具体做什么 |
|---|---|---|
| 你 | 确认字段清单、验收结果、清洗与合规把关 | 盯字段清单、核对结果、处理异常(如验证码) |
| WorkBuddy | 接中文指令:探字段 → 批量采 → 清洗 → 导出交付物 | 拆解本篇的采集任务并跑完全量、产出交付物 |
| 浏览器技能 BrowserSkill | 以真实浏览器打开页面:跑脚本渲染、滚动 / 翻页 / 点开详情、截图留证;可复用本机浏览器已登录状态,遇到验证码或登录弹窗会停下来交给你处理 | 打开历史天气页,确认页面上只有 1~10 日、其余要靠站内接口补齐 |
五步操作主线(全课程统一,每一篇都按这个顺序推进):
- 定目标与字段:先看本篇第二节的字段表,把「要哪几列、每列什么口径、要多少条」说清楚——字段清单就是验收标准,说不清就会拿回一张字段乱七八糟的表。
- 现场踩点(浏览器技能 BrowserSkill):打开
https://lishi.tianqi.com/guangzhou/202608.html,确认逐日明细(含最高温、最低温、风向风力、AQI)与月度统计卡的位置。 - 小样试采(WorkBuddy):先只采
2026 年 8 月一个月,把逐日明细和月度统计卡都拿出来。 - 核对与清洗:① 这个月是不是整月齐(只到 10 日说明只采了页面、没走接口);② 空气质量列的范围对不对;③ 统计卡的四项数值有没有单独存下来。
- 导出与归档:导出交付物(数据明细表 / 可筛选明细页 / 数据看板 / 可复用的技能包),文件名带上采集日期,并写清数据来源、采集时间与已知局限。
用浏览器技能 BrowserSkill 打开 https://lishi.tianqi.com/guangzhou/202608.html(天气网 · 历史天气(广州)),把这一页每条记录能采到的字段名和示例值列出来,先不要采集。下面是在 WorkBuddy 里完成本案例的完整流程。全程不需要你写一行代码,但每一步都要动手核对。
- 新建对话,粘贴下一节的「采集提示词」,网址用
https://lishi.tianqi.com/guangzhou/202608.html。 - 先只采一个月。说「先只采 2026 年 8 月,把逐日明细和月度统计卡都给我看」。
- 核对三件事。① 这个月是不是整月都齐(不是只有 10 天);② 空气质量列的范围对不对;③ 统计卡的四项数值有没有单独存下来。
- 验证「页面 + 接口」是不是都走到了。如果只有 1 到 10 日,说明只采了页面,要明确要求「11 日到月末请从站内接口补齐」。
- 再采一整年。说「按同样规则采 2025 年全年 12 个月,注意控制频率,被限流就等一会儿再继续,已经采好的不要重复采」。
- 放开全量。确认一年没问题后,说「继续采 2011 年 1 月到 2026 年 9 月的其余月份,凑成 2011 年 1 月至今的完整序列」。这一步会被限流拖得比较久,让它在后台跑。
- 生成三件套。说「把数据整理成:数据明细 Excel、可检索的明细网页、带图表的数据看板,看板里的高温用红、低温用蓝」。
- 做交叉校验。说「用逐日明细重算每个月的平均高温、平均低温、极端高低温,和统计卡比对,把不一致的月份单独列出来」。
- 顺手把气温走势图也导出。说「把每个月的走势图导出成图片,并做一个可按年份筛选的图库页」。
四、提示词模板与追问技巧
下面这段可以直接复制。注意三件事:把「页面 + 接口」写死、把缺失值口径写死、先小后大分批来。
请帮我采集天气网的历史天气数据,城市广州。
【目标站点】https://lishi.tianqi.com/guangzhou/202608.html
网址规律是 城市拼音 + 年月,例如 202607 就是 2026 年 7 月。
注意:页面服务端只渲染每月 1~10 日的明细,11 日到月末必须从站内接口补齐
(POST https://lishi.tianqi.com/monthdata/guangzhou/{年月})。
移动端 m.tianqi.com 结构同构,PC 端被限流时可以切过去。
【采集范围】先只采 2026 年 8 月给我验证,我确认后再采全量。
【需要字段】
一、逐日明细(每天一行)
1. 日期(统一成 2026-08-15 格式)
2. 年月 / 星期
3. 城市
4. 天气现象(照录原文)
5. 最高温、最低温(只要数字,不要「℃」)
6. 风向(如 东南风)
7. 风力(如 2 级)
8. 空气质量指数 AQI、PM2.5(没有就留空)
9. 数据来源通道(pc / wap)
二、月度统计卡(每月一行)
10. 平均高温、平均低温、极端高温、极端低温、平均AQI、缺失天数
【执行要求】
- 必须把「页面 1~10 日」和「接口 11 日到月末」取并集,按日期去重
- 空气质量缺失要留空,不要把站点上的占位 0 当成真实值
- 支持断点续跑:已采好的月份自动跳过,中断后重跑同一条命令能接着采
- 控制频率,被限流就等一会儿再继续,不要提高频率硬闯
- 有效性要按内容判断:页面要有正常正文,接口要能解析出 JSON,
不要只看状态码是不是 200
- 输出 Excel,文件名 guangzhou_weather.xlsx
4.1 三条常用追问指令
追问一(只有十天):
采回来每个月只有 1 到 10 日,后半月的明细丢了。
请从站内接口 /monthdata 把 11 日到月末补齐,并和页面数据按日期合并去重。
追问二(缺失值被当成 0):
早期月份的平均空气质量是 0,这是站点的占位符,不是真实值。
请把这类 0 判为缺失、留空,并在质量说明里写清楚从哪个月份开始才有空气质量数据。
追问三(交叉校验):
请用逐日明细重算每个月的平均高温、平均低温、极端高温、极端低温,
与站点统计卡逐月比对,把差值超过 2 摄氏度的月份单独列出来,并说明可能的原因。
AI 助手小贴士|批量任务里,让 AI 先报一张「采集进度表」(哪些月份已完成、哪些缺失)再补采,比盲目重跑整个任务高效得多。
打开 WorkBuddy 或任意 AI 对话工具,试试这样问:请先给我一张采集进度表:哪些月份已经采到、哪些月份缺失或有问题,我据此决定补采哪些。
五、结果核对、清洗与保存
采集到的逐日明细样例(示例数据,字段形态与真实一致):
| 日期 | 星期 | 天气现象 | 最高温 | 最低温 | 风向 | 风力 | AQI | PM2.5 | 来源 |
|---|---|---|---|---|---|---|---|---|---|
| 2026-08-15 | 周六 | 中雨 | 33 | 27 | 西南风 | 2 级 | 25 | 17 | pc |
| 2026-08-16 | 周日 | 中雨 | 35 | 28 | 西北风 | 2 级 | 35 | 14 | pc |
| 2026-08-17 | 周一 | 中雨 | 33 | 29 | 西南风 | 2 级 | 22 | 12 | pc |
| 2026-08-18 | 周二 | 中雨 | 33 | 27 | 东北风 | 2 级 | 23 | 14 | pc |
| 2026-08-19 | 周三 | 小雨 | 35 | 28 | 东风 | 3 级 | 30 | 16 | wap |
5.1 六步清洗,一句话一条
① 去单位:
把最高温、最低温里的「℃」去掉,只保留数字。
② 统一日期:
把日期统一成 YYYY-MM-DD,并按日期正序排列;派生「年月」「星期」两列。
③ 缺失归一:
把 AQI 与 PM2.5 的占位值 0 判为缺失、置空,并统计每个月缺失的天数。
④ 新增温差列:
新增「温差」= 最高温 − 最低温。
⑤ 交叉校验:
用逐日明细重算每月的平均高低温、极端高低温,与统计卡比对,
差值 ≤2 摄氏度视为一致;不一致的月份单列出来并说明原因。
⑥ 输出交付:
先给我 Excel 数据明细,再生成可检索明细网页和数据看板。
5.2 这套流程最后交付哪些东西
| 交付物 | 内容 | 用途 |
|---|---|---|
数据明细.xlsx | 8 个 Sheet:说明 / 每日明细 / 月度汇总 / 年度汇总 / 月气候态 / 字段字典 / 质量校验 / 采集问题 | 拿去做二次分析的底表 |
数据明细.html | 可筛选、可排序、可分页、可导出的单页 | 随手查某一天广州的天气 |
数据看板.html | 逐年气温走势、12 个月气候态、年月热力图、空气质量走势、极端气温排行等图表 | 一眼看清广州这些年的冷暖与空气质量变化 |
气温走势图 | 每月一张走势图(时间范围内每个月一张),外加一个可按年份筛选的图库页与一份汇编 PDF | 与站点原生图表一致,可直接用于报告 |
技能压缩包 | 把本案例的采集与生成流程打包成可复用技能 | 换个城市改个拼音就能再跑一遍 |
AI 助手小贴士|核对多月数据时,最省力的办法是让它做一次「分组计数」:每个月应有几天、实际几天,一眼就看出来哪里缺了。
打开 WorkBuddy 或任意 AI 对话工具,试试这样问:请按月份分组统计记录条数,告诉我每个月应该有几天、实际采到几天、缺了哪几天。
课程思政|数据安全与法治素养 · 取之有道,用之有度
天气与空气质量是公开信息,但公开不等于可以随意滥用。控制请求频率、不加压对方服务器、不把他人整理的数据包装成自己的成果,是最基本的规矩。数据工作者的专业,既体现在会取,也体现在知道什么时候该停下来。
六、常见问题与合规红线
6.1 这个站点上最容易踩的五个坑
| 现象 | 原因 | 怎么处理 |
|---|---|---|
| 每个月只采到 10 天 | 页面服务端只渲染 1~10 日 | 从站内接口补齐 11 日至月末,再按日期合并 |
| 整月数据看着齐全,实际缺日 | 老月份站点本身就没有回补全部日期 | 用「缺失天数」如实记录,分析时注意样本量 |
| 早期月份的平均空气质量是 0 | 那是占位值,不是真实值 | 判为缺失、留空,并说明从哪个月份起才有数据 |
| 采集到一半突然全是 404 | 站点限流了,返回的是伪装成正常响应的假 404 页 | 停下来冷却,降低频率后从断点接着跑;有效性要按内容判断而不是状态码 |
| 统计卡和逐日重算的均值差了一度多 | 2014 年及以前的部分月份,站点统计卡与其接口逐日值本身就有口径差 | 把比对阈值放到 2 摄氏度,并把这类差异写进质量报告,不要当成采集错误 |
6.2 三条合规红线
- 只采公开信息。历史天气、空气质量属公开发布信息,可以采;但不要试图获取需要登录或付费的内容。
- 控制频率。这个站点的限流很敏感,本案例要求低频、支持断点续跑、命中限流就退避等待,不去想办法绕过。
- 不冒充官方。采集结果只作课堂分析,不得包装成气象服务对外发布,也不得声称是官方数据。
课程思政|诚信与职业操守 · 数据可以采,结论不能编
天气数据里最忌讳的一件事,是「缺了就编一个填上」——某天没采到就随手写个平均值,空气质量缺失就用相邻日期顶替。编造出来的数据比空值危险得多,因为它会让人做出错误的判断。诚实地留下空白、记录缺失原因,是数据工作者最硬的底线。
七、随堂自测(10 题)
点击选项即可判分,答错的题会立刻显示解析。
1天气网历史天气页面上,服务端真正渲染出来的逐日明细是?
- A. 只有每月 1 到 10 日
- B. 整月每一天
- C. 只有统计卡没有明细
- D. 只有最近七天
2采回来每个月只有 10 天,最正确的处理是?
- A. 接受现状,10 天也够用
- B. 从站内接口补齐 11 日至月末,并按日期合并去重
- C. 把缺少的天数用平均值补上
- D. 换个网站重新采
3站点对高频请求返回「200 + 一个约 700 字节的页面」,说明什么?
- A. 这个月份确实没有数据
- B. 页面很简洁
- C. 被限流了,返回的是伪装成正常响应的错误页
- D. 需要换个浏览器
4早期月份的平均空气质量显示为 0,正确的处理是?
- A. 判为缺失并留空,同时说明从哪个月份起才有数据
- B. 照原样记 0
- C. 把整列删掉
- D. 用相邻月份的值顶替
5为什么要保留「数据来源通道」这一列?
- A. 为了好看
- B. 双源采集时用于追溯记录来自哪条通道,便于交叉校验与排查
- C. 为了增加字段数量
- D. 没有实际用处
6用逐日明细重算的月均值与站点统计卡差了一点几度,最合理的判断是?
- A. 一定是我们的采集错了
- B. 直接把重算结果改成统计卡的值
- C. 统计卡与接口本身存在口径差,应把阈值放宽并在报告中说明
- D. 删掉这个月份
7面对这个站点的限流,下面哪种做法是正确的?
- A. 降低频率、断点续跑,被限流就退避等待
- B. 提高并发把剩下的抢完
- C. 换用户代理或换路径绕过去
- D. 放弃这个站点
8清洗时新增「温差」列,正确的算法是?
- A. 最高温 + 最低温
- B. 最高温 − 最低温
- C. 最高温 × 最低温
- D. 最高温 ÷ 最低温
9采集多月数据时,为了日后能追溯,最好的做法是?
- A. 只保存最终的汇总表
- B. 只在对话里看一眼
- C. 把所有月份覆盖成一份
- D. 保存原始明细、清洗版本和采集日志三样
10下面哪种做法违反了本课对天气数据使用的要求?
- A. 课堂上做南北温差对比
- B. 统计某年气温走势并画图
- C. 把结果存到自己的作业文件夹
- D. 把采集结果包装成「官方气象服务」对外发布