點擊查看更多
點擊關閉

訪客計數

--- 次訪問

快速統計

15
專案
1
更新
1
活躍專案
3
已完成

本日名言

"你也許選擇了一條不曾有他人走訪的道路,但千萬得謹記那屬於你的責任不可輕易拋於身後。 "
— 佩斯特·尼傑
返回專案列表
已封存 2022年9月 - 2022年9月

學校資訊自動推送系統

針對高雄師範大學公告網站的自動化爬蟲系統,使用 BeautifulSoup 解析 HTML 抓取當日校園公告,透過 Discord Webhook API 即時推送至指定頻道,僅 56 行輕量化實作。

Python Web Scraping Discord Webhook Beautiful Soup

專案簡介

School Information To Webhook 是一個自動化校園公告爬蟲與通知系統,專為高雄師範大學新聞公告網站設計。專案透過網頁爬蟲技術自動抓取當日校園公告,並透過 Discord Webhook 即時推送至指定頻道,解決學生需手動查看學校網站的不便。系統採用 BeautifulSoup 解析 HTML、使用 Requests 進行網頁請求,並整合 Discord Webhook API 實現自動化通知。

核心理念

  • 自動化資訊獲取:定時爬取校園公告,無需手動瀏覽網站
  • 即時通知推送:透過 Discord Webhook 將重要公告推送至社群頻道
  • 輕量化設計:單一 Python 腳本,僅 56 行程式碼,易於部署與維護
  • 日期精準過濾:只推送當日公告,避免重複通知

我的職責

作為專案的唯一開發者,我負責:

系統架構設計

  • 設計三階段爬蟲流程:資訊擷取 → 資料整合 → 通知推送
  • 建立自定義文字優化函數,移除 HTML 標籤與特殊字元
  • 實作 URL 解析邏輯,處理學校網站的特殊連結格式

核心功能實作

  • 網頁爬蟲系統:使用 BeautifulSoup 解析高雄師範大學新聞公告頁面
  • 文字處理函數:optimize() 函數移除 HTML 標籤,保留純文字內容
  • URL 優化:get_website() 函數處理 amp; 轉義字元,產生正確連結
  • Discord 整合:DiscordWebhook 自動發送格式化公告訊息

核心功能

