Skip to content

shim369/Python-Quotes-Scraper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Python Quotes Scraper

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パイプライン

Screenshots

Main Window

Python Quotes Scraper


使用技術

分類 技術
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

Ruff (Linter & Formatter)

uv run ruff check

Mypy (Type Check)

uv run mypy src tests

GitHub Actions (CI)

GitHub Actionsを利用したCIパイプラインを構築しています。

ジョブを以下の2段階に分離し、静的解析(Lint/Type Check)に成功した場合のみテストを実行する構成としています。

1. Lint Job

  • Ruff
  • Mypy

2. Test Job

  • Pytest
test:
  needs: lint

上記により、Lintエラーが発生した場合は不要なテスト実行をスキップし、CIの実行リソースを節約します。


テスト内容

Quoteモデル

  • Quoteオブジェクトの正常生成テスト
  • 不正なデータ型や不足パラメータに対する動作検証

QuoteParser

  • HTML文字列からのテキスト・作者・タグの正確な抽出
  • 要素が欠落している不完全なHTMLに対するフォールバック処理の検証

ScraperService

  • パイプライン(通信・解析・保存)のループ処理の検証
  • pytest.monkeypatch および unittest.mock による HTTP 通信のモック化テスト

QuoteRepository

  • SQLiteへのデータ保存・全件取得
  • インメモリデータベース(:memory:)を活用した、実ファイルに依存しない高速かつクリーンな結合テスト
  • テーブル重複時の INSERT OR IGNORE による挙動の検証

異常系

  • HTTPタイムアウトエラー・サーバーステータスエラー(4xx/5xx)のハンドリング
  • データベース接続エラー時のクローズ処理担保

学習テーマ

本プロジェクトでは以下の技術要素を重点的に学習・実践しました。

Python基礎

  • 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 作成。

License

MIT License

About

A type-safe Python quotes scraper with a CustomTkinter GUI, SQLite storage, and decorator logging. Fully tested via Pytest and GitHub Actions.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages