Загрузить несколько страниц результатов поиска несложно. Загружать тысячи страниц в час, каждый час, без блокировки, совсем другая задача. Поисковые системы настроены на живых пользователей, поэтому автоматизированный трафик выделяется быстро: запросы с одного адреса начинают получать CAPTCHA, пустые страницы или прямые блокировки, а результаты смещаются в зависимости от географического расположения запроса. Сложность любого поискового инструмента никогда не в парсинге. Она в поддержании доступа к исходным страницам по мере роста объёма.

В этом руководстве показано, как создать поисковый инструмент, надёжно работающий при масштабировании, маршрутизируя каждый исходящий запрос через Crawlbase Smart AI Proxy. Вы направляете стандартный HTTP-клиент на один эндпоинт, и прокси самостоятельно обрабатывает ротацию IP, геотаргетинг и защиту от ботов. Ваш код отвечает за логику запросов и продукт; Crawlbase за надёжность на сетевом уровне. Сначала разберём ограничения, а затем создадим рабочий Python-инструмент, который запрашивает поисковую систему, парсит результаты и возвращает структурированные записи.

Почему скрапинг результатов поиска в масштабе так сложен

Полезно конкретизировать, что именно ломается, поскольку каждый режим отказа указывает на инфраструктуру, которую иначе пришлось бы строить и поддерживать самостоятельно.

Блокировки и баны по IP

Когда множество запросов приходит с одного адреса, это выглядит подозрительно. Пересечение порога приводит к ошибкам, пустым страницам или запросам на верификацию. Один облачный экземпляр может успешно работать в тестировании, а затем дать сбой при появлении реального трафика, потому что объём, нормальный для демонстрации, это именно то, что нарушает лимиты.

Геоограничения и локализованные результаты

Результаты поиска не универсальны. Запрос из Лондона может вернуть другие рейтинги и местные объявления, чем тот же запрос из Нью-Йорка или Берлина. Если ваш продукт зависит от региональных данных, запросы должны выглядеть как исходящие из этих регионов, что означает управление местом выхода каждого запроса.

CAPTCHA и защита от ботов

Современные поисковые платформы используют многоуровневую защиту. Даже когда запрос технически успешен с кодом 200, возвращённая страница может оказаться вызовом, а не реальными результатами. Надёжная обработка этого требует инфраструктуры, адаптирующейся к изменениям систем обнаружения, а не разового исправления.

Ограничение скорости и троттлинг

Высокочастотный трафик с идентифицируемого источника формируется или блокируется. Без распределения запросов по множеству маршрутов пропускная способность в конечном счёте падает до нуля, независимо от эффективности вашего кода. Создание всего этого самостоятельно означает управление пулами прокси, мониторинг сбоев, ротацию адресов и реагирование на изменения обнаружения. Для большинства команд это операционная нагрузка, а не функция.

Почему ротация прокси, правильное решение

Smart AI Proxy находится между вашим приложением и поисковой системой. Вы настраиваете его как обычный прокси, отправляете запросы как обычно и получаете ответы как при прямом подключении. Разница в том, что каждый запрос маршрутизируется через инфраструктуру, специально созданную для автоматизированного сбора данных, поэтому описанные выше режимы отказа перестают быть вашей проблемой.

Характеристики, важные для поискового инструмента:

  • Запросы распределяются по большому пулу IP, а не через один адрес.
  • Паттерны трафика настроены так, чтобы избегать распространённых триггеров блокировки скраперов.
  • Геотаргетинг можно применять для каждого запроса, когда нужны региональные результаты.
  • Специальные клиентские библиотеки не требуются, поэтому подходит любой язык с HTTP-поддержкой.

Дополнительное поведение управляется через заголовок запроса CrawlbaseAPI-Parameters. Именно так, например, включается структурированный парсинг для Google без изменения логики запроса. Необходимые данные подключения кратки:

  • HTTPS (рекомендуется): https://smartproxy.crawlbase.com:8013
  • HTTP: http://smartproxy.crawlbase.com:8012
  • Аутентификация: ваш токен Crawlbase в качестве имени пользователя прокси.
