網站廣告違禁詞處理實戰:Python掃描 + 寶塔防火牆過濾 + 詞庫管理
作者:紅穆(QQ:1810216796)
首發:紅穆筆記
GitHub:https://github.com/1810216796(完整源碼)
📌 背景
近期接到客戶反饋,網站因頁面中包含“第一”、“最佳”、“國家級”等廣告法違禁詞,被市場監管部門約談並罰款。這些詞彙散落在數百個頁面中,人工排查耗時費力,且容易遺漏。爲解決這一痛點,我設計了一套自動化掃描系統,利用 Python 爬蟲遞歸掃描全站,配合精細化的違禁詞庫和白名單機制,每天自動全量掃描,並生成可視化監控面板,讓違規內容無所遁形。
本文將從原理到部署,完整分享這套方案的所有代碼與使用心得。
🧠 整體思路
- 詞庫構建:整理廣告法明令禁止的絕對化用語、醫療功效詞、金融承諾詞等,同時加入上下文白名單,避免誤判(如“世界級文化遺產”屬於客觀描述,不判違規)。
- 爬蟲掃描:Python 腳本多線程併發爬取網站所有頁面,提取可見文本,匹配違禁詞,記錄違規頁面及上下文。
- 增量 & 全量:默認增量掃描(跳過已掃 URL),每日凌晨觸發一次
--reset全量掃描,確保所有新頁面都被覆蓋。 - 監控守護:Shell 腳本每分鐘檢查一次掃描進程,若卡死則自動重啓,保證 7×24 小時穩定運行。
- 可視化面板:PHP 頁面即時展示今日掃描頁數、違規數、運行狀態、各站點統計及違禁詞聚合,方便運維人員隨時查看。
- 寶塔防火牆聯動:通過
rules.txt詞庫,自動更新寶塔防火牆配置,實現訪問時即時替換違禁詞,從源頭過濾。
🔧 環境準備
- 服務器:CentOS / Ubuntu,2 核 4G 以上(內存建議 ≥2G)
- Python 3.6+,需安裝依賴:
pip3 install requests beautifulsoup4 lxml
- PHP 7.4+(用於監控面板)
- Nginx / Apache(託管 PHP 面板)
- 寶塔面板(如需使用防火牆替換功能)
📂 目錄結構(GitHub 倉庫)
ad-violation-scanner/├── sacn_site.py # 核心掃描腳本(支持增量/全量)├── index.php # 即時監控面板├── update_ads.py # 寶塔防火牆詞庫更新腳本├── rules.txt # 替換詞庫(違禁詞=替換詞)├── 寶塔定時任務.sh # 一鍵創建定時任務├── scan_monitor.sh # 進程守護腳本(可選)├── .user.ini # PHP open_basedir 限制└── 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
每行一個替換規則,格式爲 違禁詞=替換詞。例如:
最佳=較佳第一=首先國家級=知名100%=全部治療=調理
更新腳本 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-scanner2. 安裝 Python 依賴
pip3 install requests beautifulsoup4 lxml3. 配置掃描目標
編輯 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、違禁詞詳情,可存檔備查。 - 防火牆替換:訪問頁面時,違禁詞被自動替換,用戶體驗無感知,合規性大幅提升。
⚠️ 注意事項
- 併發控制:根據服務器性能調整
max_workers,避免過高導致目標網站或本地資源耗盡。建議從 10 開始逐步上調。 - 詞庫維護:廣告法不斷更新,需定期維護
rules.txt和EXACT_FORBIDDEN_WORDS,避免漏判或誤判。 - 超時與重試:網絡環境不穩定時,可適當增加
timeout和total重試次數,但避免無限重試。 - 寶塔版本:
update_ads.py基於寶塔 7.x 開發,其他版本可能字段名不同,使用前請先備份驗證。 - 權限安全:監控面板建議設置訪問密碼或僅限內網訪問,避免敏感信息泄露。
🐛 常見問題
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
GitHub:https://github.com/1810216796
本文首發於紅穆筆記,轉載請註明出處。