Загрузить несколько страниц результатов поиска несложно. Загружать тысячи страниц в час, каждый час, без блокировки, совсем другая задача. Поисковые системы настроены на живых пользователей, поэтому автоматизированный трафик выделяется быстро: запросы с одного адреса начинают получать 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 в качестве имени пользователя прокси.
При маршрутизации через Smart AI Proxy SSL-верификация для пункта назначения обычно отключена, потому что прокси должен инспектировать трафик для применения логики маршрутизации и обработки ответов. В Python это означает передачу verify=False в запросе. Это ожидаемое поведение, ограниченное трафиком, проходящим через прокси, а не глобальная настройка для всего приложения.
Что именно делает инструмент
Поисковый инструмент состоит из нескольких частей, но только одна из них обращается к внешней поисковой системе. Smart AI Proxy находится на этой границе как уровень исходящего сбора данных, изолируя остальную систему от блокировок. Поток короткий:
- Пользователь отправляет запрос.
- Ваше приложение формирует соответствующий URL поиска.
- Запрос выходит через Smart AI Proxy.
- Результаты возвращаются из поисковой системы.
- Данные нормализуются, а затем сохраняются или отображаются.
Поскольку каждый исходящий запрос проходит через прокси, масштабирование в основном влияет на стоимость и производительность обработки, а не на надёжность. Хрупкая часть (поддержание доступа к источнику) решается один раз на этой границе и затем не меняется по мере роста.
Настройка среды
Вам понадобится Python 3.8 или новее и одна зависимость. Проверьте версию, создайте виртуальную среду, чтобы установка была изолирована, затем добавьте requests.
python --version python -m venv serp_env source serp_env/bin/activate pip install requests
На Windows активируйте среду командой serp_env\Scripts\activate вместо строки с source. Вам также понадобится ваш токен Crawlbase, который одновременно является ключом аутентификации прокси. Получите его на дашборде после регистрации и держите вне системы контроля версий, считывая из переменной окружения.
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-библиотекой. С точки зрения вашего приложения это работает как любой корпоративный прокси. Разница в том, что запросы прозрачно маршрутизируются через инфраструктуру, оптимизированную для скрапинга, поэтому они проходят там, где прямой запрос не прошёл бы.
Некоторые страницы результатов рендерят контент на стороне клиента или защищают его более серьёзными вызовами. Когда «сырого» 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-ответ в исключение, которое можно перехватить, а не в тихий плохой парсинг ниже по потоку.
Ваш инструмент формирует запрос, 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 и тело с разобранными результатами. Параметр страны опущен, чтобы фрагмент работал на стандартном плане без геотаргетинга.
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 и сниппетом, обрабатывая отсутствие поля корректно, чтобы один нестандартный результат не ломал весь пакет.
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. Ранняя нормализация в такую форму позволяет позже менять или добавлять поисковые системы без переписывания всего нижестоящего.
[ { "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 запросов бесплатно, без карты.

