はじめに
Paprika を使い始めます。インストールから最初のスクリプトまで 5 分です。
Paprika の動かし方
Paprika は 2 つの部分に分かれます。役割を分けて考えると分かりやすいです。
| これは何 | どう用意する | |
|---|---|---|
| 本体 | Hub・Worker・管理画面(ブラウザを動かすサーバ群) | Docker / CLI で起動 → サーバー → 3つの構成パターン |
| SDK | paprika-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_HUB → http://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 リファレンス。
コア概念
| 用語 | 意味 |
|---|---|
| Hub | 中央サーバ。ジョブを受け、ワーカーに配り、結果を集める。管理 UI / API もここ |
| Worker | Chrome を抱えたコンテナ。多数が並列で動く |
| Lane | 1 つの独立した Chrome(+ noVNC)。ワーカー 1 台に複数 |
| Session | 1 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.*() | クリックやログインを挟んでから取得 |