# 爬蟲資源消耗分析與優化方案 **分析日期**:2026-01-14 **問題**:爬蟲消耗過高 CPU 資源(單個 Chrome 程序可達 50%+ CPU) --- ## 🔍 問題分析 ### 當前配置(scheduler.py) ```python # Chrome Options 配置 options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--force-device-scale-factor=3') # ⚠️ 3倍解析度 options.add_argument('--lang=zh-TW') options.add_argument('--high-dpi-support=1') ``` ### 資源消耗分析 | 配置項目 | 作用 | CPU 影響 | 記憶體影響 | |---------|------|---------|-----------| | `--headless=new` | 無頭模式 | 低 | 低 | | `--disable-gpu` | 禁用GPU | 中(CPU渲染) | 低 | | `--no-sandbox` | 禁用沙盒 | 低 | 低 | | **`--force-device-scale-factor=3`** | **3倍解析度** | **極高** | **高** | | `--high-dpi-support=1` | 高DPI支援 | 中 | 中 | ### 關鍵問題 1. **3倍解析度(`scale-factor=3`)**: - 渲染面積增加 9 倍(3×3) - Chrome 需要渲染 `5760×15000` 像素(原本 `1920×5000`) - 單個頁面渲染可消耗 50%+ CPU 2. **無GPU加速(`--disable-gpu`)**: - 所有渲染由 CPU 執行 - 配合 3 倍解析度,CPU 負擔極重 3. **缺少資源限制**: - 無並發限制 - 無單進程模式 - 無記憶體限制 --- ## 🎯 優化方案 ### 方案 A:最小化資源消耗(推薦) **適用場景**:不需要高清截圖,只需要抓取商品資料 **修改項目**: ```python # 1. 降低解析度倍數:3 → 1 options.add_argument('--force-device-scale-factor=1') # 從 3 改為 1 # 2. 使用單進程模式(減少 Chrome 子程序) options.add_argument('--single-process') # 3. 禁用軟體光柵化器 options.add_argument('--disable-software-rasterizer') # 4. 限制記憶體使用 options.add_argument('--max-old-space-size=512') ``` **預期效果**: - CPU 使用:**降低 70-80%**(50% → 10%) - 記憶體使用:**降低 60%**(500MB → 200MB) - 頁面載入速度:**提升 50%** --- ### 方案 B:平衡效能(需要截圖但降低負擔) **適用場景**:需要截圖功能,但可以接受較低解析度 **修改項目**: ```python # 1. 降低解析度倍數:3 → 1.5 options.add_argument('--force-device-scale-factor=1.5') # 從 3 改為 1.5 # 2. 啟用 GPU 加速(讓 GPU 分擔渲染) # options.add_argument('--disable-gpu') # 註解掉此行 options.add_argument('--enable-gpu-rasterization') # 3. 使用單進程模式 options.add_argument('--single-process') ``` **預期效果**: - CPU 使用:**降低 50-60%**(50% → 20%) - 記憶體使用:**降低 40%**(500MB → 300MB) - 截圖品質:仍然清晰(1.5倍解析度足夠) --- ### 方案 C:降低執行頻率 **當前配置**:每小時執行 3 個爬蟲(商品看板、EDM、購物節) **優化建議**: ```python # run_scheduler.py 修改執行頻率 schedule.every(4).hours.do(run_momo_task) # 每 1 小時 → 每 4 小時 schedule.every(4).hours.do(run_edm_task) # 每 1 小時 → 每 4 小時 schedule.every(6).hours.do(run_festival_task) # 每 1 小時 → 每 6 小時 ``` **預期效果**: - 平均 CPU 使用:**降低 75%** - 爬蟲執行次數:從 24次/天 → 6次/天 --- ### 方案 D:使用輕量級替代方案 **完全移除 Selenium**,改用: - `requests` + `BeautifulSoup`(如果網站允許) - `httpx` + `parsel`(更快的 HTTP 客戶端) - `playwright`(比 Selenium 更輕量) **優缺點**: - ✅ CPU 使用降低 90%+ - ❌ 需要重寫爬蟲代碼 - ❌ 可能無法處理 JavaScript 渲染的網站 --- ## 📊 建議實施順序 ### 第一階段:立即優化(方案 A + 方案 C) 1. **修改 scheduler.py**: - 降低解析度:`scale-factor=3` → `scale-factor=1` - 增加 `--single-process` - 增加 `--disable-software-rasterizer` 2. **降低執行頻率**: - 商品看板:每 4 小時 - EDM爬蟲:每 4 小時 - 購物節:每 6 小時 **預期結果**: - 資源消耗降低 **80-85%** - 仍能維持基本監控需求 --- ### 第二階段:評估效果(1-2 天後) 1. 檢查 Grafana 監控數據 2. 確認爬蟲是否正常運作 3. 評估是否需要進一步優化 --- ### 第三階段:長期優化(可選) 1. 考慮改用 Playwright(輕量級) 2. 實施任務隊列(Celery) 3. 分離爬蟲到獨立 VM(如需高頻率爬蟲) --- ## ⚠️ 重要提醒 ### 截圖功能影響 如果您的通知系統需要高清截圖(`force-device-scale-factor=3`),請選擇方案 B(1.5倍解析度)。 如果不需要高清截圖,建議選擇方案 A(1倍解析度),可大幅降低資源消耗。 ### Systemd 服務 目前 `momo-scheduler.service` 已停用。如果需要重新啟動: ```bash sudo systemctl start momo-scheduler # 啟動 sudo systemctl enable momo-scheduler # 設為開機自啟動 ``` 建議:優化完成後再啟動服務。 --- ## 🔧 實施腳本 我已準備好優化後的代碼,請確認要使用哪個方案: - **方案 A**(推薦):最大化降低資源消耗 - **方案 B**:平衡效能與截圖品質 - **方案 C**:僅降低執行頻率 --- **文件版本**:1.0 **最後更新**:2026-01-14 **維護人員**:MOMO Pro System Admin