Содержание

Два привычных способа снять позиции в 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 и браузера как источников позиций в Google
ПараметрSearch Console APISERP 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 для всех роботов, и решение о таком режиме каждый принимает сам.

Что делает скрипт

Режим XMLRiver работает на стандартной библиотеке Python 3.9+. Для Search Console нужен google-auth, для браузера нужен cloakbrowser. В самом скрипте нет ни одного ключа и ни одного адреса. ID и ключ XMLRiver, ресурс Search Console и путь к JSON-ключу вписываются в файл .env, образец которого лежит рядом. Пошаговая настройка каждого источника, включая создание сервисного аккаунта Google, описана в README к скрипту.

bash
# 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.

Первым идёт контроль, то есть запрос, по которому сайт гарантированно первый. Для Википедии это «википедия», и оба источника поставили её на первое место. Пока контроль не прошёл, пустой результат по остальным запросам ничего не значит. Ровное «сайта нет в выдаче» по всему списку чаще выдаёт неверный домен или регион, чем реальную картину.

Затем шли шесть запросов разного типа.

Позиции ru.wikipedia.org по шести запросам в XMLRiver и браузере и первые домены выдачи
ЗапросXMLRiverБраузерПервые домены выдачи
фотосинтез11ru.wikipedia.org, затем образовательные и научные сайты
теорема пифагора11ru.wikipedia.org
рецепт борщавне ТОП-30вне ТОП-30andychef.ru, russianfood.com
как выбрать велосипедвне ТОП-30вне ТОП-30velostrana.ru, pro-bike.ru
ремонт стиральной машинывне ТОП-30вне ТОП-30profi.ru, moskva.remontgis.ru
купить ноутбуквне ТОП-30вне ТОП-30technopark.ru, store77.net

Позиции совпали по всем семи запросам, первый домен выдачи тоже совпал. Второй и третий кое-где разошлись. По «фотосинтезу» в одном снимке на втором месте стоял biocpm.ru, в другом externat.foxford.ru. Снимки сняты разными способами с разницей в несколько минут, и первые места в них оказались устойчивее следующих.

XMLRiver потратил 15 обращений, около 38 копеек по базовому тарифу. Браузер сделал 15 запросов к Google без капчи. Экономия видна по числу обращений, ведь там, где сайт нашёлся на первой странице, скрипт дальше не листал.

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

Чего скрипт не показывает

Скрипт, README и образец настроек лежат по ссылкам ниже, лицензия MIT. Источник можно заменить. У каждого есть своя функция (run_xmlriver, run_gsc, run_browser), а разбор результата и история общие.

Скачать архив: скрипт, README, образец настроек, пример запросов ZIP · 15 КБ · лицензия MIT Скачать google_positions.py Python · 27 КБ · лицензия MIT Скачать README.md Markdown · 12 КБ · описание параметров и настройки источников

Вопросы

Да, двумя способами. По своему сайту подойдёт Search Console API, который показывает среднюю позицию и только по запросам, где сайт уже был в выдаче. Для любого сайта подойдёт браузер, который пускает Google, например CloakBrowser, но только в небольшом объёме и с паузами между запросами.

Нет. Новых клиентов Google не подключает, для действующих доступ заканчивается 1 января 2027 года. Для поиска по сайтам до 50 доменов Google предлагает Vertex AI Search, а по полной веб-выдаче просит связаться с ним напрямую.

С начала 2025 года выдача Google требует JavaScript. Скрипт на requests получает страницу без результатов, а обычный автоматизированный Chromium получает капчу. Работают только браузеры с изменённым отпечатком, и даже им нужны паузы между запросами.