Содержание
Два привычных способа снять позиции в Google перестали работать. С начала 2025 года Google не отдаёт выдачу без JavaScript, и скрипт, который запрашивает google.com/search и разбирает HTML, вместо результатов получает требование включить JavaScript. А Custom Search JSON API, на котором держались рецепты «позиции через официальный API», закрыт для новых клиентов. Тем, кто подключился раньше, Google оставил время до 1 января 2027 года.
Я проверил, что лежит в открытом доступе. Самый популярный трекер позиций на Python на GitHub (305 звёзд) запрашивает google.com напрямую через requests и ищет блоки выдачи по CSS-классам yuRUbf и P8ujBc, его последний коммит сделан в январе 2024 года. Второй по заметности тоже обращается к google.com напрямую, только через библиотеку RoboBrowser, и заброшен с 2022-го. Подборка «скриптов для SEO на 2026 год» от хостинг-провайдера, вышедшая в январе, по-прежнему советует прямой парсинг с паузой между запросами.
Поэтому я собрал свой скрипт и выкладываю его целиком.
Откуда теперь брать позиции
Рабочих источников три, и они отвечают на разные вопросы.
| Параметр | Search Console API | SERP API | Браузер |
|---|---|---|---|
| Чьи позиции | только подтверждённого сайта | любого сайта, включая конкурентов | любого сайта |
| Какие запросы | только те, по которым сайт уже показывался | любые | любые |
| Что за число | средняя позиция за период | позиция в одном снимке выдачи | позиция в одном снимке выдачи |
| Регион | срез по странам | задаётся в запросе, вплоть до города | задаётся параметром uule, вплоть до города |
| Цена | бесплатно | за каждый запрос | бесплатно, но только для небольших объёмов |
| Главный риск | молчит там, где сайта нет в выдаче | зависимость от стороннего сервиса | капча и правила Google |
Search Console честнее всех описывает реальность, но молчит там, где сайт не показывается. А проверить обычно нужно именно такие запросы.
SERP API, то есть сервис, который сам снимает выдачу и отдаёт её в машинном формате, видит любой запрос в любом городе. В скрипте это XMLRiver. У него есть выдача Google и Яндекса и справочник регионов до уровня города, а базовый тариф без предоплаты стоит 25 ₽ за 1000 запросов, или 2,5 копейки за страницу выдачи. Браузер бесплатен, но работает не любой.
Какой браузер пускает Google
Обычный Chromium под управлением Playwright получил у меня капчу на первом же запросе, причём и в фоновом режиме, и в видимом окне. Ту же картину показал независимый тест Иэна Патерсона (май 2026, обновлён в августе). Из шести браузеров для автоматизации, которые он проверял, выдачу Google отдали только трём: CloakBrowser, nodriver и Camoufox. Patchright, rebrowser и обычный Playwright получили блокировку. Тест снят за одну ночь с одного домашнего IP, поэтому я считаю его свидетельством, а не гарантией.
Скрипт использует CloakBrowser. Это Chromium, у которого отпечаток изменён на уровне исходного кода, с Python-обёрткой под лицензией MIT и тем же API, что у Playwright. Сам браузер скачивается готовым бинарником в бесплатной или платной версии Pro. На двух рабочих прогонах, в 21 и 15 запросов, он обратился к Google 36 раз подряд без капчи, а пробный прогон до этого упёрся в капчу на восьмом запросе. По моей оценке, этого хватит на десятки запросов в день, но не на мониторинг тысяч ключей.
Без двух деталей браузерный режим врёт.
Google теперь заворачивает ссылки результатов в /goto?url= с зашифрованным адресом. Скрипт, который берёт домен из href, видит в выдаче одни адреса Google и не находит ничего. Поэтому домен берётся из строки адреса над заголовком, а полный URL восстанавливается запросом к редиректу, и только для найденной страницы сайта.
Вторая деталь касается капчи. После неё продолжать бессмысленно, поэтому скрипт останавливается и помечает оставшиеся запросы как пропущенные, а не записывает их в «сайта нет в выдаче».
У браузерного режима есть и юридическая сторона. Google подал в суд на SerpApi за обход защитных мер поисковой выдачи. Проверять позиции своего сайта раз в день и перепродавать выдачу — разные вещи. Но robots.txt Google закрывает раздел /search для всех роботов, и решение о таком режиме каждый принимает сам.
Что делает скрипт
- Берёт список запросов из текстового файла и домен сайта. Источник выбирается флагом
--source(xmlriver,gscилиbrowser). - В выдачных режимах листает страницы по 10 результатов и останавливается на той, где нашёл сайт. Запрос на первой позиции стоит одно обращение, а не три.
- Находит первую страницу сайта в выдаче и отдельно записывает другие его URL на тех же страницах. Так видно, где две страницы конкурируют за один запрос.
- Записывает три первых домена выдачи.
- Для Search Console одним обращением к API берёт среднюю позицию, показы и клики за период.
- Дописывает результат в CSV-историю и считает изменение против прошлого прогона того же источника, региона и устройства (
+3,dropped,entered). - Повторяет запрос при сбоях. XMLRiver на ошибке поисковика отвечает HTTP 200 с кодом 500 внутри XML, и без проверки тела такой ответ легко принять за пустую выдачу.
Режим XMLRiver работает на стандартной библиотеке Python 3.9+. Для Search Console нужен google-auth, для браузера нужен cloakbrowser. В самом скрипте нет ни одного ключа и ни одного адреса. ID и ключ XMLRiver, ресурс Search Console и путь к JSON-ключу вписываются в файл .env, образец которого лежит рядом. Пошаговая настройка каждого источника, включая создание сервисного аккаунта Google, описана в README к скрипту.
# XMLRiver: сначала посчитать запросы и стоимость, потом Москва, google.ru, ТОП-30
python google_positions.py -k keywords.txt -s example.ru --pages 3 --dry-run
python google_positions.py -k keywords.txt -s example.ru \
--loc 1011969 --lang ru --gdomain 143 --pages 3
# Search Console: ресурс и ключ берутся из .env, средняя позиция за 28 дней по России
python google_positions.py -k keywords.txt -s example.ru --source gsc --gsc-country rus
# Браузер: Москва, ТОП-20, пауза 8–14 секунд между страницами
python google_positions.py -k keywords.txt -s example.ru --source browser \
--city "Moscow,Moscow,Russia" --lang ru --gl ru --pages 2
Регион в XMLRiver задаётся числовым кодом из справочника xmlriver.com/files/geo.csv. В браузере нужно каноническое имя места из третьей колонки того же файла, например Moscow,Moscow,Russia. Ни то ни другое нельзя угадывать. У меня в рабочих заметках какое-то время стоял код, который выглядел как Москва, а при сверке со справочником оказался аргентинским городом Кампана. Выдача по нему собиралась без ошибок и выглядела правдоподобно. Поэтому код города после настройки стоит сверить со справочником и записать в отчёт рядом с цифрами.
Проверка на нейтральных запросах
я прогнал скрипт двумя выдачными источниками, XMLRiver и браузером, на одном наборе. Сайт ru.wikipedia.org, Москва, десктоп, google.ru, глубина 30.
Первым идёт контроль, то есть запрос, по которому сайт гарантированно первый. Для Википедии это «википедия», и оба источника поставили её на первое место. Пока контроль не прошёл, пустой результат по остальным запросам ничего не значит. Ровное «сайта нет в выдаче» по всему списку чаще выдаёт неверный домен или регион, чем реальную картину.
Затем шли шесть запросов разного типа.
| Запрос | XMLRiver | Браузер | Первые домены выдачи |
|---|---|---|---|
| фотосинтез | 1 | 1 | ru.wikipedia.org, затем образовательные и научные сайты |
| теорема пифагора | 1 | 1 | ru.wikipedia.org |
| рецепт борща | вне ТОП-30 | вне ТОП-30 | andychef.ru, russianfood.com |
| как выбрать велосипед | вне ТОП-30 | вне ТОП-30 | velostrana.ru, pro-bike.ru |
| ремонт стиральной машины | вне ТОП-30 | вне ТОП-30 | profi.ru, moskva.remontgis.ru |
| купить ноутбук | вне ТОП-30 | вне ТОП-30 | technopark.ru, store77.net |
Позиции совпали по всем семи запросам, первый домен выдачи тоже совпал. Второй и третий кое-где разошлись. По «фотосинтезу» в одном снимке на втором месте стоял biocpm.ru, в другом externat.foxford.ru. Снимки сняты разными способами с разницей в несколько минут, и первые места в них оказались устойчивее следующих.
XMLRiver потратил 15 обращений, около 38 копеек по базовому тарифу. Браузер сделал 15 запросов к Google без капчи. Экономия видна по числу обращений, ведь там, где сайт нашёлся на первой странице, скрипт дальше не листал.
Search Console на чужом сайте показать нельзя, он работает только для подтверждённых ресурсов. На своём сайте он отвечает на другой вопрос и показывает среднюю позицию за месяц по запросам, где сайт уже показывался. Сравнивать это число со снимком напрямую нельзя. Если они расходятся в разы, я первым делом проверяю регион и устройство, с которыми снят снимок.
Чего скрипт не показывает
- Снимок не равен средней. XMLRiver и браузер дают позицию в одном городе, на одном устройстве, в одну минуту. Для решения нужна история хотя бы за несколько прогонов.
- Средняя не равна снимку. Search Console усредняет все показы за период, включая редкие показы на дальних позициях, и не видит запросы, по которым сайт не показывался.
- AI Overviews не учитываются. Скрипт считает только органические результаты. Страница может держать позицию и терять клики, если над выдачей появился AI-блок.
- Браузер держится до первой капчи. Проходимость зависит от IP, частоты запросов и текущей версии защиты Google. То, что работает сегодня, может перестать через месяц.
- Глубина стоит обращений линейно. С сентября 2025 года Google отдаёт по 10 результатов на страницу и перестал поддерживать параметр
num=100. Поэтому ТОП-100 обходится в 10 обращений на запрос в любом из двух выдачных режимов.
Скрипт, README и образец настроек лежат по ссылкам ниже, лицензия MIT. Источник можно заменить. У каждого есть своя функция (run_xmlriver, run_gsc, run_browser), а разбор результата и история общие.
Вопросы
Да, двумя способами. По своему сайту подойдёт Search Console API, который показывает среднюю позицию и только по запросам, где сайт уже был в выдаче. Для любого сайта подойдёт браузер, который пускает Google, например CloakBrowser, но только в небольшом объёме и с паузами между запросами.
Нет. Новых клиентов Google не подключает, для действующих доступ заканчивается 1 января 2027 года. Для поиска по сайтам до 50 доменов Google предлагает Vertex AI Search, а по полной веб-выдаче просит связаться с ним напрямую.
С начала 2025 года выдача Google требует JavaScript. Скрипт на requests получает страницу без результатов, а обычный автоматизированный Chromium получает капчу. Работают только браузеры с изменённым отпечатком, и даже им нужны паузы между запросами.