判例検索・管理システム
プロジェクト概要
裁判所Webサイトから判例情報を自動収集し、全文検索可能なデータベースとして管理するWebアプリケーションです。法律実務や研究における判例調査の効率化を目的として開発しました。
開発の背景
法律実務では判例の検索・参照が日常的に必要ですが、裁判所Webサイトでの検索は以下の課題がありました:
- 検索条件が限定的で、判決文全文からの検索ができない
- 一度閲覧した判例を再度検索する手間がかかる
- 複数の判例を横断的に管理・比較できない
これらの課題を解決するため、判例情報を自動収集し、ローカルデータベースで効率的に管理できるシステムを構築しました。
技術スタック
バックエンド
- Python 3.x - メイン開発言語
- Flask - Webフレームワーク
- SQLite - データベース
- Selenium - Webスクレイピング
- PyPDF2 - PDF解析・テキスト抽出
フロントエンド
- HTML/CSS - UI構築
- JavaScript - 動的機能実装
- Jinja2 - テンプレートエンジン
主要機能
1. 自動スクレイピング機能
- 裁判所Webサイトから最新判例を自動収集
- PDFファイルの自動ダウンロード
- 重複判例のスキップによる効率化
- バックグラウンド実行とステータス表示
2. PDF全文検索
- PyPDF2によるPDF文書のテキスト抽出
- データベースへの全文インデックス化
- 事件名・裁判所名・判決文全体からの横断検索
3. 判例管理機能
- 判例の一覧表示(判決日順)
- 詳細情報の閲覧
- 不要な判例の削除
- PDFファイルとデータベースの同期管理
4. REST API
- 検索API (
/api/search) - スクレイピング制御API (
/api/scrape,/api/scrape/status) - 判例削除API (
/api/hanrei/<id>)
技術的な工夫
スクレイピングの安定性確保
# Selenium WebDriverの適切な設定
options = webdriver.ChromeOptions()
options.add_argument('--user-data-dir=' + userdata_dir)
options.add_argument('--headless') # バックグラウンド実行
非同期処理によるUX向上
# スレッドによる非同期スクレイピング実行
thread = threading.Thread(target=run_scraper)
thread.start()
進捗状況をリアルタイムで表示することで、ユーザーに実行状態を可視化しています。
データベース設計の拡張性
# 動的なカラム追加処理
if 'pdf_text' not in columns:
cursor.execute('ALTER TABLE hanrei ADD COLUMN pdf_text TEXT')
既存データを保持しながら、新機能追加時にスキーマを拡張できる設計を採用しました。
効率的なPDFテキスト抽出
- 初回アクセス時のオンデマンド抽出
- 抽出結果のキャッシュによる高速化
- エラーハンドリングによる堅牢性確保
開発期間
約2日(設計・実装・テスト含む)
今後の展開
- 高度な検索条件(判決日範囲、裁判所絞り込み等)の追加
- 判例のタグ付け・分類機能
- エクスポート機能(CSV、PDF一括ダウンロード)
- マルチユーザー対応とアクセス制御
本プロジェクトを通じて、WebスクレイピングにおけるSeleniumの活用、PDF文書処理、Flaskを用いたREST API設計、非同期処理によるUX向上など、実践的なWebアプリケーション開発スキルを習得しました。