解析层开关¶
类型:wiki(知识沉淀) 描述:scraper.ts 把"反爬解码 / 黑名单 / 噪音过滤 / 手机层级 / 社媒过滤"全部剥离为独立可控开关 最后更新:2026-05-26(v0.10.14) 相关源码:
src/utils/scraper.ts、src/utils/scraper-executor.ts相关 wiki:settings-field-semantics.md
是什么¶
extractDataFromHtml() 之前把 7 类规则写死打包在函数里:
- Cloudflare 解码 / 邮箱黑名单 / 邮箱噪音 / 随机 ID 排除
- 手机 3 层级(tel: / 上下文 / 自由文本)
- 手机黑名单 / 社媒黑名单
v0.10.13 起全部拆为独立 boolean + 内置数组 export 出来 + 用户可追加。
为什么这么设计¶
原症状¶
用户改不了: - 想关 Cloudflare 解码?没接口 - 内置 5 个示例邮箱屏蔽不够?只能改源码 - 手机 Tier 3 误抓订单号?没法只关 Tier 3 留 1/2
用户洞察(v0.10.13 启动原因)¶
"反爬解码 黑名单 噪音过滤等 是不是应该是单独的开启或者设置?同样手机和社媒的是不是也应该是剥离细化"
关键代码¶
scraper.ts 导出¶
export const BUILTIN_EMAIL_BLACKLIST = [...]; // 5 项示例邮箱
export const BUILTIN_EMAIL_NOISE = [...]; // 15 项噪音模式
export const BUILTIN_PHONE_BLACKLIST = [...]; // 7 项测试号
export const BUILTIN_SOCIAL_BLACKLIST = [...]; // 18 项 handle 名
export interface ExtractOpts {
// 老字段
emailRegex?: string;
phoneRegex?: string;
customSocials?: string;
extractPhones?: boolean;
// v0.10.13 新增 — 解析层独立开关
cloudflareDecode?: boolean; // 默认 true
emailBlacklistOn?: boolean; // 默认 true
emailBlacklistCustom?: string;
emailNoiseOn?: boolean;
emailNoiseCustom?: string;
randomIdFilter?: boolean;
phoneTier1?: boolean; // tel: 链接
phoneTier2?: boolean; // 上下文关键词
phoneTier3?: boolean; // 自由文本
phoneBlacklistCustom?: string;
socialBlacklistOn?: boolean;
socialBlacklistCustom?: string;
}
合并机制¶
function mergeList(builtin: string[], custom?: string): string[] {
if (!custom?.trim()) return builtin;
const extra = custom.split(/[\n,,]/)...filter(Boolean);
return Array.from(new Set([...builtin, ...extra]));
}
v0.10.14 邮箱黑名单 3 种写法¶
function isEmailBlacklisted(email: string, list: string[]): boolean {
// 1. 完整邮箱 noreply@acme.com → 精确匹配
// 2. @域名 @gmail.com → 整域名屏蔽(含子域)
// 3. 纯域名 gmail.com → 同上
}
手机 3 层级(重点)¶
| Tier | 来源 | 置信度 | 易噪 | 例子 |
|---|---|---|---|---|
| Tier 1 | <a href="tel:..."> |
⭐⭐⭐ | 几乎无 | 网站老板主动声明 |
| Tier 2 | "Phone: / Call: / 电话:" 后跟数字 | ⭐⭐ | 低 | 联系页常见 |
| Tier 3 | 自由文本带分隔符 | ⭐ | 高 | "+1 234-567-8901" 也可能是订单号 / 年份 |
用户自定义 phoneRegex 时¶
⚠️ 完全覆盖3 层级 — Tier 1/2/3 开关全部失效。这是设计选择(避免双重提取冲突)。
UI helper 必须写明这点。
UI 暴露方式¶
每个开关在「高级·网站抓取 / 解析规则」子区下:
📧 邮箱
正则 + [演示]
[Switch] Cloudflare data-cfemail 解码
[Switch] 邮箱黑名单 + [查看内置 5 项] + [追加文本框]
[Switch] 噪音过滤 + [查看内置 15 项] + [追加文本框]
[Switch] 屏蔽超长随机 ID
📞 手机
正则 + [演示]
[Switch] Tier 1: tel: 链接
[Switch] Tier 2: 上下文关键词
[Switch] Tier 3: 自由文本
[查看内置测试号 7 项] + [追加文本框]
📱 社媒
自定义社媒 textarea
[Switch] 社媒 handle 黑名单 + [查看内置 18 项] + [追加]
易踩坑¶
⚠️ 坑 1:默认值要保持老行为¶
所有新 boolean 字段默认 true,custom 字符串默认 ""。这样老用户升级无感。
⚠️ 坑 2:custom 不替换 builtin,是 merge¶
填 emailBlacklistCustom = "@spam.com" 不会覆盖内置 5 项,是追加。要清空内置 → 改 BUILTIN 数组(需改源码)。
⚠️ 坑 3:mergeList 用 Set 去重 → 大小写归一化¶
mergeList 内部 toLowerCase(),传入大写自动归一。
修改这块时要 / 不要做什么¶
- ✅ 加新内置项 → 直接改
BUILTIN_*数组,UI「查看内置」自动同步 - ✅ 加新开关 → ExtractOpts 加 optional 字段 + storage-data 加 + scraper-executor 透传 + UI 加 Switch
- ❌ 不要删
BUILTIN_*项(破坏老用户体验) - ❌ 不要把 custom 改成"完全替换 builtin"(破坏直觉)
版本里程碑¶
| 版本 | 事件 |
|---|---|
| v0.10.11 | 手机 3 层级提取最初实现(全开,无独立开关) |
| v0.10.13 | 7 类规则全部剥离为独立开关 + custom |
| v0.10.14 | 邮箱黑名单支持域名级(3 种写法混用) |