PythonでAIエージェントを構築する方法
Senior Web Scraping Engineer
TL;DR:
- AIエージェントはループです:モデルがツールを選択し、あなたのコードが実行し、結果がモデルに戻ります。 知性は言語モデルにあり、リーチは提供したツールから来ます。研究とモニタリングにおいて重要な2つのツールは、ウェブ検索とページフェッチです。
- エージェントに実際のウェブツールを与え、固定されたトレーニングセットを与えないでください。 Deep SerpApiに基づく
web_searchツールはライブのGoogle結果を返し、Universal Scraping APIに基づくfetch_pageツールはレンダリングされたHTMLを返します — したがって、エージェントは昨年のデータではなく現在のデータを考慮します。 - 両方のツールは各々1つのHTTP POSTです。 検索は
POST /api/v1/scraper/requestをscraper.google.searchアクターで呼び出し、フェッチはPOST /api/v1/unlocker/requestをjs_renderで呼び出します。管理するブラウザもなく、プロキシプールを回す必要もありません。 - モデルが制御フローを持っています。 ツールのシグニチャを公開し、モデルが何を呼び出し、いつ呼び出すかを決め、あなたは実行し、結果をフィードバックします — そのループがエージェント全体です。
- ツール層を決定論的で検証可能に保つ。 検索とフェッチの呼び出しは、モデルとは独立してテストできる構造化データを返します; そこから信頼性が生まれます。
- 無料で始められます。 新しいScrapelessアカウントには無料のDeep SerpApiランタイムが含まれています — app.scrapeless.comでサインアップしてください。
はじめに:エージェントはそのツールによってのみ良くなります
言語モデル単体では推論できますが、今日のウェブを見ることはできません — 切り捨てられたトレーニングデータから回答します。AIエージェントは、モデルをループでラップすることでそのギャップを埋めます:モデルがツールを実行するように要求し、あなたのコードがライブデータに対して実行し、その結果が会話に戻ります。モデルが回答するために必要なものを得るまで繰り返します。
難しいのはループではなく、ツールです。研究エージェントはオープンウェブを検索し、見つけたページを読む必要があり、どちらも実際のサイトでは壊れます:検索エンジンはレート制限をかけ、ターゲットページはJavaScriptでレンダリングされるか、ボット防御の背後にあります。それを手動で対応するのがほとんどの作業です。
このガイドでは、両方のツールが管理されたHTTP呼び出しであるPythonの研究エージェントを構築します:web_searchはScrapeless Deep SerpApiで実行され、fetch_pageはUniversal Scraping APIで実行されます。以下のツール層はライブAPIに対して検証済みです;モデルの推論ループは標準のツール呼び出しパターンで示されています。公開データのみです。
パイプラインの概要
エージェントは4つの部分で成り立っており、中央の2つだけがウェブに触れます:
- 目的入力 — ユーザーからの質問または研究タスク。
web_search(query)— Deep SerpApi経由のライブGoogle結果(タイトル、リンク、スニペット)。fetch_page(url)— Universal Scraping API経由でモデルが読みたい任意の結果のレンダリングされたHTML。- モデルループ — 言語モデルがどのツールを呼び出すかを決定し、結果を読み取り、別のツールを呼び出すか最終的な回答を書きます。
ステップ2と3は決定論的HTTP呼び出しであり、それ自体で検証できます。ステップ4はモデルであり、ステップ1〜3はその回答を現在のものにします。
前提条件
- Python 3.10以上
pip install requests(プラス、あなたのモデルプロバイダーのSDK)- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップしてください
- 推論ループ(ステップ3)のためのモデルプロバイダーAPIキー
bash
export SCRAPELESS_API_KEY="your_api_token_here"
ステップ1 — ウェブ検索ツール
検索ツールは、Deep SerpApi Google Searchアクターにクエリを投稿し、オーガニックな結果のコンパクトなリスト — タイトル、リンク、スニペット — を返します。これはモデルが次に読むべきものを決めるために必要なものです:
python
import os
import requests
API = "https://api.scrapeless.com"
HEADERS = {
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
}
def web_search(query: str, count: int = 5):
r = requests.post(
f"{API}/api/v1/scraper/request",
headers=HEADERS,
json={
"actor": "scraper.google.search",
"input": {"q": query, "hl": "en", "gl": "us"},
},
timeout=90,
)
r.raise_for_status()
results = r.json().get("organic_results", [])[:count]
return [
{"title": x.get("title"), "link": x.get("link"), "snippet": x.get("snippet")}
for x in results
]
# 形を確認するために単独で実行します:
hits = web_search("best web scraping tools 2026", 3)
print(len(hits), "results")
for h in hits:
print("-", h["title"], "|", h["link"])
アクターは標準的な検索フィールドを持つorganic_resultsを返します。この関数は、モデルのコンテキストをフルSERPであふれさせないように、上位countにトリミングします。
無料プランでAPIキーを取得できます: app.scrapeless.com
ステップ2 — ページフェッチツール
モデルが結果を取得するために読み取ると、ページコンテンツが必要です。フェッチツールは、js_renderをオンにしてURLをユニバーサルスクレイピングAPIに投稿するため、クライアントレンダリングされたページが空のシェルではなく、完成したHTMLとして返されます。
python
import os
import requests
API = "https://api.scrapeless.com"
HEADERS = {
"Content-Type": "application/json",
"x-api-token": os.environ["SCRAPELESS_API_KEY"],
}
def fetch_page(url: str):
r = requests.post(
f"{API}/api/v1/unlocker/request",
headers=HEADERS,
json={
"actor": "unlocker.webunlocker",
"input": {"url": url, "method": "GET", "js_render": True},
},
timeout=120,
)
r.raise_for_status()
return r.json().get("data", "")
# レンダリングされたページを取得し、HTMLが返されることを確認します。
html = fetch_page("https://www.scrapeless.com/en")
print("取得したバイト数", len(html), "バイト")
HTMLをモデルに渡す前に、テキストに変換します(selectolaxまたはBeautifulSoupを使用)ので、コンテンツにコンテキストを費やし、マークアップには費やしません。ツール自体は生のHTMLを返し続け、エージェントがどれだけ読み取るかを決定させます。
ステップ3 — モデルループ
両方のツールが検証されたので、エージェントはモデルがそれらを呼び出すためのループです。モデルプロバイダーのツール呼び出しAPIに2つのツールシグネチャを公開し、その後、標準的なサイクルを実行します:会話を送信し、モデルがツール呼び出しを返している間、そのツールを実行し、結果を追加します。テキストが返されたら、それが答えです。
注意:このステップはモデルプロバイダーを呼び出し、そのプロバイダーのAPIキーが必要です。上記のツール関数は単独で完全に実行可能です;以下のループはそれらにワイヤードされた標準のツール呼び出しパターンです。
python
TOOLS = [
{
"name": "web_search",
"description": "Googleでクエリを検索; タイトル、リンク、スニペットを返します。",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"],
},
},
{
"name": "fetch_page",
"description": "URLのレンダリングされたHTMLを取得します。",
"input_schema": {
"type": "object",
"properties": {"url": {"type": "string"}},
"required": ["url"],
},
},
]
DISPATCH = {"web_search": web_search, "fetch_page": fetch_page}
def run_agent(client, goal: str):
messages = [{"role": "user", "content": goal}]
while True:
reply = client.run(messages=messages, tools=TOOLS) # プロバイダーのツール呼び出し
if reply.tool_call:
name, args = reply.tool_call.name, reply.tool_call.args
result = DISPATCH[name](**args)
messages.append({"role": "tool", "name": name, "content": result})
continue
return reply.text
その形状はプロバイダーに依存しません:すべての主要なツール呼び出しAPIは、「モデルがツールXを引数Yで呼び出したい」と示します。DISPATCH[X](**Y)を実行し、結果を追加し、ループします。エージェントの能力は、2つのツールが実際の最新データを返すことから来ています — それがこのガイドが検証した部分です。
##返されるもの
各web_searchの結果は、モデルが直接推論できるフラットなレコードです:
json
[
{
"title": "2026年のベストウェブスクレイピングツール",
"link": "https://dev.to/nitinfab/best-web-scraping-tools-in-2026-i-tested-30-tools-and-these-are-the-only-ones-worth-using-11l3",
"snippet": "レンダリング、プロキシ、および価格にわたるスクレイピングツールの実際の比較..."
}
]
// スキーマはweb_searchが返すものと正確に一致しています。フィールド値は例示的なサンプルです。
いくつかの正直な観察:
- モデルに到達する前に検索結果をトリミングします。 上位3〜5件で通常は十分です;完全なSERPはコンテキストとコストを無駄にします。
- エージェントでHTMLをテキストに変換しますが、ツールではありません。
fetch_pageは生のHTMLを返し続け、決定論的状態を保つべきです;トークン予算を管理できる場所でクリーンアップを行います。 - ループに上限を設けます。 混乱した実行がスピンできないように、エージェントに最大ツール呼び出し数を設定します — 硬い上限を設け、再実行しません。
- ツールは独立してテスト可能です。 検索とフェッチは単純なHTTPであるため、モデルのループなしで単体テストが可能であり、信頼性が求められるところです。
結論:ツールがエージェントを作ります
リサーチエージェントは、能力のあるモデルの周りを小さなループで囲むものです — 効力はツールにあります。web_search を Deep SerpApi でバックアップし、fetch_page をユニバーサルスクレイピング API でバックアップすると、エージェントは古いトレーニングデータではなく、ライブの Google 結果とレンダリングされたページをもとに推論できます。ブラウザ群やプロキシローテーションを維持する必要はありません。まずツールを構築し、それらを独自に検証してから、モデルループをそれらの周りにラップします。HTTP コールの代わりに完全なブラウザを駆動するエージェントについては、Scraping Browser での検索エージェントの構築 を参照してください。 Deep SerpApi の製品ページ や ドキュメント はすべてのアクターをカバーしています。ツールを検証し、モデルに駆動させ、ループを制限します。
AI駆動のデータパイプラインを構築する準備はできましたか?
エージェントやリサーチパイプラインを構築している開発者とつながるために、無料プランを請求するコミュニティに参加してください:Discord · Telegram。
app.scrapeless.com にサインアップして、無料の Deep SerpApi ランタイムを取得し、すでに使用しているエージェントフレームワークに検索ツールと取得ツールを接続してください。価格設定 を参照してスケールを確認してください。
よくある質問(FAQ)
Q: これを構築するために特定のモデルプロバイダーが必要ですか?
いいえ。ループはプロバイダーに依存しません — どのツール呼び出し API でも機能します。お使いのプロバイダーの client.run(...) コールに置き換えてください;web_search と fetch_page ツールは同じままです。
Q: ツールのために管理された API を使う理由は何ですか? requests やヘッドレスブラウザの代わりに?
オープンウェブは生のスクレイパーと戦うからです:検索エンジンはレート制限を設け、ターゲットページはクライアントサイドでレンダリングされるか、課題の背後に隠されています。Deep SerpApi とユニバーサルスクレイピング API はレンダリングとアクセスを処理するため、ツールはブロックではなくクリーンなデータを返します。
Q: エージェントのウェブアクセスは合法ですか?
エージェントは公開されているデータを収集します。データの保存方法や使用方法は各サイトの利用規約や地域の法律に従って管理されます — 公開データのみへのアクセスを行い、利用規約を尊重し、使用ケースについて法律相談をしてください。
Q: エージェントが無限にループするのをどう止めますか?
実行ごとのツール呼び出し回数を制限し、制限に達したら停止します。これは制御フローに対する厳格な上限であり、エラーハンドリングではありません。
Q: 取得したページはどれくらいの大きさになる可能性がありますか?
大きくなる可能性があります — 単一のコンテンツページは数百キロバイトのHTMLを返すことがあります。テキストに変換してからモデルに渡す前に切り詰めることで、コンテキストの予算を管理します。
Q: エージェントは2つ以上のツールを使用できますか?
はい。構造化データを返す任意のツールを TOOLS リストと DISPATCH マップに追加し、モデルはそれを同じ方法で呼び出すことができます。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



