はじめに

Paprika を使い始めます。インストールから最初のスクリプトまで 5 分です。

Paprika の動かし方

Paprika は 2 つの部分に分かれます。役割を分けて考えると分かりやすいです。

これは何どう用意する
本体Hub・Worker・管理画面(ブラウザを動かすサーバ群)Docker / CLI で起動サーバー → 3つの構成パターン
SDKpaprika-client(本体を操作する Python ライブラリ)このページpip install

本体を触らずに試すだけなら 管理画面(ブラウザだけで URL を投げて収集)から始めるのが一番手軽です。 このページは、稼働中のハブに対して スクリプトから操作する 人向けです。

SDK をインストール

必要なのは Python 3.10+ と、稼働中ハブへの到達性だけ(依存は httpx のみ)。

# ソースツリーから
pip install -e ./client/python

# または直接
pip install "git+https://github.com/paps-jp/paprika.git#subdirectory=client/python"

ハブに接続

接続先は 引数 → 環境変数 PAPRIKA_HUBhttp://localhost:8000 の順で解決されます。 引数なしの connect() にしておくと、ローカルでもサンドボックス内でも同じスクリプトが動きます。

export PAPRIKA_HUB=http://paprika.lan:8000
import asyncio
from paprika_client import async_paprika

async def main():
    async with async_paprika.connect() as cli:   # PAPRIKA_HUB を自動参照
        print(await cli.health())

asyncio.run(main())

最初のスクリプト

ページを開いてタイトルとリンクを取得する:

import asyncio
from paprika_client import async_paprika

async def main():
    async with async_paprika.connect() as cli:
        async with cli.session("https://news.ycombinator.com") as page:
            print(await page.title())
            for url in await page.links(urls_only=True):
                print(url)

asyncio.run(main())

async with cli.session(url) がブラウザのタブを 1 つ確保し、ブロックを抜けると自動で閉じます。 操作 API は Playwright とほぼ同じ(goto / click / fill / evaluate …)。一覧は API リファレンス

async が苦手なら同期版 ノートブックや簡単なスクリプトには、await を外すだけの同期ファサード sync_paprika もあります(API → 同期版)。

コア概念

用語意味
Hub中央サーバ。ジョブを受け、ワーカーに配り、結果を集める。管理 UI / API もここ
WorkerChrome を抱えたコンテナ。多数が並列で動く
Lane1 つの独立した Chrome(+ noVNC)。ワーカー 1 台に複数
Session1 Lane の予約。cli.session() が握る対話的ブラウザ。タブ複数可
Job「URL を収集する」作業単位。投入 → 実行 → 結果(assets)
Asset収集された 1 ファイル(画像 / 動画 / …)。Hub に集約される

ジョブモード

ジョブ投入時に mode を選びます。

mode用途
fetch既定。URL を開いて画像/動画/HTML を取得。LLM 不要・最速
codegen-loop自然言語のゴール → LLM がスクリプト生成 → 実行 → 失敗時リトライ
vision-agentスクリーンショットを見て LLM がクリック。CSS が効かない画面に強い
rerun既存スクリプトをそのまま実行(Simple Macro が compile した Python もこれ)

2 つの取得経路

「画像を取得する」には用途の違う 2 つの入口があります。混同しないようご注意ください。

経路入口こういう時
Job 経路cli.fetch() / cli.job_*()URL を渡して一括取得(まとめ DL)
Session 経路cli.session() + page.*()クリックやログインを挟んでから取得

次のステップ