网站广告违禁词处理实战:Python扫描 + 宝塔防火墙过滤 + 词库管理

网站广告违禁词处理实战:Python扫描 + 宝塔防火墙过滤 + 词库管理

作者:红穆(QQ:1810216796)
首发:红穆笔记
GitHubhttps://github.com/1810216796(完整源码)


📌 背景

近期接到客户反馈,网站因页面中包含“第一”、“最佳”、“国家级”等广告法违禁词,被市场监管部门约谈并罚款。这些词汇散落在数百个页面中,人工排查耗时费力,且容易遗漏。为解决这一痛点,我设计了一套自动化扫描系统,利用 Python 爬虫递归扫描全站,配合精细化的违禁词库和白名单机制,每天自动全量扫描,并生成可视化监控面板,让违规内容无所遁形。

本文将从原理到部署,完整分享这套方案的所有代码与使用心得。


🧠 整体思路

  1. 词库构建:整理广告法明令禁止的绝对化用语、医疗功效词、金融承诺词等,同时加入上下文白名单,避免误判(如“世界级文化遗产”属于客观描述,不判违规)。
  2. 爬虫扫描:Python 脚本多线程并发爬取网站所有页面,提取可见文本,匹配违禁词,记录违规页面及上下文。
  3. 增量 & 全量:默认增量扫描(跳过已扫 URL),每日凌晨触发一次 --reset 全量扫描,确保所有新页面都被覆盖。
  4. 监控守护:Shell 脚本每分钟检查一次扫描进程,若卡死则自动重启,保证 7×24 小时稳定运行。
  5. 可视化面板:PHP 页面实时展示今日扫描页数、违规数、运行状态、各站点统计及违禁词聚合,方便运维人员随时查看。
  6. 宝塔防火墙联动:通过 rules.txt 词库,自动更新宝塔防火墙配置,实现访问时实时替换违禁词,从源头过滤。

🔧 环境准备

  • 服务器:CentOS / Ubuntu,2 核 4G 以上(内存建议 ≥2G)
  • Python 3.6+,需安装依赖:
    1. pip3 install requests beautifulsoup4 lxml
  • PHP 7.4+(用于监控面板)
  • Nginx / Apache(托管 PHP 面板)
  • 宝塔面板(如需使用防火墙替换功能)

📂 目录结构(GitHub 仓库)

  1. ad-violation-scanner/
  2. ├── sacn_site.py # 核心扫描脚本(支持增量/全量)
  3. ├── index.php # 实时监控面板
  4. ├── update_ads.py # 宝塔防火墙词库更新脚本
  5. ├── rules.txt # 替换词库(违禁词=替换词)
  6. ├── 宝塔定时任务.sh # 一键创建定时任务
  7. ├── scan_monitor.sh # 进程守护脚本(可选)
  8. ├── .user.ini # PHP open_basedir 限制
  9. └── README.md # 详细使用说明

源码已开源在 GitHub:https://github.com/1810216796


🐍 Python 扫描脚本(sacn_site.py)

核心原理

  • 使用 ThreadPoolExecutor 控制并发数(默认 20),平衡速度与服务器负载。
  • requests.Session 挂载重试机制,超时 45 秒,自动重试 2 次。
  • 对每个页面提取可见文本(剔除 script、style),通过正则匹配违禁词。
  • 上下文白名单过滤,避免“最高峰”、“全国第一(地理描述)”等误报。
  • 递归爬取同域名下的所有页面,过滤静态资源(css/js/图片等)和指定参数。
  • 实时保存已扫描 URL(scanned_urls.txt)和违规记录(violations_results.txt),支持中断恢复。
  • 扫描完成后生成 index.html 汇总报告。

关键参数

参数 说明
max_workers 并发线程数,默认 20,可调
session.timeout 请求超时时间(秒),设为 45
Retry(total=2) 重试次数,避免网络抖动
--reset 清空历史记录,全量扫描

违禁词库与白名单

  • 违禁词库:覆盖广告法绝对化用语、医疗功效、金融承诺、旅游行业违规词等 200+ 关键词。
  • 白名单:通过正则匹配上下文,如“世界级文化遗产”、“全国第一高峰”等客观描述不判违规。

🛡️ 进程守护与定时任务

scan_monitor.sh(可选)

每分钟检查一次扫描进程:

  • 若进程不存在,自动拉起增量扫描。
  • 若距离上次全量扫描超过 24 小时,自动执行 --reset 全量扫描。
  • 检测卡死(日志超时未更新且页面数不增长),自动重启。

crontab 配置

# 每分钟监控扫描进程(需要 scan_monitor.sh)
* * * * * /bin/bash /path/to/scan_monitor.sh >> /path/to/monitor_cron.log 2>&1
# 每日凌晨2点更新宝塔防火墙词库(替换规则)
0 2 * * * /usr/bin/python3 /path/to/update_ads.py >> /path/to/update_cron.log 2>&1


📊 PHP 实时监控面板(index.php)

