0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ハッカソン開発記#6】Pythonのスクレイピング処理をFastAPIでWeb API化・拡張可能な設計にする

0
Last updated at Posted at 2026-06-02

【ハッカソン開発記#6】Pythonのスクレイピング処理をFastAPIでWeb API化・拡張可能な設計にする

概要

ハッカソンで作った「スクレイピング&Gemini APIでライブ情報を取得するPythonスクリプト」を、Next.js(フロントエンド)から呼び出せる本格的なWeb API(FastAPI)へとリファクタリングしました(ここは期間の都合で、結構AI使いました。6割ぐらい)。

1. アーキテクチャの改善(拡張性への対応)

元々は1つの会場(マリンメッセ)専用のベタ書きスクリプトでしたが、将来的な会場追加(Zepp、ドームなど)を見据えてオブジェクト指向の設計に変更しました。

やったこと

  • 抽象クラス(設計図)の導入 (base.py)
    • VenueScraperBaseクラスを作成し、@abstractmethod で「セレクター取得」や「テキスト取得」のメソッドを定義
  • 会場レジストリ(辞書)による管理 (__init__.py)
    • フロントからの「会場名」と「実行するクラス」の対応表(VENUE_REGISTRY)を作成

2. FastAPIの導入

コンソール出力で終わっていた処理を、常時稼働してJSONを返すAPIに変更しました。

ポイント

  • Pydanticによる型定義とバリデーション
    • JAVA、TypeScriptで学んだ静的言語へ
  • CORS設定
    • フロントエンド(localhost:3000)からバックエンド(localhost:8000)へアクセスできるように CORSMiddleware を設定
  • 状態を持たないクラスの廃止
    • 環境変数を取るためだけの EnvGetter クラスは廃止し、シンプルに os.getenv() を使うように修正(クラスにしていたけど、状態を持たないので、わざわざ作る必要はなさそうという判断)
# Main.py のエンドポイント部分のイメージ
@app.post('/api/search', response_model=SearchResponse)
def search(req: SearchRequest):
    # 1. 会場名から適切なスクレイパーを自動取得
    scraper = get_scraper(req.venue)
    
    # 2. スクレイピング & キーワードフィルタ
    raw_texts = scraper.get_formatted_data()
    filtered = DataFilter().getWordInKeyword(raw_texts, req.keywords)
    
    # 3. Gemini APIでJSON化して返す
    json_str = JsonGetterByAPI().getJson(filtered, api_key)
    events = [LiveEvent(**e) for e in json.loads(json_str)]
    return SearchResponse(venue=req.venue, events=events, total=len(events))

3. 動作確認とテスト方法

FastAPIの「Swagger UI」で簡単にテスト

Swagger UI(自動生成ドキュメント)

  1. uvicorn Main:app --reload でサーバー起動
  2. ブラウザで http://localhost:8000/docs にアクセス
  3. 自動生成されたUIからPOSTリクエストを送り、レスポンスのJSONを目視確認

おまけ 全体アーキテクチャ(クラス図)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?