内容安全API、开源词库自建、Python全站爬虫扫描、在线检测工具,四种批量查敏感词的方式花钱和效果差了10倍
2024年有个做本地生活信息站的站长,网站运营了三年,收录80多万页,流量一直不错。某天突然收到IDC的邮件,说服务器被关停,理由是"内容涉及违规信息"。他查了两天才找到问题:两年前一个用户发帖时用了某个谐音政治词汇,帖子一直沉在列表第47页,他自己从没翻到过,但爬虫翻到了。
这不是个例。做UGC站点、论坛、社区、甚至只是开了文章评论功能,只要你站上有用户能输入文字的地方,就存在敏感内容风险。一条漏网的政治敏感词,轻则被约谈整改,重则域名被墙、备案注销、服务器直接拔线。而且事后排查的成本高到离谱——80万条内容人工逐条过,得雇几个人干几个月。
敏感词检测不是什么新鲜话题,但大部分人的认知停留在"加个关键词过滤就行了"。实际上,谐音变体、拼音替代、拆字组合、emoji替代、多语言混合,这些绕过滤手法每年都在进化。一个站还好说,如果手里有十几个、几十个站点,逐站逐页排查根本不现实。
网站敏感词批量检测的四种路线,适用场景完全不同
| 1 | 商业API接入:百度、网易易盾、腾讯云、阿里云,按月付费或按量计费,自带海量词库和AI语义识别,适合预算充足的正式项目 |
| 2 | 开源词库+DFA/AC自动机自建:GitHub上找词库,自己写过滤引擎,一次部署永久免费,数据不出服务器,适合对隐私和成本敏感的场景 |
| 3 | Python爬虫+全站扫描脚本:爬取站内所有页面URL,逐页抓取文本,再对接词库检测,适合已有内容的存量排查 |
| 4 | 在线检测工具:粘贴内容即时出结果,免费或低价,适合单篇内容发布前的快速过审 |
一、商业API方案:贵但省心,关键是"语义识别"这个能力
先说花钱的路线。商业内容安全API不是简单的关键词匹配,它们底层是NLP语义模型。举个例子,"今天天气真好"如果只是一个关键词匹配引擎,永远不会触发;但如果结合上下文,前面有特定指向性内容,语义模型可能会标记风险。这种能力是自建词库永远做不到的。