1. 網頁爬蟲與資料擷取

  • HTML 解析
    • 使用 BeautifulSoup 解析 https://news.nknu.edu.tw/nknu_News/
    • 提取表格資料(<td> 標籤,每列 6 個欄位)
    • 識別公告單位、標題、日期、連結等資訊
  • 日期過濾
    • 取得系統當前日期(datetime.now()
    • 格式化為 YYYY.MM.DD 格式
    • 僅處理日期欄位包含當日的公告

2. 文字優化函數

optimize(s) - HTML 標籤移除

def optimize(s):
    flag = 0
    ret = ""
    for i in range(len(s)):
        if(s[i] == '<'): flag = 0
        if(flag): ret += s[i]
        if(s[i] == '>'): flag = 1
    return ret
  • 演算法:使用 flag 標記追蹤是否在 HTML 標籤內
  • 功能:提取 <td> 標籤內的純文字內容
  • 應用:處理公告單位與標題

3. URL 解析函數

get_website(s) - 連結優化處理

def get_website(s):
    cot = 0
    ret = ""
    for i in range(len(s)):
        if(cot == 4): break
        if(cot == 3): ret += s[i]
        if(s[i] == '"'): cot += 1
    temp = ret.split("amp;")
    ret = ''.join(x for x in temp)
    return ret[:-1]
  • 演算法:計數引號位置,提取第 3-4 對引號間的 URL
  • 優化:移除 HTML 轉義字元 amp;
  • 結果:產生完整的校園公告連結

4. Discord Webhook 通知

  • 訊息格式化

    YYYY.MM.DD | 最新公告! 公告處:[單位名稱]
    
    ➤  [公告標題]
    
    ➤  網站連結: [URL]
    ----------------------------------------
    
  • 批次推送

    • 遍歷當日所有公告
    • 逐筆發送至 Discord Webhook
    • rate_limit_retry=True 防止 API 限流
  • 無更新檢測

    • 若當日無公告,顯示 "沒有更新..."
    • 避免發送空訊息至 Discord

使用技術

網頁爬蟲

  • BeautifulSoup (4.9.0):HTML/XML 解析器
    • 提取表格資料(find_all("td")
    • 靈活的 CSS 選擇器與標籤搜尋
  • Requests (2.28.1):HTTP 請求函式庫
    • GET 請求取得網頁內容
    • 自動處理重定向與 cookies

通知系統

  • Discord-Webhook (0.17.0):Discord API 整合
    • DiscordWebhook 類別封裝 API 呼叫
    • 支援 rate_limit_retry 自動重試
    • 訊息內容格式化與發送

日期處理

  • datetime (標準庫):日期時間操作
    • datetime.now() 取得當前時刻
    • strftime('%Y.%m.%d') 格式化輸出

開發工具

  • Visual Studio:專案管理 (.pyproj, .sln)
  • Python 3.x:核心開發語言

專案狀態

當前版本:已完成

  • 核心功能狀態:網頁爬蟲、Discord 通知均已穩定運作

功能完成度

  • 已完成
    • BeautifulSoup HTML 解析
    • 日期精準過濾(當日公告)
    • HTML 標籤移除(optimize 函數)
    • URL 轉義字元處理(get_website 函數)
    • Discord Webhook 推送
    • 無更新檢測機制
    • 批次公告推送

開發挑戰與收穫

1. HTML 標籤移除演算法

挑戰:如何優雅地從 BeautifulSoup 提取的字串中移除 HTML 標籤?

解決方案

  • 設計 optimize() 函數,使用 flag 標記追蹤是否在標籤內
  • 演算法複雜度 O(n),單次遍歷完成
  • 避免使用正則表達式,提升可讀性

收穫

  • 理解狀態機(State Machine)概念
  • 學習字串處理的高效演算法
  • 掌握 Python 字串操作技巧

2. URL 轉義字元處理

挑戰:學校網站 URL 包含 amp; 轉義字元,導致連結無效。

解決方案

  • get_website() 函數提取引號間的 URL
  • 使用 split("amp;") 移除轉義字元
  • ''.join(x for x in temp) 重組正確 URL

收穫

  • 理解 HTML 實體編碼(Entity Encoding)
  • 學習字串分割與拼接技巧
  • 掌握網頁連結解析方法

3. 日期匹配邏輯

挑戰:如何確保只推送當日公告,避免重複通知?

解決方案

  • datetime.now() 取得系統當前日期
  • strftime('%Y.%m.%d') 格式化為學校網站使用的格式
  • 使用列表推導式過濾:if date in str(date_[y])

收穫

  • 掌握 Python datetime 模組
  • 理解字串格式化與匹配
  • 學習列表推導式的實用技巧

4. Discord Webhook 整合

挑戰:如何將爬取的公告自動推送至 Discord 頻道?

解決方案

  • 使用 discord-webhook 函式庫封裝 API 呼叫
  • 設定 rate_limit_retry=True 避免超過 API 限流
  • 格式化訊息內容,使用 \n 分隔與 符號美化

收穫

  • 理解 Webhook 機制與 RESTful API
  • 學習處理 API 速率限制
  • 掌握訊息格式化技巧

5. 輕量化設計哲學

挑戰:如何用最少的程式碼完成完整功能?

解決方案

  • 單一 Python 腳本,僅 56 行程式碼
  • 無需資料庫或複雜框架
  • 直接整合三個核心函式庫

收穫

  • 理解「簡單即是美」的設計哲學
  • 學習權衡功能完整性與程式複雜度
  • 掌握快速原型開發技巧

專案亮點

技術創新

  • ✅ 自定義 HTML 標籤移除演算法(optimize 函數)
  • ✅ 精準的 URL 解析邏輯,處理轉義字元
  • ✅ 日期精準過濾,避免重複推送

實用價值

  • ✅ 解決學生手動查看校園公告的不便
  • ✅ 即時通知機制,不錯過重要訊息
  • ✅ 輕量化設計,部署簡單,維護容易

程式設計

  • ✅ 簡潔優雅的程式碼(56 行完成完整功能)
  • ✅ 模組化函數設計(optimize, get_website)
  • ✅ 清晰的程式流程註解(Chapter 1-4)

學習成果

  • ✅ 掌握網頁爬蟲技術(BeautifulSoup, Requests)
  • ✅ 理解 Webhook 機制與 API 整合
  • ✅ 學習字串處理與日期操作
  • ✅ 實踐自動化腳本開發