Why SSL verification is off

При маршрутизации через Smart AI Proxy SSL-верификация для пункта назначения обычно отключена, потому что прокси должен инспектировать трафик для применения логики маршрутизации и обработки ответов. В Python это означает передачу verify=False в запросе. Это ожидаемое поведение, ограниченное трафиком, проходящим через прокси, а не глобальная настройка для всего приложения.

Что именно делает инструмент

Поисковый инструмент состоит из нескольких частей, но только одна из них обращается к внешней поисковой системе. Smart AI Proxy находится на этой границе как уровень исходящего сбора данных, изолируя остальную систему от блокировок. Поток короткий:

  1. Пользователь отправляет запрос.
  2. Ваше приложение формирует соответствующий URL поиска.
  3. Запрос выходит через Smart AI Proxy.
  4. Результаты возвращаются из поисковой системы.
  5. Данные нормализуются, а затем сохраняются или отображаются.

Поскольку каждый исходящий запрос проходит через прокси, масштабирование в основном влияет на стоимость и производительность обработки, а не на надёжность. Хрупкая часть (поддержание доступа к источнику) решается один раз на этой границе и затем не меняется по мере роста.

Настройка среды

Вам понадобится Python 3.8 или новее и одна зависимость. Проверьте версию, создайте виртуальную среду, чтобы установка была изолирована, затем добавьте requests.

bash
python --version

python -m venv serp_env
source serp_env/bin/activate

pip install requests

На Windows активируйте среду командой serp_env\Scripts\activate вместо строки с source. Вам также понадобится ваш токен Crawlbase, который одновременно является ключом аутентификации прокси. Получите его на дашборде после регистрации и держите вне системы контроля версий, считывая из переменной окружения.

bash
export CRAWLBASE_TOKEN=your_crawlbase_token_here

Шаг 1: Принятие и нормализация запроса

Поисковые системы ожидают корректно закодированные параметры. Необработанный пользовательский ввод, например best coffee shops Paris, должен стать валидной строкой запроса перед добавлением в URL. Пробелы, специальные символы и не-ASCII-текст ломают запрос, если передаются как есть, поэтому их нужно кодировать. В Python для этого используется quote_plus, превращающий строку в best+coffee+shops+Paris. Размещение этого шага в одном месте окупается позже, поскольку каждая поддерживаемая поисковая система требует того же.

Шаг 2: Формирование целевого SERP URL

Создавайте URL программно, а не склеивая строки вручную в месте вызова. Для базового запроса Google требуется только параметр q, но production-системы обычно расширяются: поддержка пагинации, языковых флагов, настроек безопасного поиска, вариантов устройств и регионального таргетинга. Централизация формирования URL означает, что добавление любого из них позже, изменение в одной функции, а не поиск по всей кодовой базе.

Шаг 3: Маршрутизация запроса через Smart AI Proxy

Прямые запросы к поисковым системам быстро отказывают под нагрузкой, поэтому HTTP-клиент настраивается использовать Smart AI Proxy как исходящий шлюз. Для этого нужны: эндпоинт прокси, аутентификация через токен Crawlbase и стандартная конфигурация прокси, уже поддерживаемая вашей HTTP-библиотекой. С точки зрения вашего приложения это работает как любой корпоративный прокси. Разница в том, что запросы прозрачно маршрутизируются через инфраструктуру, оптимизированную для скрапинга, поэтому они проходят там, где прямой запрос не прошёл бы.

When you need a rendered page

Некоторые страницы результатов рендерят контент на стороне клиента или защищают его более серьёзными вызовами. Когда «сырого» HTML недостаточно, используйте Crawling API, который рендерит страницу в реальном браузере и возвращает готовый HTML или markdown. Smart AI Proxy, выбор по умолчанию для высокопроизводительного получения SERP; Crawling API, инструмент, когда рендеринг или JavaScript-насыщенная цель мешает работе.

Шаг 4: Запрос структурированных результатов