功能

  • 实时数据:今日扫描页数(读取 scanned_urls.txt 行数)、今日违规数(统计 violations_results.txt 中 URL: 次数)。
  • 运行状态:根据 scan.log 最后修改时间判断进程是否存活。
  • 站点总览:展示各站点已扫描页数、违禁词类型数、问题页面数等。
  • 违禁词聚合:点击站点,展示该站点所有违禁词及出现次数,点击词条可查看详细上下文。
  • 自动刷新:每 1 秒通过 AJAX 更新数据,无需手动刷新。

部署

将 index.php 放在网站目录下,确保 PHP 可读写同目录下的 .txt 和 .log 文件。访问 http://your-domain/index.php 即可。


🔥 宝塔防火墙词库自动替换(核心亮点)

工作原理

宝塔防火墙的 body_character_string 字段支持对响应内容进行关键词替换。我们利用这一特性,将违禁词映射为合规词,用户访问时无感知替换,不影响正常浏览。

词库文件 rules.txt

每行一个替换规则,格式为 违禁词=替换词。例如:

  1. 最佳=较佳
  2. 第一=首先
  3. 国家级=知名
  4. 100%=全部
  5. 治疗=调理

更新脚本 update_ads.py

  • 备份:自动备份原配置文件到 /www/server/btwaf/backup/
  • 合并:读取 rules.txt,更新 body_character_string 字段(保留已有规则)。
  • 重载:自动执行 nginx -s reload 或 systemctl reload httpd,使配置生效。

定时执行

建议每天凌晨执行一次,保持词库最新。

0 2 * * * /usr/bin/python3 /path/to/update_ads.py >> /path/to/update_cron.log 2>&1

🚀 部署实战(完整步骤)

1. 克隆代码

git clone https://github.com/1810216796/ad-violation-scanner.git
cd ad-violation-scanner

2. 安装 Python 依赖

pip3 install requests beautifulsoup4 lxml

3. 配置扫描目标

编辑 sacn_site.py,修改 WEBSITES 列表:

WEBSITES = [
{"name": "客户网站", "urls": ["https://www.example.com/"]},
]

4. 配置替换词库

编辑 rules.txt,添加需要替换的违禁词及对应替换词。

5. 设置定时任务

chmod +x 宝塔定时任务.sh
./宝塔定时任务.sh
# 按提示选择 1(监控守护)或 2(防火墙更新)

6. 配置 Web 访问

将 index.php 和 .user.ini 放在网站根目录,确保目录权限正确。

7. 首次手动启动(可选)

nohup python3 sacn_site.py > scan.log 2>&1 &

监控脚本会在下一分钟接管。


📈 效果展示

  • 监控面板:实时显示“今日扫描”和“今日违规”数字,每秒更新。
  • 违规聚合:点击站点,所有违禁词一目了然,点击词条直接显示具体页面及上下文,方便定位修改。
  • 扫描报告:每次扫描结束自动生成 index.html,含站点、URL、违禁词详情,可存档备查。
  • 防火墙替换:访问页面时,违禁词被自动替换,用户体验无感知,合规性大幅提升。

⚠️ 注意事项

  1. 并发控制:根据服务器性能调整 max_workers,避免过高导致目标网站或本地资源耗尽。建议从 10 开始逐步上调。
  2. 词库维护:广告法不断更新,需定期维护 rules.txt 和 EXACT_FORBIDDEN_WORDS,避免漏判或误判。
  3. 超时与重试:网络环境不稳定时,可适当增加 timeout 和 total 重试次数,但避免无限重试。
  4. 宝塔版本update_ads.py 基于宝塔 7.x 开发,其他版本可能字段名不同,使用前请先备份验证。
  5. 权限安全:监控面板建议设置访问密码或仅限内网访问,避免敏感信息泄露。

🐛 常见问题

Q:扫描卡住不动怎么办?
A:监控脚本会自动重启(如果配置了 scan_monitor.sh),也可手动 pkill -f "python3 sacn_site.py" 终止进程。

Q:防火墙替换不生效?
A:检查 rules.txt 格式是否正确(= 前后无多余空格),确认宝塔防火墙已开启“响应内容替换”功能,并重载 Web 服务。

Q:PHP 面板显示“今日扫描 0”?
A:确保 scanned_urls.txt 存在且有内容,检查目录权限(PHP 需可读),并确认扫描脚本已运行。

Q:如何只增量扫描不重置?
A:直接执行 python3 sacn_site.py(不加 --reset)即可增量扫描,自动跳过已扫描 URL。


💬 结语

这套方案已在我多个客户项目中稳定运行,累计扫描页面数十万,有效帮助规避广告法风险。核心在于词库精准 + 上下文白名单 + 自动化监控 + 防火墙联动,既减少了人工成本,又提高了合规性。

如果你也有类似需求,欢迎参考本文实现。源码已开源在 GitHub,欢迎 Star、Fork、提 Issue。

作者:红穆
QQ:1810216796
GitHubhttps://github.com/1810216796


本文首发于红穆笔记,转载请注明出处。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容