紅穆ノート
レコメンド 言語ノート ウェブサイト広告における禁止語処理の実践:Pythonによるスキャン+BaoTa Firewallによるフィルタリング+語彙データベース管理
言語ノート PHP PHPとMySQL

ウェブサイト広告における禁止語処理の実践:Pythonによるスキャン+BaoTa Firewallによるフィルタリング+語彙データベース管理

ウェブサイト広告における禁止語処理の実践:Pythonによるスキャン+BaoTa Firewallによるフィルタリング+語彙データベース管理

ウェブサイト広告における禁止語処理の実践:Pythonによるスキャン+BaoTa Firewallによるフィルタリング+語彙データベース管理

作者:红穆(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


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

微信赞赏

WeChat

支付宝赞赏

Alipay

✍️ クリエイター: 紅穆

ウェブサイト管理者 · ご覧いただきありがとうございます!さらに多くの魅力的なコンテンツをお楽しみいただけますよう、引き続きご支援をお願いいたします。

著者プロフィール プロフィールを見る →

関連記事

PHPにおける型強制変換

PHPにおける型強制変換 言語ノート PHP PHPデータ収集 PHPとMySQL

データ型の確認:1. 指定された式の値および型を確認する場合、`var_dump()` を使用します。2. デバッグ目的で、読みやすい型表現を取得する場合、`gettype()` を使用します。3. 指定された型を確認する場合は、`gettype()` ではなく `is_type()` 関数を使用してください。文字列を数値に変換:文字列が数値として評価される場合、結果は以下のルールに基づいて決定されます…
👁 238
PHPにおける特殊文字のエスケーティングと復元

PHPにおける特殊文字のエスケーティングと復元 言語ノート PHP PHPデータ収集 PHPとMySQL

エスケープ文字とは、特殊な文字定数のことです。この文字は「\\」で始まり、その後に1文字または複数の文字が続きます。エスケープ文字は、通常の文字の意味とは異なる特別な意味を持ちます。このため、「エスケープ」文字と呼ばれます。エスケープ文字の用途:1:通常の文字を特殊な用途(例:「Backspace」キー、「Carriage Return」キーなど)に変換する。2:特殊な意味を持つ文字を元の意味に戻すために使用する。3:データをデータベースに書き込む前に、常にエスケープ文字が使用されます(例:…)。
👁 187
PHP mysqli

PHP mysqli 言語ノート PHP PHPデータ収集 PHPとMySQL

データベースに対するクエリを実行:データベースを削除する。 `<?php // データベースのユーザー名: root、パスワード: 123456、データベース名: RUNOOB $con = mysqli_connect('localhost', 'root', '123456', 'RUNOOB');`
👁 236
PHPにおけるmysqli

PHPにおけるmysqli 言語ノート PHP PHPデータ収集 PHPとMySQL

`mysqli_num_rows()` 関数は SELECT クエリにのみ使用されます。一方、`mysqli_affected_rows()` 関数は前回実行された SQL 文がデータベース全体に与えた影響を記録し、影響を受けたデータの数を返します。この関数は、INSERT(挿入)、UPDATE(更新)、DELETE(削除)などの操作で主に使用されます。
👁 149

おすすめ読書

EmpireCMS 7.5:SQL文を使用してすべての記事情報を削除し、IDを1から開始させる方法

EmpireCMS 7.5:SQL文を使用してすべての記事情報を削除し、IDを1から開始させる方法 プログラムノート EmpireCMS

帝国CMSからすべてのデータ(記事内容、セクション、タグ、会員グループなど)をSQL文で削除します。もしあなたが新しいテンプレートを購入した場合、そのテンプレートに含まれるデータが望ましいものではない場合は、以下のSQL文を使用してください:`TRUNCATE `[!db.pre!]ecms_news`;`、`TRUNCATE `[!db.pre!]ecms_news_check`…`。
👁 159
EmpireCMSフィルタリング関数

EmpireCMSフィルタリング関数 プログラムノート EmpireCMS

EmpireCMSに内蔵された変数フィルタリング関数は、二次開発やテンプレート作成の際に頻繁に使用されます。この関数を習得すれば、自分でフィルタリングメソッドを記述する必要がなくなり、大幅にコード量を削減できます。(1)数値型変数は(int)またはintval関数で処理できます。例:`$page=(int)$.Get['page'];` または `$page=intval($.Get['page'];`;(2)小数点付き…
👁 220
(適応型スマートフォン向け)レスポンシブマーケティング対応のスポーツ・フィットネス機器用PBootCMSウェブサイトテンプレート – 藍色系フィットネス機器ウェブサイトのソースコードダウンロード 0451

(適応型スマートフォン向け)レスポンシブマーケティング対応のスポーツ・フィットネス機器用PBootCMSウェブサイトテンプレート – 藍色系フィットネス機器ウェブサイトのソースコードダウンロード 0451 実用収集 pbootcmsテンプレート

本テンプレートは、高級住宅装飾設計会社向けのウェブサイト用テンプレートです。モダンで豪華なデザインスタイルを採用しており、住宅・商業施設の設計会社が自社のデザイン作品、ブランド理念、サービスプロセスを紹介するのに最適です。高級顧客層の獲得やブランドイメージの向上に役立ちます。テンプレートの表示・設置説明:ウェブサイトバックエンド:/admin.php、ユーザー名:admin、パスワード:admin、解凍用パスワード:www.4s5.cn。関連記事:PbootCMSのセキュリティ運用・保守完了…
👁 59
(PC+WAP)蓝色五金机械设备pbootcms企业网站模板 通用营销型网站源码下载 0583

(PC+WAP)蓝色五金机械设备pbootcms企业网站模板 通用营销型网站源码下载 0583 実用収集 pbootcmsテンプレート

一款通用的蓝色五金机械设备PbootCMS企业网站模板,适用于各类机械制造与五金加工行业,支持PC和移动端。设计风格简洁专业,功能模块齐全。是机械设备公司快速搭建营销型品牌官网、提升线上推广效果的基础选择。模板展示 安装说明 网站后台:/admin.php 账号:admin 密码:admin 解压密…
👁 42