Python学習およびポートフォリオ作成を目的として開発した、GUIベースの名言(Quotes)スクレイピング・蓄積アプリケーションです。
Python3エンジニア認定実践試験の学習範囲を、Webスクレイピング・GUI・データベースを利用した実践的なアプリケーション開発を通して体系的に学ぶことを目的として作成しました。
Quotes to Scrape から名言データを取得し、GUI上で表示・管理するデスクトップアプリケーションです。
HTTP通信、HTML解析(BeautifulSoup)、SQLiteによる永続化、ログ出力、GitHub ActionsによるCI環境を実装しています。
また、CustomTkinterによるモダンなGUI、責務分離(Parser・Service・Repository)、依存性注入(DI)を採用し、保守性・拡張性を意識した設計を行いました。
- 複数ページ(1〜5ページ)にまたがる名言データの一括自動収集
- httpxによるHTTP通信および適切なヘッダー設定(User-Agent)
- BeautifulSoupによるHTML解析(テキスト、作者、タグの抽出)
- SQLite3による名言データの永続化保存・一覧表示
- データベースの一意制約(
UNIQUE(text, author))とINSERT OR IGNOREによる自動重複排除 - loggingによる詳細なアプリ実行ログの出力(コンソール・ファイル同時出力)
- デコレータの重ねがけによる「処理状態ログ出力」および「ミリ秒単位の実行時間計測」
- Dependency Injection(DI / Protocolによる抽象依存)
- RepositoryパターンによるDBアクセス層の隠蔽
- GitHub Actionsによる自動CIパイプライン
| 分類 | 技術 |
|---|---|
| Language | Python 3.12+ |
| Package Management | uv |
| GUI | CustomTkinter |
| HTTP Client | httpx |
| HTML Parser | BeautifulSoup4 |
| Database | SQLite3 |
| Testing | Pytest |
| Linter | Ruff |
| Type Check | Mypy |
| CI/CD | GitHub Actions |
src/
└── quotes_app/
├── database/
│ └── quote_repository.py
├── gui/
│ └── main_window.py
├── models/
│ └── quote.py
├── parsers/
│ └── quote_parser.py
├── services/
│ └── scraper_service.py
├── utils/
│ ├── decorators.py
│ └── logger.py
└── main.py
tests/
├── database/
│ └── test_quote_repository.py
├── models/
│ └── test_quote.py
├── parsers/
│ └── test_quote_parser.py
└── services/
└── test_scraper_service.py
logs/
- Python 3.12以上
- uv
uvがインストールされていない場合は以下を実行してください。
pip install uv
git clone <repository-url>
cd Python-Quotes-Scraper
uv sync
uv run quotes-app
uv run pytest
uv run ruff check
uv run mypy src tests
GitHub Actionsを利用したCIパイプラインを構築しています。
ジョブを以下の2段階に分離し、静的解析(Lint/Type Check)に成功した場合のみテストを実行する構成としています。
- Ruff
- Mypy
- Pytest
test:
needs: lint
上記により、Lintエラーが発生した場合は不要なテスト実行をスキップし、CIの実行リソースを節約します。
- Quoteオブジェクトの正常生成テスト
- 不正なデータ型や不足パラメータに対する動作検証
- HTML文字列からのテキスト・作者・タグの正確な抽出
- 要素が欠落している不完全なHTMLに対するフォールバック処理の検証
- パイプライン(通信・解析・保存)のループ処理の検証
pytest.monkeypatchおよびunittest.mockによる HTTP 通信のモック化テスト
- SQLiteへのデータ保存・全件取得
- インメモリデータベース(
:memory:)を活用した、実ファイルに依存しない高速かつクリーンな結合テスト - テーブル重複時の
INSERT OR IGNOREによる挙動の検証
- HTTPタイムアウトエラー・サーバーステータスエラー(4xx/5xx)のハンドリング
- データベース接続エラー時のクローズ処理担保
本プロジェクトでは以下の技術要素を重点的に学習・実践しました。
- dataclassによる値オブジェクト(データモデル)設計
- 配列操作・リスト内包表記
- SQLite3標準ライブラリの適切な接続ハンドリング
- クラス設計とカプセル化
- WebスクレイピングとDOM解析の基礎
- loggingによる柔軟なログローテーション設定
- デコレータの高度な活用(
functools.wraps、可変長引数*args/kwargs) - デコレータの適用順序(Chainingによるアスペクト指向プログラミング)
- 厳格な型ヒント(
Protocolクラスを用いたダックタイピングの明示化) - Dependency Injection(DIによる疎結合設計)
- Repositoryパターンによるデータアクセス層の分離
- pytestによるTDD風のテストコードファースト開発
unittest.mockを用いた外部依存(ネットワーク)の排除- GitHub ActionsによるCIパイプライン構築
- Ruff/Mypyによる自動コード品質ガードレールの導入
- テスト自動化の強化:
pytest-covを導入し、テストカバー率を可視化する。 - 非同期スクレイピングの導入:
httpx.AsyncClientを利用し、複数ページの同時並行ダウンロードによる高速化。 - キーワード検索・フィルタリング機能: GUI上にタグや作者名で名言を絞り込める検索バーの実装。
- ページネーションGUI: 保存された大量の名言をページ分割して快適に閲覧できるリストビューへのアップグレード。
- Docker対応: 動作環境に依存せず一発起動できるマルチステージビルドの Dockerfile 作成。
MIT License
