一個用於爬取台灣法律法規的專業工具,支援中央法規及地方法規(台北市、新北市、桃園市、台中市、高雄市)。此版本為重構版,優化了程式碼結構和風格。
- 模組化設計:採用基於類的繼承結構,實現程式碼重用
- 配置集中管理:所有配置參數統一在
config.py中管理 - 類型註解:使用 Python 類型提示增強程式可讀性
- 一致的風格:遵循 PEP 8 標準和 Clean Code 原則
- 完善的文檔:每個模組、類、方法都有詳細的文檔字符串
- 自動化測試:使用 GitHub Actions 自動測試爬蟲功能
- 多源爬取:支援中央法規、台北市法規及其他地方法規
- 高效並行:使用 ThreadPoolExecutor 實現多線程爬取
- 異常處理:完善的重試機制和日誌記錄
- 結構化存儲:以 JSON 格式保存所有法規數據
- 用戶友好:帶有進度條顯示,清晰展示爬取進度
| 來源 | 網址 | 狀態 |
|---|---|---|
| 中央法規 | https://law.moj.gov.tw/ | |
| 台北市法規 | https://www.laws.taipei.gov.tw/Law | ✅ 支援 |
| 新北市法規 | https://web.law.ntpc.gov.tw/ | ✅ 支援 |
| 桃園市法規 | https://law.tycg.gov.tw/ | |
| 台中市法規 | https://law.taichung.gov.tw/ | ✅ 支援 |
| 高雄市法規 | https://outlaw.kcg.gov.tw/LawQuery.aspx | ✅ 支援 |
| 台南市法規 | https://law01.tainan.gov.tw/glrsnewsout/ | ❌ 不支援 |
| 其他縣市法規 | ❌ 不支援 |
LawCrawler-Refactored/
├── config.py # 配置文件
├── main.py # 主入口腳本
├── run_tests.py # 測試執行腳本
├── requirements.txt # 依賴項
├── crawler/ # 爬蟲包
│ ├── __init__.py # 包初始化
│ ├── base_crawler.py # 基礎爬蟲類
│ ├── central_law_crawler.py # 中央法規爬蟲
│ └── taipei_law_crawler.py # 台北市法規爬蟲
├── tests/ # 測試包
│ ├── __init__.py # 包初始化
│ └── test_crawlers.py # 爬蟲測試
└── .github/workflows/ # GitHub Actions 工作流程
└── crawler_test.yml # 自動化測試配置
- Python 3.8+
- pip 套件管理工具
- 克隆儲存庫
git clone https://github.com/audi0417/LawCrawler-Refactored.git
cd LawCrawler-Refactored- 安裝依賴套件
pip install -r requirements.txtpython main.pypython main.py --source central # 爬取中央法規
python main.py --source taipei # 爬取台北市法規python -m crawler.central_law_crawler # 爬取中央法規
python -m crawler.taipei_law_crawler # 爬取台北市法規本專案提供多種測試方式,確保爬蟲功能正確運作。
使用 run_tests.py 腳本進行測試:
# 運行所有測試
python run_tests.py
# 測試特定爬蟲
python run_tests.py --source central
# 運行特定類型的測試
python run_tests.py --test urls # 只測試獲取 URL
python run_tests.py --test content # 只測試獲取內容
python run_tests.py --test save # 只測試保存為 JSON
python run_tests.py --test full # 測試完整流程本專案使用 GitHub Actions 進行自動化測試,在以下情況會觸發測試:
- 推送到
main分支時 - 創建 Pull Request 到
main分支時 - 每月1日自動運行
自動化測試會:
- 針對不同的法規來源(中央、台北市)分別測試
- 抓取少量法規並保存為 JSON
- 將產生的 JSON 文件作為構建產物保存
可以在 GitHub 的 Actions 頁面查看測試結果。
所有爬取的法規都會以 JSON 格式保存,基本結構如下:
{
"LawName": "法規名稱",
"LawCategory": "法規分類",
"LawModifiedDate": "最後修改日期",
"LawArticles": [
{
"ArticleNo": "條號",
"ArticleContent": "條文內容"
}
],
"LawURL": "原始網址"
}要添加對新的法規來源的支持,請按以下步驟操作:
- 在
config.py中添加新來源的配置 - 創建一個繼承自
BaseLawCrawler的新爬蟲類 - 實現必要的方法:
get_law_urls(),get_law_json(),run() - 在
main.py中添加對新爬蟲的調用 - 在
tests/test_crawlers.py中添加相應的測試類
例如,添加對新的縣市法規的支持:
class NewCityLawCrawler(BaseLawCrawler):
def __init__(self):
super().__init__(NEW_CITY_LAW_CONFIG)
def get_law_urls(self):
# 實現獲取法規鏈接的邏輯
def get_law_json(self, url):
# 實現獲取和解析法規內容的邏輯
def run(self):
# 實現爬蟲運行流程已內置的效能優化:
- 使用連接池重用 HTTP 連接
- 批量處理 URL,減少記憶體佔用
- 進度條顯示,實時監控爬取進度
- 指數退避重試機制,處理網路不穩定情況
Q: 爬取過程中遇到 HTTP 錯誤怎麼辦?
A: 程式已內建重試機制,會自動重試失敗的請求。如果問題持續存在,請檢查日誌文件了解詳情。
Q: 如何調整爬取速度?
A: 您可以在 config.py 中調整 delay_min, delay_max 和 max_workers 參數來控制爬取速度。
Q: 如何添加對新的法規來源的支持?
A: 請參考「擴展指南」章節。
Q: 自動化測試失敗了怎麼辦?
A: 檢查 GitHub Actions 日誌,並在本地運行 python run_tests.py 進行診斷。可能是目標網站結構變化、網路問題或是爬蟲需要更新。
歡迎提交 Pull Request 或建立 Issue!
- Fork 此倉庫
- 創建您的功能分支:
git checkout -b feature/amazing-feature - 提交您的更改:
git commit -m 'Add some amazing feature' - 推送到分支:
git push origin feature/amazing-feature - 提交 Pull Request
本工具僅供研究和學習使用。請尊重各法規網站的使用條款,不要過度頻繁地訪問這些網站。用戶須自行承擔使用本工具的法律責任。
本專案採用 MIT 授權 - 詳情請參閱 LICENSE 文件
陳楷融 - GitHub Profile
如果您覺得這個專案有幫助,請給它一個 ⭐️!
- v2.0.0 (2025-05-10)
- 完全重構架構
- 實現基於類的繼承設計
- 統一風格和命名約定
- 添加完整的類型註解和文檔
- 增加自動化測試功能
Made with ❤️ in Taiwan