跳转至

解析层开关

类型:wiki(知识沉淀) 描述:scraper.ts 把"反爬解码 / 黑名单 / 噪音过滤 / 手机层级 / 社媒过滤"全部剥离为独立可控开关 最后更新:2026-05-26(v0.10.14) 相关源码src/utils/scraper.tssrc/utils/scraper-executor.ts 相关 wikisettings-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 种写法混用)