一个运营了三年的内容网站,少说也有几千篇文章。如果一直没有做过违规内容扫描,这些文章里有没有混着广告法极限词?有没有不经意留下的涉政敏感词?有没有被攻击者注入的暗链和博彩页面?有没有用户评论里夹带的违法违规信息?光靠人工一篇一篇翻不现实,但放任不管随时可能被网信办通报、被搜索引擎降权、甚至被关停服务器。有没有一个工具能把几千页面的违规风险一次性扫出来,把涉黄涉政涉暴恐广告暗链这些风险项分类标记清楚,让你知道哪些页面必须立刻处理?
网站违规内容扫描,要查的五类风险:
色情低俗 涉黄图片、露骨文字、低俗擦边内容,一票否决,搜索引擎和监管部门零容忍。
涉政暴恐 政治敏感词、暴恐相关内容、分裂主义言论,触发即通报,没有申诉空间。
广告违规 广告法极限词(最好/第一/国家级)、虚假宣传、违禁行业广告,可能引来工商处罚。
暗链挂马 被黑客注入的隐藏链接、博彩色情外链、挖矿脚本,网站被黑了你都不知道。
用户违规 评论区的垃圾广告、违法违规信息、人身攻击、恶意引流链接。
六款云厂商内容审核API,基础能力差不多但各有侧重
接入内容审核API是目前最主流的方案——不需要自己训练模型,不需要维护敏感词库,调接口就能用。2026年国内市场基本是网易易盾、腾讯云TMS、阿里云内容安全、百度AI审核四强格局:
| 平台 | 识别类型数 | 变体识别 | 响应速度 | 默认QPS | 价格(万条) | 独特优势 |
|---|---|---|---|---|---|---|
| 腾讯云TMS | 7类(含灌水) | ★★★★★ 拼音/谐音/拆字/符号/表情 | <50ms | 1000 | 10元起 | AI生成内容独立检测、26项金融审校 |
| 阿里云内容安全 | 5类 | ★★★ 基础变体 | <100ms | 500 | 约15元 | 70+语言支持、电商场景深度优化 |
| 百度AI审核 | 6类 | ★★★★ 拼音/谐音/拆字/形近字 | <100ms | 500 | 约15元 | 40万+敏感人物库、自定义黑白名单 |
| 网易易盾 | 多类 | ★★★★ 丰富的变体识别 | <100ms | 按需 | 按量报价 | 市场占有率最高、自动化拦截率>95% |
| 知道创宇ScanA | 文本+图片+外链 | ★★★★ 机审+人审双重 | 按需 | 按需 | 按需报价 | 百万级敏感词库、支持离线检测、政企级 |
| 观安信息 | 全模态 | ★★★★ 大数据分析驱动 | 按需 | 按需 | 按需报价 | 自研安全防护+大数据分析,政企客户 |
从表格能看出,腾讯云TMS在变体识别和性价比上目前领先——7类识别类型、拼音谐音拆字符号表情全覆盖、响应不到50毫秒、10元/万条的价格在四家里最低。但如果你做的是多语言网站(比如外贸站群),阿里云的70+语言支持是独有优势。如果你的内容涉及大量名人名字和敏感人物(比如新闻媒体站),百度40万+敏感人物库更对口。网易易盾在市场份额和实战效果上最受认可,但价格不透明需要商务沟通。
把全站几万篇文章送进审核API,Python脚本一次性批量扫描
审核API默认是逐条调用的,但你的需求是"把全站内容扫一遍"。这就需要写一个批量扫描脚本,从数据库拉出所有文章,逐条送审,把违规内容标记出来。以腾讯云TMS为例:
import pymysqlimport jsonfrom tencentcloud.common import credentialfrom tencentcloud.tms.v20201229 import tms_client, modelsfrom tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException# 初始化腾讯云TMS客户端cred = credential.Credential("你的SecretId", "你的SecretKey")client = tms_client.TmsClient(cred, "ap-guangzhou")def check_text_risk(text, content_id):"""调用TMS检测文本违规,返回风险等级和详情"""if len(text) < 10:return "safe", "文本过短,跳过"try:req = models.TextModerationRequest()req.Content = text[:10000] # 单次最多10000字符resp = client.TextModeration(req)result = json.loads(resp.to_json_string())# Suggestion: Pass/Block/Reviewsuggestion = result.get("Suggestion", "Pass")label = result.get("Label", "")keywords = result.get("Keywords", [])return suggestion, f"{label}: {keywords}"except Exception as e:return "error", str(e)# 批量扫描WordPress文章conn = pymysql.connect(host="localhost", user="root", password="xxx", database="wp_site")cursor = conn.cursor()# 先创建一个扫描结果表cursor.execute("""CREATE TABLE IF NOT EXISTS wp_content_scan_results (id INT AUTO_INCREMENT PRIMARY KEY,post_id BIGINT,post_title VARCHAR(500),risk_level VARCHAR(20),risk_detail TEXT,scan_time DATETIME DEFAULT CURRENT_TIMESTAMP,INDEX idx_post_id (post_id),INDEX idx_risk_level (risk_level))""")# 分批扫描,每次100条,控制API调用频率cursor.execute("SELECT ID, post_title, post_content FROM wp_posts WHERE post_status='publish' AND post_type='post'")posts = cursor.fetchall()batch_size = 100for i in range(0, len(posts), batch_size):batch = posts[i:i+batch_size]for post_id, title, content in batch:# 扫描正文suggestion, detail = check_text_risk(content, f"post_{post_id}")# 记录结果cursor.execute("INSERT INTO wp_content_scan_results (post_id, post_title, risk_level, risk_detail) VALUES (%s, %s, %s, %s)",(post_id, title, suggestion, detail))if suggestion in ("Block", "Review"):print(f"⚠️ 文章[{post_id}]《{title[:30]}...》→ {suggestion}: {detail}")conn.commit()print(f"进度: {min(i+batch_size, len(posts))}/{len(posts)}")print(f"扫描完成,结果已写入wp_content_scan_results表")跑完脚本之后,wp_content_scan_results表里就有一份完整的扫描报告,按risk_level筛选就能看到所有需要处理的问题文章。Block级别的必须立刻下架或修改,Review级别的人工复核一遍。
控制成本的关键:分段扫描和增量扫描。如果网站有5万篇文章,全部送审按10元/万条算就是50元。但很多文章是多年前发布的,如果从来没有违规投诉,风险其实很低。更经济的做法是:第一轮全量扫描,之后只扫描新增和修改的文章(用WordPress的post_modified字段筛选),每周增量扫描一次,成本降到原来的5%以下。

