10天学会Scrapy 第3天:核心实战讲义
10天学会Scrapy Day 03 模块化课程讲义,基于 repo 文档完成可执行实现、验证实验与回滚边界。
亿牛云技术团队2026年3月11日2 分钟阅读
Part 3: Pagination and Duplicate Control
这是《10天学会Scrapy》第 3/10 天。今天解决一个明确问题:如何把“能跑起来”升级为“可复现、可验证、可回滚”的模块化实现。
What Is Pagination and Duplicate Control?
分页策略与去重边界 是把抓取流程拆成可独立验证的工作单元。结论:你今天必须交付 可稳定翻页且无重复记录的抓取流程,否则课程目标未达成。
Beginners Scrapy Tutorial
学习约束:
- 只做当天模块,不跨主题扩写
- 必须留下命令、代码、输出、验证四类证据
- 发现失败必须记录修复动作
repo 文档主线(仅保留与当日模块相关目录):
scrapy/scrapy:重点目录 docs, extras, scrapy, sepscrapy/scrapyd:重点目录 docs, integration_tests, scrapyd, testsscrapy-plugins/scrapy-playwright:重点目录 docs, examples, scrapy_playwright, tests
Step 1 - Environment and Baseline Setup
cd ~/scrapy-labs/day01/bookslab
scrapy crawl books -O output/day03.json
python scripts/check_dup.py output/day03.json
Step 2 - Build the Core Module
核心代码(当日必须可运行):
# robust next-page follow
next_href = response.css("li.next a::attr(href)").get()
if next_href:
yield response.follow(next_href, callback=self.parse, dont_filter=False)
Step 3 - Run and Capture Outputs
执行后你应该拿到结构化输出文件,并能回答这两个问题:
- 关键字段是否完整?
- 输出规模是否达到当天目标?
Step 4 - Validate and Fix Failures
关键补充代码(用于补齐当日链路):
# scripts/check_dup.py
import json, sys
rows = json.load(open(sys.argv[1]))
ids = [r.get("url") for r in rows]
dup = len(ids) - len(set(ids))
print("rows:", len(rows), "dup:", dup)
assert dup == 0
Step 5 - Boundary and Acceptance
- 误区1:只看“命令成功”,不看数据质量。
- 误区2:没有验证脚本,靠肉眼判断。
- 误区3:一次改太多变量,无法定位问题。
验收表:
| 检查项 | 通过标准 | 失败信号 | 修复方向 |
|---|---|---|---|
| 输出规模 | >= 200 记录 | 明显低于阈值 | 检查分页与请求路径 |
| 字段完整度 | 缺失率 <= 5% | title/url 空值多 | 回到选择器与清洗逻辑 |
| 验证脚本 | pass | assert fail | 对照失败行修复并重跑 |
| 回滚能力 | 10 分钟内恢复 | 修改不可逆 | 保留 baseline 配置 |
Next Steps
- 总结今天完成的知识点覆盖:core concepts, module implementation, validation and troubleshooting, production boundary
- 记录一个失败案例与修复方法,作为明天的输入
- 明天进入下一个 Part,保持同样的 Step 节奏
需要企业代理方案?
我们可根据目标站点、并发规模与稳定性目标提供定制方案。