- Scrapy 爬蟲框架,爬取 HBR 繁體中文文章 - Flask Web 應用程式,提供文章查詢介面 - SQL Server 資料庫整合 - 自動化排程與郵件通知功能 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
181 lines
4.2 KiB
Markdown
181 lines
4.2 KiB
Markdown
# 資料庫設定說明
|
||
|
||
## 資料庫連線資訊
|
||
|
||
- **資料庫類型**: 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`,請勿將此檔案提交到公開版本控制系統
|
||
- 建議使用環境變數或設定檔管理敏感資訊
|
||
- 定期備份資料庫
|
||
- 監控資料庫空間使用情況
|
||
|
||
|