不想花钱调API,自建敏感词库加爬虫也能扫
如果预算紧张或者网站内容量不大(几千篇以内),自建扫描系统是可行的。核心组件三个:
1. 敏感词库。GitHub上有不少开源敏感词库项目,比如sensitive-words、textfilter、wordscheck等,覆盖政治敏感词、色情词汇、暴恐词汇、广告法极限词。使用时要注意:开源词库质量参差不齐,建议下载后人工筛一遍,去掉误判率高的词条。
2. DFA算法(确定有限状态自动机)。比正则表达式快几十倍,适合大规模文本扫描。原理是把所有敏感词构建成一棵前缀树,扫描文本时一次遍历就能匹配所有词条:

class DFASensitiveFilter:"""基于DFA的敏感词过滤器"""def __init__(self):self.root = {}self.end_flag = "is_end"def add_word(self, word):"""将敏感词加入前缀树"""node = self.rootfor char in word:node = node.setdefault(char, {})node[self.end_flag] = Truedef build_from_file(self, filepath):"""从文件批量导入敏感词"""with open(filepath, 'r', encoding='utf-8') as f:for line in f:word = line.strip()if word:self.add_word(word)def scan(self, text):"""扫描文本,返回所有命中的敏感词及其位置"""results = []length = len(text)i = 0while i < length:node = self.rootj = imatched = ""while j < length and text[j] in node:node = node[text[j]]matched += text[j]j += 1if self.end_flag in node:results.append({"word": matched,"start": i,"end": j})i += 1return results# 使用示例filter = DFASensitiveFilter()filter.build_from_file("sensitive_words.txt")text = "这篇文章内容包含一些敏感词测试"hits = filter.scan(text)for hit in hits:print(f"发现敏感词: {hit['word']}, 位置: {hit['start']}-{hit['end']}")3. 全站爬虫。用Python的requests+BeautifulSoup爬取网站所有页面,配合DFA扫描器逐页检测:
import requestsfrom bs4 import BeautifulSoupfrom urllib.parse import urljoin, urlparsedef crawl_and_scan(start_url, sensitive_filter, max_pages=5000):"""爬取网站并逐页扫描违规内容"""visited = set()to_visit = [start_url]domain = urlparse(start_url).netlocfindings = []while to_visit and len(visited) < max_pages:url = to_visit.pop(0)if url in visited:continuetry:resp = requests.get(url, timeout=10, headers={"User-Agent": "ContentScanner/1.0"})if resp.status_code != 200:visited.add(url)continuesoup = BeautifulSoup(resp.text, 'html.parser')# 提取正文文本for script in soup(["script", "style", "nav", "footer", "header"]):script.decompose()text = soup.get_text(separator=" ", strip=True)# 扫描违规内容hits = sensitive_filter.scan(text)if hits:findings.append({"url": url,"hits": hits,"snippet": text[:200] + "..."})print(f"⚠️ {url}: 发现{len(hits)}处敏感词")visited.add(url)# 提取同域名内链继续爬取for link in soup.find_all('a', href=True):full_url = urljoin(url, link['href'])if urlparse(full_url).netloc == domain and full_url not in visited:to_visit.append(full_url)except Exception as e:print(f"✗ {url}: {e}")visited.add(url)return findings# 启动扫描filter = DFASensitiveFilter()filter.build_from_file("sensitive_words.txt")results = crawl_and_scan("https://你的网站.com", filter)print(f"扫描完成,共{len(results)}个页面存在违规内容")自建方案的致命短板:识别不了变体和上下文。DFA匹配能抓到"赌博"两个字,但抓不到"贝者"(拆字)和"DU博"(拼音缩写)。能抓到"最好",但分不清"这个产品是行业里最好的"和"这个最好用的方法"。云厂商的审核API之所以收费,核心价值在于NLP语义理解和变体识别——不是简单地匹配字符串,而是理解这句话在上下文里到底有没有违规意图。
暗链和外链扫描,单独的工具做专项检测
违规内容审核API主要检测文本内容,但对于暗链(隐藏在CSS中的博彩色情链接、display:none的广告代码)和恶意外链,需要专门的扫描工具:
| 工具 | 检测能力 | 部署方式 | 价格 | 适合谁 |
|---|---|---|---|---|
| 知道创宇ScanA暗链检测 | 暗链/黑链/隐藏iframe/挖矿脚本 | SaaS+离线 | 按需报价 | 政企网站,安全合规要求高 |
| CAIH内容安全监测平台 | 敏感词+篡改+暗链+挂马+可用性 | SaaS | 按需报价 | 需要一站式监测的企业网站 |
| HarmfulMonitor(开源) | 网站+微博+公众号+抖音快手敏感词监测 | 自建部署 | 免费 | 技术团队,想自建全平台监测 |
| Python脚本+正则 | 自定义正则匹配隐藏链接、异常外链 | 自建 | 免费 | 少量页面,自定义检测逻辑 |
暗链检测有个特殊难点:攻击者越来越狡猾,把链接藏在CSS伪元素里、用JavaScript动态渲染、甚至只在搜索引擎蜘蛛访问时才显示。用简单的curl抓取HTML是看不到这些内容的,需要模拟真实浏览器渲染(用Selenium或Playwright)才能抓到动态注入的暗链。这也是为什么专业工具比自建脚本贵的原因之一。
不同网站规模,选不同方案
| 网站规模 | 推荐方案 | 月费 | 理由 |
|---|---|---|---|
| 几百篇文章的小站 | 自建DFA敏感词扫描 + Python爬虫 | ¥0 | 量小不需要付费API,DFA扫描几分钟跑完 |
| 几千到几万篇文章 | 腾讯云TMS批量扫描 + DFA做预筛选 | ¥50-200/次全量 | DFA快速筛掉明显安全的,API只审疑似内容,省钱 |
| 10万+篇或UGC平台 | 审核API + 发布前实时拦截 + 定时全量复查 | ¥500+/月 | 量大且持续增长,必须走API+实时+定时的三层体系 |
| 政企/金融/教育网站 | 知道创宇ScanA或观安信息全套方案 | 商务报价 | 合规要求最高,需要离线部署+人工审核兜底 |
违规内容扫描这件事,和备份一样,属于"平时想不起来,出事就来不及"的工作。一个运营几年的网站,不扫不知道,一扫大概率会有问题——可能是三年前某篇文章里写了"最好",可能是某个被遗忘的测试页面上有涉政内容,可能是半年前被挂的暗链到现在还没发现。花一个下午跑一遍全量扫描,把问题页面列出来,该改的改该删的删,比等着被通报被降权被动应对,代价小得多。
