红穆笔记
首页 语言笔记 网站广告违禁词处理实战:Python扫描 + 宝塔防火墙过滤 + 词库管理
语言笔记 PHP PHP与mysql

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

网站广告违禁词处理实战: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


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

微信赞赏

微信

支付宝赞赏

支付宝

✍️ 作者: 红穆

网站管理员 · 感谢阅读,更多精彩内容敬请关注

作者主页 查看主页 →

相关文章

PHP强制转换类型

PHP强制转换类型 语言笔记 PHP PHP采集 PHP与mysql

获取数据类型1.如果想查看某个表达式的值和类型,用var_dump()。 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype()。3.要查看某个类型,不要用 gettype(),而用is_type() 函数。字符串转换为数值当一个字符串被当作数字来求值时,根据以下规则来决定结果…
👁 232
php 特殊字符转义与还原

php 特殊字符转义与还原 语言笔记 PHP PHP采集 PHP与mysql

转义字符是一种特殊的字符常量。转义字符以反斜线""开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。转义字符的用处1:将普通字符转为特殊用途,如后退键,回车键等。2:用来将特殊意义的字符转换回它原来的意义。3:在数据写入数据库前,都会使用转义字符(函…
👁 179
PHP mysqli

PHP mysqli 语言笔记 PHP PHP采集 PHP与mysql

执行针对数据库的查询:删除数据库<?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect("localhost","root","123456","RUN…
👁 232
PHP中mysqli

PHP中mysqli 语言笔记 PHP PHP采集 PHP与mysql

mysqli_num_rows()这个函数只用于SELECT查询方法而mysqli_affected_rows()函数是记录上一个sql语句对整个数据库的影响从而把受影响的数据个数返回,这个主要用于INSERT(插入)、UPDATE(替换)、DELETE(删除)。
👁 145

推荐阅读

(自适应手机版)响应式容器类网站pbootcms模板 html5容器设备网站源码下载 0456

(自适应手机版)响应式容器类网站pbootcms模板 html5容器设备网站源码下载 0456 实用收藏 pbootcms模板

一款自适应手机端的居家用品纸盘纸杯与生活日用品生产PbootCMS网站模板。设计风格清新实用,适合展示纸制品、一次性餐具及日用百货产品。有助于日用品生产厂家在线上展示产品线,拓展批发渠道。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admin 解压密码:www.4s5…
👁 53
(独立手机版)单页落地页推广网站模板 - 带复制微信号 1016

(独立手机版)单页落地页推广网站模板 - 带复制微信号 1016 实用收藏 pbootcms模板

一款独立手机版单页落地页推广PbootCMS网站模板,带复制微信号功能。设计风格营销导向强,适合微信营销、社群推广等高转化率落地页。有助于企业快速搭建移动端推广页面,方便用户复制微信号进行转化。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admin 解压密码:www.…
👁 57
安防监控类网站模板 0419

安防监控类网站模板 0419 实用收藏 易优模板

一款针对安防监控类行业的eyoucms网站模板。设计风格科技安全,能够展示监控设备、安防系统、解决方案及工程案例。有助于安防科技企业在线上展示产品,吸引商业与政府客户。模板展示 安装说明 网站后台:/login.php 账号:admin 密码:admin 相关文章易优CMS安装常见问题总结易优CMS…
👁 59
响应式智能科技设备类网站模板 1014

响应式智能科技设备类网站模板 1014 实用收藏 易优模板

一款针对智能科技设备类企业的eyoucms响应式网站模板。设计风格科技前沿,能够展示智能设备产品、技术方案及应用场景。有助于智能科技企业在线上树立创新品牌形象,吸引投资与客户。模板展示 安装说明 网站后台:/login.php 账号:admin 密码:admin 相关文章易优CMS安装常见问题总结易…
👁 36
(自适应手机版)响应式简繁双语黑色轴承齿轮机械制造企业pbootcms模板 机械齿轮设备网站源码下载 0457

(自适应手机版)响应式简繁双语黑色轴承齿轮机械制造企业pbootcms模板 机械齿轮设备网站源码下载 0457 实用收藏 pbootcms模板

本套自适应手机端的响应式品牌策划类PbootCMS网站模板。设计风格创意战略,适合品牌策划公司、企划机构展示方法论与成功案例。有助于策划机构在线上展示专业能力,吸引企业客户。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admin 解压密码:www.4s5.cn相关文章…
👁 38
(自适应手机端)响应式汽车零配件五金机械英文外贸网站模板 1017

(自适应手机端)响应式汽车零配件五金机械英文外贸网站模板 1017 实用收藏 pbootcms模板

一款响应式汽车零配件五金机械英文外贸PbootCMS网站模板,支持PC与WAP端。设计风格专业国际,适合汽配五金外贸企业展示产品与出口优势。有助于中国汽配企业在全球市场上进行品牌推广。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admin 解压密码:www.4s5.c…
👁 48