# 資料庫設定說明 ## 資料庫連線資訊 - **資料庫類型**: MySQL / MariaDB - **主機位址**: mysql.theaken.com - **埠號**: 33306 - **資料庫名稱**: HBR_scraper - **使用者名稱**: A101 - **密碼**: Aa123456 ## 快速開始 ### 1. 安裝依賴套件 ```bash pip install -r requirements.txt ``` ### 2. 測試資料庫連線 執行測試腳本來驗證資料庫連線並建立必要的資料表: ```bash python test_db_connection.py ``` 此腳本會執行以下測試: 1. 測試基本資料庫連線 2. 建立 HBR_scraper 資料庫(如果不存在) 3. 測試連接到 HBR_scraper 資料庫 4. 建立資料表結構(articles, tags, article_tags) 5. 驗證資料表是否建立成功 ### 3. 執行爬蟲 測試完成後,可以執行爬蟲,資料會自動儲存到資料庫: ```bash cd hbr_crawler scrapy crawl hbr ``` ## 資料表結構 ### articles(文章主表) | 欄位 | 類型 | 說明 | |------|------|------| | id | BIGINT | 主鍵,自動遞增 | | title | VARCHAR(500) | 文章標題 | | url | VARCHAR(1000) | 文章網址(唯一索引) | | author | VARCHAR(200) | 作者名稱 | | publish_date | DATETIME | 發布日期 | | summary | TEXT | 文章摘要 | | is_paywalled | TINYINT(1) | 是否為付費文章 | | category | VARCHAR(100) | 文章分類 | | content | TEXT | 文章內容 | | created_at | TIMESTAMP | 建立時間 | | updated_at | TIMESTAMP | 更新時間 | | crawled_at | DATETIME | 爬取時間 | ### tags(標籤表) | 欄位 | 類型 | 說明 | |------|------|------| | id | BIGINT | 主鍵,自動遞增 | | name | VARCHAR(100) | 標籤名稱(唯一索引) | | created_at | TIMESTAMP | 建立時間 | ### article_tags(文章標籤關聯表) | 欄位 | 類型 | 說明 | |------|------|------| | id | BIGINT | 主鍵,自動遞增 | | article_id | BIGINT | 文章 ID(外鍵) | | tag_id | BIGINT | 標籤 ID(外鍵) | | created_at | TIMESTAMP | 建立時間 | ## 資料處理邏輯 ### 重複文章處理 - 系統會依據 URL 檢查文章是否已存在 - 如果文章已存在,會更新現有記錄(更新 `crawled_at` 時間戳和所有欄位) - 如果文章不存在,會插入新記錄 ### 標籤處理 - 標籤採用正規化設計(tags 表 + article_tags 關聯表) - 系統會自動建立新標籤(如果不存在) - 使用標籤快取機制,避免重複查詢資料庫 ## 環境變數設定(可選) 如果需要透過環境變數設定資料庫連線資訊,可以設定: ```bash export DB_HOST=mysql.theaken.com export DB_PORT=33306 export DB_USER=A101 export DB_PASSWORD=Aa123456 export DB_NAME=HBR_scraper ``` 系統會優先使用環境變數,如果沒有設定則使用 `settings.py` 中的預設值。 ## 查詢資料範例 ### 查詢所有文章 ```sql SELECT * FROM articles ORDER BY crawled_at DESC; ``` ### 查詢特定分類的文章 ```sql SELECT * FROM articles WHERE category = 'management' ORDER BY publish_date DESC; ``` ### 查詢付費文章 ```sql SELECT * FROM articles WHERE is_paywalled = 1; ``` ### 查詢文章及其標籤 ```sql SELECT a.id, a.title, a.url, GROUP_CONCAT(t.name) as tags FROM articles a LEFT JOIN article_tags at ON a.id = at.article_id LEFT JOIN tags t ON at.tag_id = t.id GROUP BY a.id, a.title, a.url; ``` ### 查詢特定標籤的文章 ```sql SELECT DISTINCT a.* FROM articles a INNER JOIN article_tags at ON a.id = at.article_id INNER JOIN tags t ON at.tag_id = t.id WHERE t.name = '領導力'; ``` ## 故障排除 ### 連線失敗 1. 檢查網路連線 2. 確認資料庫主機位址和埠號正確 3. 確認使用者名稱和密碼正確 4. 檢查防火牆設定 ### 資料表建立失敗 1. 確認使用者有 CREATE TABLE 權限 2. 檢查 SQL 檔案路徑是否正確 3. 查看錯誤日誌了解詳細錯誤訊息 ### 資料插入失敗 1. 檢查資料庫連線是否正常 2. 確認資料表結構是否正確建立 3. 檢查資料格式是否符合資料表定義 ## 注意事項 - 資料庫連線資訊已寫入 `settings.py`,請勿將此檔案提交到公開版本控制系統 - 建議使用環境變數或設定檔管理敏感資訊 - 定期備份資料庫 - 監控資料庫空間使用情況