kp-030
案例:电商商品数据采集全流程
前置知识
本文基于模型知识整理。案例以公开练习站与合规目标为载体演示方法;对真实电商平台采集前必须完成 kp-004 的合规自检。
一句话定义
本案例串联全库技能,完成一个「竞品价格日度监控」的端到端项目:判型 → 接口/解析 → 翻页与调度 → 落库 → 价格指数分析。
为什么重要
单项技能(解析、翻页、限速)都懂但拼不成项目,是学习期的普遍瓶颈。本篇给出完整的决策链与代码骨架,可作为后续真实项目的模板。
前置知识
kp-010、kp-016;建议先通读 kp-004。
核心概念
- 需求定义:监控 N 个竞品 SKU 的每日价格 → 回答「我该不该调价」(kp-024 反向设计)。
- 判型:Ctrl+U 搜价格文本 → 有则静态/接口,无则抓包找接口(kp-012/014)。
- 两级采集:列表页收集 SKU 链接 → 详情/接口抽取字段(kp-010)。
- 日度调度 + 历史保留:定时任务 + 只追加价格表(kp-021)。
原理与机制
端到端流水线(各环节对应的知识点标注在括号内):
① 合规自检: robots/频率/数据用途 (kp-004)
② 判型与选路: SSR→解析 / CSR→接口 / 全失败→浏览器 (kp-012)
③ 试抓 50 条 POC: 验证字段可得性与结构稳定性 (kp-007/009)
④ 字段契约: sku_id,title,price,list_time,category,ts (kp-024)
⑤ 正式采集: 列表翻页→URL队列→详情抓取; 限速1QPS+退避 (kp-010/017/021)
⑥ 落库: prices 长表只追加; 原始页按日归档 (kp-011)
⑦ 监控: 入库量/空值率/429率 三条水位线 (kp-023)
⑧ 分析: 重采样→指数化→变价事件→周报 (kp-027/029)
核心采集骨架(把本库多个组件拼起来):
def daily_job():
bucket = TokenBucket(rate=1.0) # kp-017
with requests.Session() as s:
skus = []
for page_url in paginate(list_url_builder): # kp-010 翻页
bucket.take()
r = fetch(s, page_url) # kp-006 超时重试
skus += extract_skus(r.text) # kp-007/009 抽取
for url, etag in dedup(skus): # kp-021 去重状态
bucket.take()
item = extract_detail(fetch(s, url))
if item and item.get("price"): # kp-023 假成功防御
queue_save(item) # kp-011 批量落库
heartbeat(metrics) # kp-023 心跳
实例或案例
练习版落地(books.toscrape.com 充当商品站):50 页翻页 + 每本详情,产出 prices(book_id, ts, price) 长表;跑 5 天后用 kp-027 的指数化画对比图。这个练习完整走过 ①–⑧ 八步,是本库的毕业设计——完成后即可按同一模板替换目标站点。
真实场景的差异点:目标多为 CSR(先抓包)、字段更多(销量/评分/券后价)、有登录墙(评估是否该采)、风控更强(回到 kp-004 决定是否继续)。
常见误区
- 误区一:跳过 POC 直接全量。 字段契约未验证就跑全站,跑完发现关键页缺字段,全量重抓。
- 误区二:把「能抓到」当「能长期抓」。 没有监控与原始层归档的任务,站点一改版数据断档且无法回溯。
- 误区三:价格分析直接用原始值。 不做重采样与指数化的价格对比图无法支撑决策(kp-027 误区回顾)。
自测题
- 本案例八步里,哪一步必须在写代码之前完成?
答:① 合规自检与 ④ 字段契约(含 POC 验证)——先确认「该不该采、采什么」,再动手。
- 为什么价格表设计成只追加的长表?
答:保留完整历史才能做时序与事件分析;UPDATE 覆盖会销毁历史,趋势分析失去原料。
- 案例中三道监控水位线是什么?
答:入库量(骤降=改版/接口失效)、空值率(解析失效)、429 率(触发限流需自动降速)。
与其他知识点的关系
本篇是 kp-005~011、kp-016~017、kp-021、kp-023~024、kp-027~029 的集成应用;项目层面的流程模板见 kp-033。
延伸阅读
本库 kp-033(通用项目工作流);Scrapy 官方 Tutorial(同一需求的框架版实现)。