- Scrapy 爬蟲框架,爬取 HBR 繁體中文文章 - Flask Web 應用程式,提供文章查詢介面 - SQL Server 資料庫整合 - 自動化排程與郵件通知功能 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
4.2 KiB
4.2 KiB
資料庫設定說明
資料庫連線資訊
- 資料庫類型: MySQL / MariaDB
- 主機位址: mysql.theaken.com
- 埠號: 33306
- 資料庫名稱: HBR_scraper
- 使用者名稱: A101
- 密碼: Aa123456
快速開始
1. 安裝依賴套件
pip install -r requirements.txt
2. 測試資料庫連線
執行測試腳本來驗證資料庫連線並建立必要的資料表:
python test_db_connection.py
此腳本會執行以下測試:
- 測試基本資料庫連線
- 建立 HBR_scraper 資料庫(如果不存在)
- 測試連接到 HBR_scraper 資料庫
- 建立資料表結構(articles, tags, article_tags)
- 驗證資料表是否建立成功
3. 執行爬蟲
測試完成後,可以執行爬蟲,資料會自動儲存到資料庫:
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 關聯表)
- 系統會自動建立新標籤(如果不存在)
- 使用標籤快取機制,避免重複查詢資料庫
環境變數設定(可選)
如果需要透過環境變數設定資料庫連線資訊,可以設定:
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 中的預設值。
查詢資料範例
查詢所有文章
SELECT * FROM articles ORDER BY crawled_at DESC;
查詢特定分類的文章
SELECT * FROM articles WHERE category = 'management' ORDER BY publish_date DESC;
查詢付費文章
SELECT * FROM articles WHERE is_paywalled = 1;
查詢文章及其標籤
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;
查詢特定標籤的文章
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 = '領導力';
故障排除
連線失敗
- 檢查網路連線
- 確認資料庫主機位址和埠號正確
- 確認使用者名稱和密碼正確
- 檢查防火牆設定
資料表建立失敗
- 確認使用者有 CREATE TABLE 權限
- 檢查 SQL 檔案路徑是否正確
- 查看錯誤日誌了解詳細錯誤訊息
資料插入失敗
- 檢查資料庫連線是否正常
- 確認資料表結構是否正確建立
- 檢查資料格式是否符合資料表定義
注意事項
- 資料庫連線資訊已寫入
settings.py,請勿將此檔案提交到公開版本控制系統 - 建議使用環境變數或設定檔管理敏感資訊
- 定期備份資料庫
- 監控資料庫空間使用情況