目前国内市场主流的四家:百度AI内容审核、网易易盾、腾讯云天御、阿里云内容安全。它们都支持文本、图片、音频、视频四模态检测,但对于站长场景来说,文本检测是最核心的需求。
| 服务商 | 文本检测维度 | 谐音/变体识别 | 计费方式 | 免费额度 |
|---|---|---|---|---|
| 百度AI | 涉政、色情、暴恐、违禁、广告、辱骂 | 支持拼音、谐音、拆字、形近字 | 按调用量,约2-5元/千条 | 新用户5万条/月 |
| 网易易盾 | 涉政、色情、暴恐、广告、谩骂、灌水 | 支持变体识别,有专项涉政人物库 | 按量阶梯计价,量越大单价越低 | 新用户体验额度 |
| 腾讯云天御 | 涉政、色情、暴恐、违法、广告 | 支持,有专项政治人物库 | 按调用量,约1.5-4元/千条 | 每月免费额度 |
| 阿里云内容安全 | 涉政、色情、暴恐、违禁、广告、辱骂、灌水 | 支持变形词、同音词、拼音 | 按调用量,约2-5元/千条 | 新用户额度 |
有一点要特别注意:这些API在涉政检测这个维度上的能力差异比色情、广告检测大得多。涉政涉及的人物库、事件库、政策表述规范,各家维护的频率和覆盖范围不一样。百度因为有搜索业务,其涉政词库的更新速度和覆盖面可能是四家里面最强的;网易易盾在游戏和社交领域积累很深,变体识别能力不错。
一个重要但容易被忽略的细节:这些商业API默认是按"条"计费的——每调用一次接口算一条。如果你全站有1万篇文章,每篇文章500字,直接全文传入,那就是1万次调用,成本可控。但如果是80万条用户评论,每条30字,也是80万次调用,这时候费用就上去了。所以在评估方案之前,先算一下自己站上有多少条独立内容需要检测。
二、开源词库自建:0元起步,但"词库质量"比算法重要10倍
如果你的站点数量多、内容量大,商业API的费用会是一个持续消耗。这时候自建敏感词过滤系统就值得考虑了。自建的核心有两个:词库和匹配算法。
先说算法。目前业界主流就两种:DFA(确定有限状态自动机)和AC自动机(Aho-Corasick)。两者的共同点是:无论词库有多大(十万、百万级),匹配速度基本不受影响,时间复杂度只和待检测文本长度有关。区别在于:AC自动机是DFA的升级版,支持一次扫描同时匹配多个模式串,理论上在大规模多词匹配场景下效率更高。但实际工程中,DFA已经足够用了,实现也更简单。
GitHub上有一个很火的开源项目 sensitive-word(houbb/sensitive-word),基于DFA实现,支持中文繁体简体、拼音、大小写、全角半角等忽略匹配,还支持白名单排除。直接引入依赖就能用,不需要从零写算法。
算法好解决,真正拉开差距的是词库。网上能搜到的公开敏感词库质量参差不齐。有的词库三年前的,大量新词汇没有覆盖;有的词库把"公安""政府""法院"这种正常的政务词汇也列为敏感词,导致误杀率极高。自建词库最靠谱的做法是:拿多个公开词库做并集,然后人工或半自动地做白名单清洗。
# Java项目直接引用<dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version>0.18.0</version></dependency>// 使用示例SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance().ignoreCase(true).ignoreWidth(true).ignoreNumStyle(true).ignoreChineseStyle(true).init();List<String> result = sensitiveWordBs.findAll("待检测文本");自建方案最大的优势是数据不出服务器。如果你的站点内容比较敏感(比如涉及行业监管、金融合规),把全文内容发给第三方API本身就有合规风险。本地部署可以彻底规避这个问题。
自建的优势
零持续成本,数据不出服务器,词库完全可控,可以按业务需求定制白名单和黑名单规则
自建的短板
无法做语义理解,谐音变体靠穷举词库覆盖不完,词库需要持续维护更新,不擅长上下文判断
三、Python爬虫+全站扫描:存量内容排查的"查账"方案
商业API和自建词库解决的是"怎么判断一段文字有没有敏感词"的问题。但如果你的站已经运行了几年,有几万、几十万条存量内容需要排查,还要解决另一个问题:怎么把全站所有文字内容扒出来。
这就需要一个全站爬虫扫描脚本。基本思路是:从首页出发,递归爬取站内所有页面URL → 去重 → 逐个请求页面 → 提取正文文本(去掉HTML标签、JS、CSS) → 分段送入敏感词检测引擎 → 记录命中位置和原文。
Python生态里做这件事很方便:requests发请求,BeautifulSoup解析HTML提取文字,Scrapy做大规模爬取,aho-corasick库做多模式匹配。如果词库量大,可以把词库加载到内存构建AC自动机,然后对每篇页面文本做一次扫描即可。
import requestsfrom bs4 import BeautifulSoupfrom urllib.parse import urljoin, urlparseimport ahocorasick# 1. 构建AC自动机(词库需预先加载)automaton = ahocorasick.Automaton()for word in sensitive_words:automaton.add_word(word, word)automaton.make_automaton()# 2. 爬取页面文本def get_page_text(url):resp = requests.get(url, timeout=10)soup = BeautifulSoup(resp.text, 'html.parser')# 去掉script和style标签for tag in soup(['script', 'style', 'nav', 'footer']):tag.decompose()return soup.get_text(separator='\n')# 3. 检测def check_page(url):text = get_page_text(url)hits = []for end_idx, word in automaton.iter(text):start = end_idx - len(word) + 1hits.append({'word': word, 'position': start,'context': text[max(0,start-20):end_idx+20]})return hits# 4. 生成报告for page_url in all_pages:result = check_page(page_url)if result:print(f"[命中] {page_url} - {len(result)}处")for h in result:print(f" 词: {h['word']} | 上下文: ...{h['context']}...")上面是简化版的核心逻辑。实际生产环境中还需要加很多东西:请求频率控制(别把服务器打趴了)、URL去重和布隆过滤器(避免无限爬取)、增量扫描(只扫描新增或修改过的页面)、结果持久化(存数据库方便回溯和对比)。
爬虫扫描的两个常见坑:
1)动态渲染页面(SPA、React/Vue前端)用requests直接抓是空的,需要换成Selenium或Playwright做浏览器渲染;2)很多网站文章详情页的正文区之外(侧边栏、推荐列表、评论区)也会被爬下来,如果这些区域有敏感词但并非网站自身内容,要做好区域过滤,否则误报会把你淹没。
四、在线检测工具:适合"发布前最后一关",不适合"全站普查"
第四种路线最简单:打开网页,粘贴内容,点检测,看结果。适合的场景是:一篇文章写好了,发布之前最后过一遍,确保不踩雷。
目前比较好用的在线检测工具有几个:Taboo敏感词检查(tabooscan.cn)面向内容创作者,可以选发布平台(公众号、抖音、小红书等),不同平台的敏感词标准不一样;测罗敏感词检测(celuo.com)基于DFA算法,纯免费,支持批量粘贴;98测敏感词(98ce.com)也是免费的在线工具,词库比较新。
| 工具 | 检测维度 | 批量能力 | 费用 | 适用场景 |
|---|---|---|---|---|
| Taboo | 按平台分类(公众号/抖音/小红书/微博),覆盖涉政、色情、广告等 | 单篇粘贴,不支持全站扫描 | 免费+付费 | 内容创作者发布前检查 |
| 测罗 | 通用敏感词、违禁词、广告词 | 支持较长文本粘贴 | 免费 | 单篇文章快速筛查 |
| 98测 | 敏感词、违禁词、低俗、暴恐 | 单次粘贴 | 免费 | 快速过一遍 |
| UU在线工具 | 通用违禁词、敏感词 | 单次粘贴 | 免费 | 偶尔使用 |
这些在线工具的共同问题是不支持全站批量扫描。你不可能手动把几万篇文章一篇一篇粘贴进去。它们真正的价值在于"最后一关"——内容生产完成后,花30秒过一下,总比发布后被平台封了强。但如果要排查存量内容,还是得回到前面的三种方案。
在线工具的正确用法:把它当作发布工作流的一部分——编辑写完文章 → 粘贴到Taboo跑一遍 → 标记问题词 → 修改 → 再跑一遍 → 发布。这样既不会增加太多时间成本,又能有效拦截大部分风险。但不适合做"全站体检",那是另外三种方案的活。
五、四种方案怎么选?看站点规模、预算和内容类型
四种方案没有绝对的好坏,只有适不适合你当前的场景。我把决策逻辑整理成了下面这个表:

| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 1个站、几百篇文章、少量评论 | Python全站扫描 + 自建词库 | 内容量不大,爬一遍很快,成本为零 |
| 10+个站、数十万条内容 | 商业API批量调用 | 规模大了人工维护词库成本飙升,API反而更划算 |
| 对隐私要求极高(金融/医疗/政务类) | 自建词库 + 本地DFA引擎 | 数据不出内网,规避合规风险 |
| 日常内容发布,实时拦截 | 商业API实时接口 + 在线工具 | API做提交时检测,工具做发布前人工确认 |
| 预算紧张、站点数量不多 | 自建词库 + 免费在线工具兜底 | 0元方案 + 发布前人工过一遍,性价比最高 |
还有一层很多人忽略的考量:检测不等于防护。上面四种方案都是"检测"——找出已经存在的问题。但如果你运营的是UGC站点(用户发帖、评论),检测只能事后补救,真正需要的是在用户提交内容的瞬间就拦截。这就需要把敏感词检测引擎嵌入到发布流程中——用户提交 → 后端先过一遍DFA引擎 → 命中则拒绝提交或进入人工审核队列 → 没命中才放行。
WordPress站可以用插件实现(有敏感词过滤插件可以配置词库),自建系统就在后端加一个中间件。技术门槛不高,关键是把这个意识建立起来——不要让任何用户输入未经检测就入库。
六、站群场景的特殊挑战:不是"一个站的问题"而是"30个站同时查"
如果你只运营一两个站,上面这些方案直接用就行。但如果是站群模式——几十个域名、每个站几百到几千篇文章、内容来自AI生成或采集重组——检测的复杂度是指数级上升的。
站群场景的核心问题有三个:
第一,总量巨大。30个站 × 每站2000篇文章 = 6万篇,每篇平均800字,总检测文本量4800万字。如果用商业API按调用量计费,单次全量扫描的成本可能几千元。如果每周扫一次,一年下来是笔不小的开销。
第二,内容持续增长。不是一次性排查就完事了。AI每天批量生成新文章,每天都有新内容入库,检测不能停。
第三,管理复杂度。30个站各自独立,哪个站有问题、哪篇文章有问题、处理了没有,需要一个统一的管理视图,而不是对着30份Excel来回翻。
方案A:自建DFA引擎 + 定时全量扫描
词库加载到内存,对新增内容做增量扫描,每月一次全量复扫。成本几乎为零,但需要自己维护词库和扫描脚本。适合有技术能力的团队。
方案B:商业API + 多站统一调度
各站内容统一汇聚到检测队列,批量调用API,按量付费。省去了词库维护的心智负担,但持续成本较高。适合内容量中等、预算充足的团队。
方案C:混合策略
自建DFA做第一层粗筛(拦截90%的常见敏感词),API做第二层语义复核(拦截变体、谐音、上下文敏感)。两相结合,既控制成本又保证覆盖率。
方案D:系统化管理平台
用UC建站系统的多站统一管理能力,把敏感词检测作为内容发布流水线的一个环节。所有站点的新内容在入库前统一过检,检测结果汇总到一个看板里,哪个站、哪篇文章、命中什么词一目了然,不用在30个后台之间来回切换。
七、词库和算法的几个"你以为很简单其实不然"的问题
聊了这么多方案,最后还是回到根本:词库和匹配。有几个实际工程中的坑,踩过了才知道痛。
谐音和拆字比你想象的更难覆盖。一个敏感词"ABC",变体可能是"A比C"(拼音首字母)、"诶比西"(谐音)、"A丨3C"(拆字)、"🅰️🅱️🇨"(emoji国旗替代)。用穷举法去覆盖,词库会膨胀到不可维护。DFA和AC自动机对这种变体完全无能为力,这恰是商业API的NLP语义模型擅长的领域。
误杀和漏杀是跷跷板的两端。词库设得太宽(把"公安""政府""法院"都加进去),误杀率高,正常内容频繁触发,用户投诉,运营疲于处理;设得太窄,漏杀率高,真出了问题后果严重。这个平衡没有标准答案,只能根据业务场景逐步调优。
上下文判断是终极难点。"打倒"是一个敏感词,但"一拳打倒沙袋"是正常表述。关键词匹配只看字符串,不看语义。这种误报除了用NLP模型做上下文理解,没有太好的办法。实际工程中的折中方案是:关键词匹配标记为"疑似",人工复核确认。
词库过期问题
政策变动、新词汇出现、热点事件衍生出新的敏感表达方式。如果词库半年不更新,覆盖率会显著下降。商业API的优势在于服务商会持续维护更新,自建词库则需要有人专门盯。
多语言混合问题
中英混合、拼音和汉字混排、"f**k"和"法克"交替使用。如果你的站有英文内容或多语言用户,检测难度翻倍。大部分中文敏感词库不覆盖英文政治敏感词汇。
图片OCR检测盲区
很多违规内容是以图片形式出现的——敏感文字做成图片上传,纯文本检测完全扫不到。商业API一般有图片审核能力,但自建方案基本覆盖不到这块。
合规红线不是"有就删"那么简单
《网络安全法》要求网络运营者加强对用户发布信息的管理,发现违规内容要立即停止传输、消除、保存记录并报告。不是删了就完事,要留痕、要可追溯。
八、建一个可持续的检测流程,不是"查一次就忘了"
写这篇文章的初衷不是让你今天跑一遍扫描就完事了。敏感词检测是一个持续性工作,需要嵌入到站点的日常运营流程里。
一个可落地的流程大概长这样:
| 环节 | 做什么 | 用什么工具 |
|---|---|---|
| 内容入库前 | 新内容提交时实时过检,命中直接拦截或入人工审核队列 | 自建DFA引擎做第一层,商业API做第二层复核(如果预算允许) |
| 存量全量扫描 | 每月一次全站爬虫扫描,覆盖所有历史内容 | Python爬虫脚本 + DFA/AC自动机,生成扫描报告 |
| 发布前人工确认 | 重要内容(首页、专题页、活动页)发布前人工再过一遍 | Taboo或测罗等在线工具,快速过一遍 |
| 词库更新 | 每月从多个来源更新词库,清理过期词汇,补充新出现的敏感表达 | GitHub开源词库 + 行业监管动态关注 |
| 日志留痕 | 所有检测记录保存日志,包括检测时间、命中词、处理方式、处理人 | 数据库记录 + 定期备份,满足合规审计要求 |
如果你在用UC建站系统管理多个站点,这套流程可以整合到内容中台的发布流水线里。AI生成内容 → 自动过检 → 通过的直接入库,命中的标记出来人工处理。多站看板统一显示检测状态,哪个站有未处理的风险内容一目了然,不用一个站一个站登进去翻。
说到底,敏感词检测这件事做得好不会带来流量,做不好却可能让整个站归零。它不性感、不出彩、不涨排名,但它是所有内容运营的底线。四种方案里面,小站用自建词库+Python脚本跑存量就够,大站用商业API做持续防护,站群用混合策略+系统化管理。挑哪种不重要,重要的是别等到收到关停通知才开始想"我们站上到底有没有问题内容"。
