iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
AI & Data

Notion遇上LLM:30天打造我的AI知識管理系統系列 第 8

【Day 8】實作 Notion 自動化 Pipeline:一次抓取多個 Database → Page → Block

  • 分享至 

  • xImage
  •  

Day 7 我們設計了 Pipeline 架構,把「Database → Page → Block → JSON」的流程視覺化,並討論了增量更新、結構化輸出等重點。
今天,我們要實際寫程式,把前面 Day 5Day 6 的成果串起來,讓 Pipeline 一次抓取多個 Database → 解析 Page → 清理 Block → 輸出 JSON。

1. Pipeline 實作目標

  • 支援多 Database:不用一個一個手動跑,而是從清單載入 ID。
  • 自動抓取 Database rows,取得 Page ID。
  • 遞迴展開 Page blocks,處理多型別 Block(paragraph、code、heading、list…)。
  • 模組化程式碼:分拆 fetch、parse、run,方便日後維護。
  • 輸出成乾淨 JSON,存進 data/clean/
    /images/emoticon/emoticon01.gif

2. 設定 Database 清單 (databases.yml)

config/databases.yml
我們不再將 Database ID 寫死在 .env,而是新增一個設定檔 config/databases.yml,集中管理:

databases:
  - id: "abcd1234efgh5678ijkl9012mnop3456"
    name: "Life_BusanTravelPlan"
  - id: "xyz1234abcd5678ijkl9012mnop3456"
    name: "Learning_PythonBasicNotes"

⚙️ 小提醒:先安裝 pyyaml,以便讀取 .yml 檔
先安裝套件,在你的專案虛擬環境(venv)裡執行:

pip install pyyaml

3. Pipeline 主程式

  • 程式架構
    [.env + config/databases.yml]
             │
             ▼
      讀取 Token & DB 清單
             │
             ▼
      for 每個 Database
             │
             ▼
    /databases/{id}/query  → 取得 rows (含 page_id)
             │
             ▼
    for 每個 page_id:
    /blocks/{page_id}/children → 遞迴抓取 blocks
             │
             ▼
     parse_block() 統一結構
             │
             ▼
    以 db_name 分檔 → data/clean/{db}.json
    
    
  • 技術要點
    • 模組化設計:Database / Page / Block 分開寫,容易維護與擴充
    • 多 Database 支援:透過 databases.yml 控管,不用每次改程式
    • 輸出分檔:每個 Database 一個 JSON,便於後續查閱、同步、或單獨重跑
    • 安全性:Token 放 .env,不會硬編碼在程式裡
    • 可擴充性:
      • 後續可以改成 增量更新(比對 last_edited_time)
      • 也能接上 SQLite / ChromaDB 做進一步的 知識庫建構
  • 程式碼(src/run_pipeline.py
import os, json, requests, yaml
from dotenv import load_dotenv
from fetch_learning_database import query_database_all
from fetch_learning_page import fetch_page_blocks
from parse_learning_blocks import parse_block

load_dotenv()

TOKEN = os.getenv("NOTION_TOKEN")
HEADERS = {
    "Authorization": f"Bearer {TOKEN}",
    "Notion-Version": "2022-06-28"
}
BASE = "https://api.notion.com/v1"

def run_pipeline(config_path="config/databases.yml"):
    with open(config_path, "r", encoding="utf-8") as f:
        config = yaml.safe_load(f)

    os.makedirs("data/clean", exist_ok=True)

    for db in config["databases"]:
        db_id = db["id"]
        db_name = db["name"]

        print(f"=== 處理 Database: {db_name} ===")

        # Step 1: 抓 Database rows
        rows = query_database_all(db_id)
        print(f"  Rows: {len(rows)}")

        db_results = []

        for row in rows:
            page_id = row["id"]

            # Step 2: 抓 Page blocks
            blocks = fetch_page_blocks(page_id)

            # Step 3: 解析 Block
            parsed = [parse_block(b) for b in blocks]

            db_results.append({
                "db_name": db_name,
                "db_id": db_id,
                "page_id": page_id,
                "blocks": parsed
            })

        # Step 4: 存成獨立檔案
        safe_name = db_name.replace(" ", "_")  # 避免空白或特殊字元
        out_path = f"data/clean/{safe_name}.json"
        with open(out_path, "w", encoding="utf-8") as f:
            json.dump(db_results, f, ensure_ascii=False, indent=2)

        print(f"Saved results for {db_name} → {out_path}")

if __name__ == "__main__":
    run_pipeline()

4. 執行結果

  • Ternimal
    https://ithelp.ithome.com.tw/upload/images/20250922/20178104d2IYYBWMjS.png
  • 檔案結構
    data/clean/
    ├── Learning_PythonBasicNotes.json
    └── Life_BusanTravelPlan.json
    
  • Json檔內容
    • 每筆資料包含:
      • db_name
      • db_id
      • page_id
      • blocks(展平後的內容)
        https://ithelp.ithome.com.tw/upload/images/20250922/2017810448zd9r1uZD.png

小結與下篇預告

今天,我們把 Day 5Day 6 的成果整合成 自動化 Pipeline,能一次抓取多個 Database,展開 Page 與 Block,並清理成統一格式的 JSON。這樣一來,我們的 Notion 知識就能被系統化抽取,不再需要手動 API 呼叫。

在 Day 9,我們將進一步設計 SQLite Schema,思考如何把這些 JSON 正規化存入資料庫,為後續的向量化(Embedding)與 RAG 知識庫打下基礎。


上一篇
【Day 7】Notion 自動化 Pipeline 設計:Database → Page → Block
系列文
Notion遇上LLM:30天打造我的AI知識管理系統8
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言