Smart AI Proxy может парсить HTML за вас. Передайте autoparse=true в заголовке CrawlbaseAPI-Parameters, и ответ вернётся в виде JSON вместо «сырой» разметки. Для Google этот JSON включает органические результаты, рекламу, локальный пак и связанные вопросы вместе с полями статуса. В большинстве случаев это полностью устраняет ручной парсинг HTML, один хрупкий компонент меньше для поддержки при обновлении разметки поисковой системой.

Шаг 5: Валидация ответа перед использованием

Production-код должен подтверждать успех запроса перед обращением к полезной нагрузке. Стандартные проверки: HTTP-статус-код, индикатор статуса прокси, наличие ожидаемых полей и логика повторных попыток для временных сбоев. Пример ниже делает базовую версию через raise_for_status(), который превращает неудачный HTTP-ответ в исключение, которое можно перехватить, а не в тихий плохой парсинг ниже по потоку.

Crawlbase Smart AI Proxy

Ваш инструмент формирует запрос, Smart AI Proxy доставляет его до поисковой системы. Направьте любой HTTP-клиент на один эндпоинт, и он маршрутизирует запросы через более чем 1 млн ротирующих резидентных IP, применяет геотаргетинг и поглощает защиту от ботов, которая иначе вас заблокировала бы, без необходимости держать собственный пул прокси или изучать клиентские библиотеки. Добавьте autoparse=true, и SERP вернётся в виде структурированного JSON. Сначала протестируйте на собственных запросах в бесплатном тарифе.

Шаг 6: Создание сквозного фетчера

Вот минимальный фетчер Google SERP, использующий Smart AI Proxy как единственный путь к Google. Он настраивает прокси с вашим токеном, отправляет GET-запрос на URL поиска Google и передаёт autoparse=true, чтобы ответ был структурированным JSON. В ответ вы получаете original_status, cb_status (legacy pc_status), запрошенный url и тело с разобранными результатами. Параметр страны опущен, чтобы фрагмент работал на стандартном плане без геотаргетинга.

python
import json
import os
import requests
from urllib.parse import quote_plus
from urllib3.exceptions import InsecureRequestWarning

requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

def fetch_google_serp(token, query):
    proxy = f"https://{token}:@smartproxy.crawlbase.com:8013"
    proxies = {"http": proxy, "https": proxy}
    url = f"https://www.google.com/search?q={quote_plus(query)}"
    headers = {"CrawlbaseAPI-Parameters": "autoparse=true"}
    response = requests.get(url, headers=headers, proxies=proxies, verify=False, timeout=30)
    response.raise_for_status()
    return json.loads(response.text)

if __name__ == "__main__":
    token = os.environ.get("CRAWLBASE_TOKEN", "YOUR_CRAWLBASE_TOKEN")
    data = fetch_google_serp(token, "best coffee shops Paris")
    print(f"Returned keys: {list(data.keys())}")

Эта функция, основа сбора данных всей системы. Она может работать за API-эндпоинтом, внутри очереди задач или по расписанию и каждый раз возвращает одну и ту же структурированную форму. Вызов quote_plus, нормализация из шага 1, URL, конструирование из шага 2, словарь proxies, маршрутизация из шага 3, заголовок, структурированный парсинг из шага 4, а raise_for_status, валидация из шага 5. Шесть шагов, одна функция.

Шаг 7: Преобразование JSON в структурированные записи

Полезная нагрузка autoparse богатая, но ваш продукт редко нуждается во всём. Следующий шаг, извлечь тело и преобразовать его в компактные записи, которые ожидают ваше хранилище и код ранжирования. Функция ниже извлекает органические результаты в предсказуемый список словарей с рангом, заголовком, URL и сниппетом, обрабатывая отсутствие поля корректно, чтобы один нестандартный результат не ломал весь пакет.

python
def to_records(serp, query):
    body = serp.get("body", {})
    results = body.get("searchResults", [])
    records = []
    for rank, item in enumerate(results, start=1):
        records.append({
            "query": query,
            "rank": rank,
            "title": item.get("title", ""),
            "url": item.get("url", ""),
            "snippet": item.get("description", ""),
        })
    return records

