Add advanced crawler module design to SDD v1.3

新增第 4.1.5 節:進階爬蟲模組設計

主要內容:
- Scrapy 框架整合規格(擴充新聞來源用)
- 通用爬蟲架構設計原則
- 多層級選擇器備用機制
- Pipeline 資料處理管線(CSV + Database)
- 資料庫表結構(articles, tags, article_tags)
- 錯誤處理與效能最佳化
- 執行測試與除錯技巧
- 新增新聞來源的標準步驟

技術規格:
- Scrapy >= 2.11.0
- PyMySQL >= 1.1.0
- python-dateutil >= 2.8.2
- 支援多來源整合(source 欄位)
- Context Manager 確保交易完整性
- 標籤快取機制提升效能

這個設計可作為擴充其他新聞來源的通用範本。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
donald
2025-12-04 11:07:37 +08:00
parent 293aeca5f8
commit 7719919dc7

View File

@@ -74,6 +74,120 @@ Digitimes 帳號密碼登入(付費訂閱) 全文擷取
3. 重試失敗後通知系統管理員 3. 重試失敗後通知系統管理員
4. 專員可透過介面手動觸發重新抓取 4. 專員可透過介面手動觸發重新抓取
4.1.5 進階爬蟲模組設計(擴充新聞來源用)
本節說明如何擴充新的新聞來源,以 Scrapy 框架實作進階爬蟲模組。
技術堆疊Scrapy 方案)
• 爬蟲框架Scrapy >= 2.11.0
• Item 適配器itemadapter >= 0.7.0
• 資料庫連接PyMySQL >= 1.1.0
• 日期解析python-dateutil >= 2.8.2
• 環境變數python-dotenv >= 1.0.0
爬蟲核心設計原則
• Spider定義爬蟲名稱、允許網域、起始 URL
• 測試模式:支援參數控制(不追蹤分頁、指定單一 URL
• 多層級選擇器:優先 > 備用 > 最後手段,提升容錯性
• 連結過濾:跳過 JavaScript、錨點、非目標頁面
列表頁解析策略
• 多層級選擇器備用機制
• 連結提取優先順序設計
• 連結過濾規則JavaScript、錨點、非文章頁
• 智慧型分頁處理
文章頁解析邏輯
• 標題提取:多層選擇器備用
• 作者提取CSS 選擇器 > meta 標籤
• 發布日期CSS 選擇器 > meta 標籤
• 摘要提取CSS 選擇器 > meta description
• 分類提取CSS 選擇器或從 URL 推斷
• 標籤提取:多種選擇器支援
• 付費文章檢測:檢查付費牆標記(.paywall, .premium 等)
• 內容提取:僅非付費文章,多層選擇器備用
通用資料模型ArticleItem
• title文章標題必填最大 500 字元)
• url文章完整 URL必填唯一識別
• author作者名稱
• publish_date發布日期
• summary文章摘要
• is_paywalled是否為付費文章0/1
• category文章分類
• tags標籤列表
• content文章內容僅免費文章
• source新聞來源用於多來源整合
Pipeline 資料處理管線
1. CsvExportPipeline優先級 300
- 本地備份CSV 檔案儲存
- 編碼格式UTF-8
- 即使資料庫失敗仍可保存資料
2. DatabasePipeline優先級 400
- 資料表articles, tags, article_tags
- Context Manager確保交易完整性
- 標籤快取機制:減少資料庫查詢
- 日期解析:支援多種格式
- 去重機制URL 唯一性檢查
- 更新邏輯:已存在則更新,不存在則新增
錯誤處理機制
• 選擇器失敗:多層備用選擇器,逐層嘗試
• 資料庫錯誤:捕獲例外,記錄日誌,繼續處理
• 連線失敗:警告但不中斷爬蟲執行
• 日誌記錄:使用 Python logging 模組
Settings 爬蟲設定
• ROBOTSTXT_OBEYTrue遵守 robots.txt
• DOWNLOAD_DELAY1-3 秒(請求間隔,依網站調整)
• FEED_EXPORT_ENCODINGutf-8
• Twisted ReactorAsyncioSelectorReactor
執行與測試
• 基本執行scrapy crawl <spider_name>
• 測試模式scrapy crawl <spider_name> -a test_mode=true
• 指定 URLscrapy crawl <spider_name> -a start_url="https://..."
• 輸出檔案scrapy crawl <spider_name> -o output.json
• 除錯模式scrapy crawl <spider_name> --loglevel=DEBUG
• Shell 測試scrapy shell "https://..."
除錯技巧
• scrapy shell測試選擇器
• Chrome DevTools分析網頁結構
• robots.txt 檢查:確認爬取規則
• 日誌分析:追蹤錯誤原因
效能最佳化建議
• 標籤快取:啟動時載入所有標籤到記憶體
• HTTP 快取:減少重複請求(選用)
• AutoThrottle自動調整請求速率選用
• Context Manager確保資料庫連線正確關閉
• 並發控制CONCURRENT_REQUESTS 設定
資料庫表結構
articles 表:
- id, title, url (UNIQUE), author, publish_date, summary
- is_paywalled, category, content, source
- crawled_at, created_at, updated_at
tags 表:
- id, name (UNIQUE), created_at
article_tags 關聯表:
- id, article_id (FK), tag_id (FK)
- UNIQUE(article_id, tag_id)
新增新聞來源步驟
1. 建立新的 Spider繼承 scrapy.Spider
2. 定義 start_urls 與 allowed_domains
3. 實作 parse() 解析列表頁
4. 實作 parse_article() 解析文章頁
5. 測試選擇器與資料提取
6. 調整 DOWNLOAD_DELAY 避免被封鎖
7. 加入 Pipeline 進行資料儲存
4.2 關鍵字群組管理 4.2 關鍵字群組管理
4.2.1 群組分類方式 4.2.1 群組分類方式
• 依產業別分群:半導體、面板、車用電子...等 • 依產業別分群:半導體、面板、車用電子...等
@@ -412,17 +526,27 @@ Ollama 開源的本地 LLM 執行框架,可在企業內部部署運行
• 套件版本更新 • 套件版本更新
- lxml 升級至 6.0+Python 3.13 相容) - lxml 升級至 6.0+Python 3.13 相容)
- WeasyPrint 升級至 67.0+ - WeasyPrint 升級至 67.0+
- httpx + BeautifulSoup4 取代 Scrapy - httpx + BeautifulSoup4 取代 Scrapy(基礎爬蟲)
- aiosmtplib 升級至 5.0+ - aiosmtplib 升級至 5.0+
- python-jose 升級至 3.5+ - python-jose 升級至 3.5+
- bcrypt 升級至 5.0+ - bcrypt 升級至 5.0+
- ldap3 2.9+ - ldap3 2.9+
• 新增進階爬蟲模組設計4.1.5 節)
- Scrapy 框架整合規格
- 通用爬蟲架構設計(擴充新聞來源用)
- Pipeline 資料處理管線
- 多層級選擇器備用機制
- 資料庫表結構設計
- 錯誤處理與效能最佳化
- 新增新聞來源步驟說明
• 功能優化 • 功能優化
- 新增 asyncio 並發控制 - 新增 asyncio 並發控制
- 使用 tenacity 實作錯誤重試機制 - 使用 tenacity 實作錯誤重試機制
- 改善安全性需求描述 - 改善安全性需求描述
- 優化 PDF 中文字型支援 - 優化 PDF 中文字型支援
- 新增 source 欄位支援多來源整合
版本 1.2 (2025-01-27) 版本 1.2 (2025-01-27)
• 初始版本規格定義 • 初始版本規格定義