diff --git a/daily-news-SDD.md b/daily-news-SDD.md index 473a61d..e722f3d 100644 --- a/daily-news-SDD.md +++ b/daily-news-SDD.md @@ -74,6 +74,120 @@ Digitimes 帳號密碼登入(付費訂閱) 全文擷取 3. 重試失敗後通知系統管理員 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_OBEY:True(遵守 robots.txt) +• DOWNLOAD_DELAY:1-3 秒(請求間隔,依網站調整) +• FEED_EXPORT_ENCODING:utf-8 +• Twisted Reactor:AsyncioSelectorReactor + +執行與測試 +• 基本執行:scrapy crawl +• 測試模式:scrapy crawl -a test_mode=true +• 指定 URL:scrapy crawl -a start_url="https://..." +• 輸出檔案:scrapy crawl -o output.json +• 除錯模式:scrapy crawl --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.1 群組分類方式 • 依產業別分群:半導體、面板、車用電子...等 @@ -412,17 +526,27 @@ Ollama 開源的本地 LLM 執行框架,可在企業內部部署運行 • 套件版本更新 - lxml 升級至 6.0+(Python 3.13 相容) - WeasyPrint 升級至 67.0+ - - httpx + BeautifulSoup4 取代 Scrapy + - httpx + BeautifulSoup4 取代 Scrapy(基礎爬蟲) - aiosmtplib 升級至 5.0+ - python-jose 升級至 3.5+ - bcrypt 升級至 5.0+ - ldap3 2.9+ +• 新增進階爬蟲模組設計(4.1.5 節) + - Scrapy 框架整合規格 + - 通用爬蟲架構設計(擴充新聞來源用) + - Pipeline 資料處理管線 + - 多層級選擇器備用機制 + - 資料庫表結構設計 + - 錯誤處理與效能最佳化 + - 新增新聞來源步驟說明 + • 功能優化 - 新增 asyncio 並發控制 - 使用 tenacity 實作錯誤重試機制 - 改善安全性需求描述 - 優化 PDF 中文字型支援 + - 新增 source 欄位支援多來源整合 版本 1.2 (2025-01-27) • 初始版本規格定義