网页采集工作台
> 把「网页抓取」从写死选择器 + 手工对抗改版的易碎活,变成「抓得到 → 取得稳 → 改版不死 → 合规不越界」的可复用方法论。
> 方法论来源:开源自适应爬虫框架 Scrapling(D4Vinci/Scrapling,BSD-3-Clause)——只提炼结构与思想,不含源码原文。
何时用(触发词)
网页抓取 / 爬虫 / 数据采集 / 扒数据 / 提取网页列表 / 抓取文章 / 选题情报 / 热点榜单采集 / 商品数据 / 改版后失效 / 反爬 / Cloudflare / 动态加载页面抓取 / 页面转 Markdown 喂 AI 等。
核心流程(四步)
第 1 步 · 需求预检与合规红线 → 抓什么站 / 什么数据 / 是否允许(不合规直接停)
第 2 步 · 抓取方式决策 → 升级阶梯:HTTP → 动态浏览器 → 隐身指纹
第 3 步 · 定位与提取 → 意图化选择器 + 五取法,先 auto_save 学习
第 4 步 · 清洗导出与记忆沉淀 → 结构化导出 / Markdown 化喂 AI / 长期任务开 adaptive
第 1 步 · 需求预检与合规红线
动手前先过三道预检(不合规直接停,不抓):
| 预检项 | 问句 | 不通过则 |
|---|---|---|
| 可访问性 | 目标内容是否公开可访问(无需登录)? | ❌ 停 |
| 权限 | 是否在付费墙/会员区/明确「禁止抓取」声明之后? | ❌ 停 |
| 敏感性 | 是否涉及个人身份信息、隐私数据? | ❌ 停 |
合规红线(硬纪律):
1. 只抓公开页:登录墙 / 付费墙 / 需授权 API 的内容不抓不绕。
2. 尊重 robots.txt:目标站 robots 明确禁止且无正当理由时,默认不抓。
3. 速率克制:单站低频(默认 1 请求 / 2~5 秒),遇 429 / 403 / 验证码立即停止并退让(拉长间隔或放弃),绝不暴力重试。
4. 素材版权:抓取内容用于创作需注意版权——引用标注来源,不整篇搬运,金句/数据可提取但文字表达要重写。
5. 个人信息:不采集可识别到个人的隐私数据(手机号/地址/内部信息)。
6. 工具伦理:本方法论只用于公开信息的常规采集,不用于绕过付费/授权访问、不用于攻击性爬取。
第 2 步 · 抓取方式决策(升级阶梯)
核心纪律:能用低档绝不用高档——每升一档,速度变慢、资源变贵、被封概率反而要评估。拿不到先升档,不急着改选择器。
| 档位 | 手段 | 适用 | 速度/资源 |
|---|---|---|---|
| ① HTTP 直取 | 普通 GET + 浏览器风格请求头 | 静态页、API 直出 JSON | 🐇🐇🐇🐇🐇 最低 |
| ② TLS 指纹模拟 | impersonate='chrome' 类参数 |
反爬只查 TLS/请求头指纹的站 | 🐇🐇🐇🐇 |
| ③ 动态浏览器 | Chromium 渲染(Playwright) | JS 渲染、需滚动/点击、后台 XHR 捕获 | 🐇🐇🐇 中 |
| ④ 隐身浏览器 | 隐身指纹 + 反检测注入 | Cloudflare Turnstile 类复杂防护 | 🐇🐇🐇 中高 |
决策规则:
- 先试 ①:响应 status == 200 且页面源码里能找到目标文本 → 直接用解析层,完事。
- 源码里找不到目标(JS 渲染的)→ 升 ③。
- 被 403 / 跳验证码 / 返回「安全检查」页 → 升 ②(指纹)→ 仍不行升 ④。
- 需要登录态 → 用会话(Session)持久化 Cookie,不硬闯。
会话纪律:多次请求同一站(尤其带 Cookie/状态)用 Session 复用连接与 Cookie;浏览器会话保持打开不反复开关。
详细配方见 references/01-抓取方式阶梯.md。
第 3 步 · 定位与提取(意图化选择器 + 五取法)
选择器纪律:写意图,不写坐标
| ❌ 脆(坐标) | ✅ 稳(意图) | 原因 |
|---|---|---|
#hmenus > div:nth-child(1) > ul > li > a |
header nav a:first-child |
nth-child 层级一变就死 |
.item:nth-child(3) |
.item-list .featured |
顺序/插入会变 |
| 只靠单一 id/class | class + 文本锚点组合 | id 可能被移除,语义 class 常留 |
经验:
1. 优先语义化 class 组合(.product .title 优于 #p123)。
2. 目标有稳定可见文本时用文本锚点(find_by_text 类),比结构选择器更抗改版。
3. 从元素反向导航(父/兄弟/子)定位「列表项里的字段」而非写完整路径。
4. 手动复制来的超长选择器(浏览器右键复制)一律清洗重写。
五取法速查
| 方法 | 场景 |
|---|---|
| CSS 选择器 | 默认首选,语义 class 组合 |
| XPath | 复杂祖先/条件(含文本判断) |
| 按文本找 | 结构会变但文字不变的锚点(标题、按钮文字) |
| 正则 | 提取 URL、数字、日期等模式串 |
| 相似元素 find_similar | 发现同构列表项(拿到一个 → 找一批) |
提取字段后处理
::text/::attr(href)伪元素取文本与属性;批量取.getall(),单个取.get()。- 文本清洗:去空白/换行噪音、统一编码。
详细配方见 references/02-定位提取法.md。
第 4 步 · 记忆沉淀(自适应:让抓取改版不死)
问题:写死的选择器在网站改版后失效,长期任务需要反复人工修。
两阶段机制(先学习、后重定位):
1. 学习(Save):元素存在时用 auto_save=True 选一次 → 框架保存该元素的「唯一属性指纹」(自身 tag/文本/属性/兄弟/路径 + 父级 tag/属性/文本)。
2. 重定位(Match):某天同一选择器取不到了 → 同一选择器加 adaptive=True → 按相似度评分自动找回目标,无需改代码。
# 第一次抓取(元素在,学习)
items = page.css('.product', auto_save=True)
# ……数周后网站改版……
items = page.css('.product', adaptive=True) # 依然找得到
关键点:
- 指纹是多点组合而非单一标识——单点可失、多点相似不可伪造,这是抗改版的根本。
- 数据默认按 域名 + 标识符 隔离存 SQLite;标识符默认 = 选择器本身,也可手动指定。
- 网站换域名时用 adaptive_domain 告诉它「还是同一站」,沿用旧记忆。
- 任何方式选中的元素都可用手动三件套记忆:save(元素, 标识) → retrieve(标识) → relocate(指纹, selector_type=True)。
- 注意:auto_save 只记第一个命中元素。
改版后排查顺序:① retrieve(标识) 看记忆还在不在 → ② 换更具体选择器重学 → ③ 手动保存父级上下文。
详细配方见 references/03-自适应记忆.md。
第 5 步 · 清洗导出
| 目标 | 手段 |
|---|---|
| 结构化数据 | 字典列表 → JSON / JSONL / CSV / XML |
| 喂给 AI / 做资料库 | 页面转干净 Markdown(先去脚本/样式/隐藏文本/注入内容,再转) |
| 存档原文 | HTML / 纯文本落盘 |
AI 读取纪律:把网页内容交给 LLM 前,先「收窄 + 剥离」——只留目标区域、剔除隐藏文本与注入内容。省 token、防提示注入劫持。
文件落盘:数据文件放工作目录或任务输出目录;临时抓取文件不乱放个人目录。
核心纪律 ✅ / ❌
| 纪律 | |
|---|---|
| ✅ | 先试最低档抓取;拿不到升档,不急着改选择器 |
| ✅ | 选择器写语义与文本锚点,不写 nth-child 坐标链 |
| ✅ | 长期任务第一次抓就 auto_save,给未来留记忆 |
| ✅ | 会话复用 Cookie/连接;浏览器不复用不开 |
| ✅ | 速率克制 + 429/403 立即退让 |
| ✅ | 交 AI 前清洗页面(去注入内容) |
| ❌ | 不抓登录墙/付费墙/需授权内容,不绕访问控制 |
| ❌ | 不暴力重试、不无限并发打单站 |
| ❌ | 不采集个人隐私数据 |
| ❌ | 不整篇搬运抓取内容做创作素材(引用+重写) |
环境说明(双路径)
- 路径 A(有 scrapling 环境):本机已验证 venv
C:\Users\刘春萍\.workbuddy\binaries\python\envs\default装有 scrapling 0.4.15(解析层可用:Selector + adaptive + 五取法,本地离线可测)。 - 需要 fetchers/浏览器时:
pip install "scrapling[fetchers]"+scrapling install(下载浏览器),或直接docker pull pyd4vinci/scrapling(含全部浏览器)。 - 路径 B(无 scrapling):用 requests 抓 HTML + 标准库(html.parser/lxml/re)做同等流程——升级阶梯与纪律不变,只是解析工具换成手写。自适应记忆退化为「选择器冗余策略」:同时存多套选择器(语义 class + 文本锚点 + 结构路径),改版后按优先级逐个尝试。
版本记录
| 版本 | 日期 | 变更 | 来源 |
|---|---|---|---|
| 1.0.0 | 2026-09-02 | 初版:学习开源框架 Scrapling 沉淀的自适应网页采集方法论(升级阶梯/意图化选择器/自适应记忆/合规速率) | 学习 D4Vinci/Scrapling + 官方文档 + 本地 0.4.15 真机验证 |