已封存 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 個欄位) - 識別公告單位、標題、日期、連結等資訊
- 使用 BeautifulSoup 解析
- 日期過濾
- 取得系統當前日期(
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 整合
- ✅ 學習字串處理與日期操作
- ✅ 實踐自動化腳本開發