раздел 03
Интеграция по API
Все запросы идут на один эндпоинт https://serpapi.com/search. Параметры передаются в URL: движок, фраза, ключ и при необходимости язык, страна, локация. Ответ - JSON.
Ключ в переменной окружения
Не хардкодьте ключ в коде. Положите его в файл .env и читайте оттуда. Так ключ не попадёт в репозиторий.
SERPAPI_API_KEY=ваш_ключ_здесь
Запрос через curl
Самый простой способ проверить вызов из терминала. Подставьте свой ключ в параметр api_key:
curl "https://serpapi.com/search?engine=google&q=coffee&api_key=$SERPAPI_API_KEY"
В ответ придёт JSON со всей выдачей. Чтобы посмотреть только органику, можно прогнать вывод через jq:
curl -s "https://serpapi.com/search?engine=google&q=coffee&hl=ru&gl=ru&api_key=$SERPAPI_API_KEY" \
| jq '.organic_results[] | {title, link}'
Запрос на Python
У сервиса есть официальный клиент - пакет google-search-results. Ставится через pip:
pip install google-search-results
Базовый пример: задаём параметры словарём, получаем ответ как обычный dict.
import os
from serpapi import GoogleSearch
params = {
"engine": "google",
"q": "coffee",
"hl": "ru",
"gl": "ru",
"api_key": os.environ["SERPAPI_API_KEY"],
}
search = GoogleSearch(params)
data = search.get_dict()
for item in data.get("organic_results", []):
print(item["title"], "-", item["link"])
Для JavaScript и Node.js есть отдельный клиент - пакет serpapi. Логика та же: передаёте параметры, получаете JSON.
Как достать нужные поля
Ответ - вложенный объект, поэтому читайте поля аккуратно и проверяйте их наличие:
# прямой ответ, если поисковик его показал
answer = data.get("answer_box", {}).get("answer")
# первые три органических результата
top = [
{"title": r["title"], "link": r["link"], "snippet": r.get("snippet")}
for r in data.get("organic_results", [])[:3]
]
Используйте get с дефолтом, а не прямое обращение по ключу: не каждый блок есть в каждом ответе. Если answer_box не было, прямое чтение упадёт с ошибкой, а get вернёт пустое значение.
SerpAPI как веб-поиск для AI-агента
Главный современный сценарий - дать языковой модели инструмент поиска в интернете. Схема простая: агент решает, что нужно поискать, формулирует запрос, ваш код дёргает SerpAPI, забирает несколько верхних результатов и отдаёт их модели как контекст. Дальше модель отвечает, опираясь на свежие данные, а не только на то, что было в обучении.
def web_search(query: str, k: int = 5) -> list[dict]:
"""Инструмент веб-поиска для агента: вернуть k верхних результатов."""
from serpapi import GoogleSearch
search = GoogleSearch({
"engine": "google",
"q": query,
"num": k,
"api_key": os.environ["SERPAPI_API_KEY"],
})
data = search.get_dict()
return [
{"title": r["title"], "link": r["link"], "snippet": r.get("snippet", "")}
for r in data.get("organic_results", [])[:k]
]
Такую функцию регистрируют как инструмент модели (tool / function calling): модель сама вызывает web_search, когда ей не хватает знаний, и получает обратно компактный список результатов.