if __name__ == "__main__":
    token = os.environ.get("CRAWLBASE_TOKEN", "YOUR_CRAWLBASE_TOKEN")
    query = "best coffee shops Paris"
    serp = fetch_google_serp(token, query)
    rows = to_records(serp, query)
    print(json.dumps(rows[:3], indent=2))

Вывод, чистая, согласованная схема, которую можно сразу записывать в базу данных, передавать на шаг ранжирования или возвращать из собственного API. Ранняя нормализация в такую форму позволяет позже менять или добавлять поисковые системы без переписывания всего нижестоящего.

json
[
  {
    "query": "best coffee shops Paris",
    "rank": 1,
    "title": "The 10 Best Coffee Shops in Paris",
    "url": "https://example.com/paris-coffee",
    "snippet": "Our guide to the best specialty coffee in the city..."
  }
]

Шаг 8: Интеграция в ваше приложение

Имея фетчер и нормализатор, данные поступают в то, что вы создаёте: кастомный поисковый интерфейс, инструмент конкурентного анализа, дашборд SEO-мониторинга, датасет для маркетинговых исследований или обучающие данные для модели. Большинство систем нормализуют в согласованную схему перед хранением, именно то, что произвёл шаг 7, чтобы аналитика и ранжирование работали со стабильной формой. Суть в том, что остальная часть приложения никогда не имеет дела с прокси, CAPTCHA или изменениями разметки. Она работает с записями.

Масштабирование инструмента без поломки

Масштабирование SERP-инструмента, задача координации по четырём осям, и уровень прокси делает каждую из них управляемой.

Конкурентность. Запустите очередь задач с несколькими воркерами, все отправляющими запросы через один прокси-эндпоинт. Ротация распределяет этот трафик по независимым маршрутам, так что конкурентность увеличивает пропускную способность, а не частоту блокировок. Более подробно об этом читайте в статье как ротировать прокси для скрапинга результатов поиска Google.

Вариации по гео и устройствам. Когда нужны региональные данные, варьируйте параметры местоположения между запросами. Один запрос может вернуть совершенно разные результаты в зависимости от видимого происхождения, это возможность для использования, а не проблема для обхода.

Контроль скорости и стоимости. Даже при наличии уровня прокси неограниченный трафик создаёт ненужные сбои или расходы. Простое ограничение скорости на стороне клиента обычно решает это, удерживая вас в разумных пределах без сложной координации.

Устойчивость. Ожидайте случайных временных ошибок. Повторяйте попытки с задержкой и следите за статус-кодами, чтобы временный сбой не каскадировал в более крупный отказ. Общий план защиты от блокировок описан в статье как скрапить сайты без блокировки.

Ограничения, которые стоит знать перед запуском

Этот подход, хороший выбор по умолчанию, но не универсальное решение. Имейте в виду несколько вещей.

Autoparse охватывает популярные движки, но не каждую страницу. Структурированный парсинг отлично подходит для Google и похожих SERP, но если вы скрапите нишевую или нестандартную страницу результатов, возможно, придётся парсить HTML самостоятельно. Это нормально: просто направьте «сырой» запрос через тот же прокси и парсите локально.

Тяжёлый рендеринг требует браузера. Если цель скрывает результаты за клиентским рендерингом или более серьёзным вызовом, «сырого» HTML недостаточно. В этом случае переведите этот запрос на Crawling API для рендеринга в реальном браузере, оставив остальной инструмент без изменений.

Стоимость растёт с объёмом. Надёжность постоянна, но запросы не бесплатны. Добавляйте троттлинг, кэшируйте повторяющиеся запросы и храните только нужные поля, чтобы не платить за загрузку и хранение данных, которые никогда не будут использованы. Для специфических случаев с CAPTCHA в Google подробнее читайте в статье обход CAPTCHA при скрапинге Google.

Итоги

Ключевые выводы

  • Маршрутизируйте всё через один эндпоинт. Smart AI Proxy, единственная исходящая граница вашего инструмента, изолирующая остальную систему от блокировок, CAPTCHA и геонесоответствий.
  • Нормализуйте запрос, централизуйте URL. Кодируйте пользовательский ввод через quote_plus и формируйте поисковые URL в одной функции, чтобы добавление пагинации или регионов позже было небольшим изменением.
  • Доверяйте autoparse парсинг. Передавайте autoparse=true в CrawlbaseAPI-Parameters, и SERP вернётся в виде JSON, устраняя большую часть ручной обработки HTML.
  • Преобразуйте в компактные записи заблаговременно. Превращайте богатую полезную нагрузку в согласованную схему на раннем этапе, чтобы хранилище, ранжирование и смена поисковых систем оставались простыми в нижестоящем коде.
  • Масштабируйте по четырём осям. Конкурентность, геовариации, контроль скорости и повторы с задержкой вместе превращают демо-скрипт в то, на что можно положиться в production.

Часто задаваемые вопросы

Как проще всего создать поисковый инструмент, который не блокируется?

Маршрутизируйте каждый исходящий запрос через ротирующий прокси вместо прямого обращения к поисковым системам. Smart AI Proxy предоставляет это как готовый эндпоинт: настройте HTTP-клиент на его использование, отправляйте обычные GET-запросы, и он распределяет трафик по множеству IP, поглощая защиту от ботов. Ваш код остаётся сфокусированным на логике запросов и функциях продукта, а не на обслуживании прокси.

Нужно ли самостоятельно парсить HTML?

Обычно нет для популярных поисковых систем. Передайте autoparse=true в заголовке CrawlbaseAPI-Parameters, и Smart AI Proxy вернёт структурированный JSON с органическими результатами, рекламой, локальным паком и связанными вопросами уже разобранными. Вы возвращаетесь к ручному парсингу только для нестандартных страниц результатов, где нет готового парсера, и даже тогда направляете «сырой» запрос через тот же прокси.

Почему SSL-верификация отключена при использовании Smart AI Proxy?

Прокси должен инспектировать трафик для применения логики маршрутизации и обработки ответов, поэтому SSL-верификация для пункта назначения обычно отключена. В Python это означает установку verify=False для запроса. Это применяется только к трафику, проходящему через прокси, а не к другим соединениям вашего приложения, и предупреждение, которое выводит Python, можно подавить, как показано в примере.

Когда использовать Crawling API вместо Smart AI Proxy?

Используйте Smart AI Proxy по умолчанию для высокопроизводительного получения SERP со стандартным HTTP-клиентом. Обращайтесь к Crawling API, когда цель рендерит результаты на стороне клиента или защищает их более серьёзными вызовами, поскольку он рендерит страницу в реальном браузере и возвращает готовый HTML или markdown. Многие инструменты используют прокси для большинства запросов и Crawling API для немногих трудных целей.

Как получить региональные результаты поиска?

Результаты поиска меняются в зависимости от местоположения, поэтому для получения региональных данных варьируйте геотаргетинг для каждого запроса. Один запрос, выданный из разных регионов, возвращает разные рейтинги и местные объявления, что можно намеренно использовать для локализованных продуктов. Геотаргетинг, премиум-функция, поэтому базовый пример здесь опускает параметр страны, чтобы код работал на стандартном плане.

Можно ли использовать другой язык программирования вместо Python?

Да. Smart AI Proxy работает с любым языком, способным отправлять стандартные HTTP-запросы, поскольку это обычный прокси-эндпоинт без обязательных клиентских библиотек. Python использован здесь для удобства локального запуска, но тот же паттерн (настройка прокси, отправка запроса, парсинг JSON) напрямую применим в Node.js, Go, Java, C# и других языках.

Начать создавать

Обходите любой сайт в масштабе, без борьбы с инфраструктурой.

Crawlbase берёт на себя прокси, отпечатки и CAPTCHA, чтобы ваша команда выпускала конвейеры данных вместо поддержки обвязки краулинга. 1 000 запросов бесплатно, без карты.

Самообслуживание · Звонок отдела продаж не требуется · Доступны корпоративные объёмы краулинга