Если прочитать главные страницы 17 642 сайтов одним и тем же кодом и у каждой сохранить протокол, кодировку, платформу и дату регистрации домена, получается так: 93% сайтов на HTTPS, 2,7% до сих пор в windows-1251 и koi8-r, 39% доменов старше 2010 года, а среди сайтов с определимой платформой Битрикс вдвое обгоняет WordPress.
Это побочный продукт каталога сайтов, который я делаю один. Обходчик читает главную ради описания карточки, а технический паспорт снимается с того же ответа, без единого лишнего запроса к чужому серверу. В статье две части: как устроен обход и на какие грабли наступаешь именно в рунете, и сами цифры. Цифры заморожены на 23 сентября 2026 года и лежат на отдельной странице: срез за III квартал 2026. Живая версия пересчитывается раз в час на /stats.
Как устроен обход
Стек обычный: Next.js, PostgreSQL, Redis, очередь на BullMQ и один воркер, который единственный во всём проекте ходит на чужие сайты. Из обработчиков HTTP наружу не ходит ничто: иначе ответ посетителю зависел бы от доступности постороннего сервера. Темп задаёт лимитер очереди, по умолчанию десять сайтов в минуту. Этого хватает, чтобы за месяц разобрать полтора десятка тысяч сайтов, и мало, чтобы кому-нибудь помешать.
Порядок на один сайт такой:
Адрес проходит проверку на SSRF: резолв имени, отказ для приватных и локальных диапазонов, и та же проверка на каждом редиректе. Адрес приходит от анонимного пользователя или с чужой страницы, доверять ему нельзя ни на каком шаге.
Запрашивается robots.txt, и разбирает его библиотека, а не свой код: группы, wildcards и приоритет правил руками разбираются неверно. Запрет означает отдельный статус без повторов: результат повтора известен заранее. Агент представляется своим именем, и любой владелец может его закрыть одной строкой.
Скачивается одна страница, главная, с таймаутом и лимитом на размер тела. Читается потоком до лимита, а не через response.text(): тот всегда декодирует UTF-8, и к этому мы ещё вернёмся.
До обращения к языковой модели стоят дешёвые фильтры: объём текста, доля кириллицы, маркеры парковок. Заглушка отсеивается бесплатно, и это основная экономия проекта.
Из той же разметки снимается технический паспорт: финальный адрес после редиректов, время до полного ответа, размер тела, кодировка, тег viewport, число ссылок, платформа по generator и путям файлов. Факт объявленной карты сайта берётся из уже полученного robots.txt. Дополнительных запросов к сайту нет, и это правило держится жёстко: каждый новый показатель обязан вычисляться из того, что уже скачано.
Единственный запрос не к самому сайту это WHOIS регистрируемого домена, за датой регистрации и регистратором. Поле владельца не читается вовсе.
Источник новых адресов сам каталог: со страницы, которую и так разобрали, снимаются исходящие ссылки на домены .ru, .рф, .su, .moscow и .tatar. Зона проверяется последней меткой имени, а не подстрокой, иначе notru.com проходил бы как российский. Ссылки собираются только с сайтов, прошедших порог качества, иначе одна сетка сателлитов приводит за собой тысячу таких же. Кандидат с двумя ссылками от разных владельцев идёт в очередь раньше одиночного. Это и определяет смещение выборки, о котором в конце.
Грабли, которые есть только в рунете
Каждый пункт ниже стоил прод-инцидента или сотен ложных статусов «сайт не работает».
Кодировка не всегда UTF-8. 424 сайта отдаются в windows-1251, 39 называют её cp1251, девять сайтов в koi8-r. У fetch метод response.text() декодирует UTF-8 безусловно, и полтысячи живых сайтов превращаются в кракозябры, проваливают фильтр на долю кириллицы и отбрасываются как нерусские. Правильно: читать байты, кодировку брать из заголовка Content-Type, затем из meta charset или http-equiv в разметке, и только потом декодировать. TextDecoder в Node знает и windows-1251, и koi8-r.
www и апекс домена это разные серверы. Для дедупликации example.ru и www.example.ru один сайт, а в DNS это два имени, и совпадают они не всегда. Был случай, когда апекс согласовывал TLS только по протоколу ниже 1.2, то есть для Node соединения не было вовсе, а www работал нормально. Исправный сайт получал статус «сломан». Теперь после сетевого отказа перебираются двойник с www и понижение до http, но только после сетевого: отказ robots.txt или заглушка перебор не запускают, сайт ответил. В случае undici причина лежит в error.cause, а error.message всегда «fetch failed». Без cause TLS, отказ DNS и сброс соединения неразличимы.
WHOIS, а не RDAP. RDAP считается современной заменой WHOIS, но зон .ru, .рф и .su в бутстрапе IANA нет, а на них приходится 98,5% каталога. Поэтому возраст домена берётся по старому WHOIS поверх TCP, своим сокетом с таймаутом и лимитом ответа. Две детали. Спрашивать нужно о регистрируемом домене, а не о хосте: про поддомен реестр отвечает «No entries found», и первый прогон дал ноль дат на три запроса, все три были поддоменами. И имя проверяется до приведения к eTLD+1: перевод строки внутри имени стал бы второй командой в том же запросе, а парсер доменов разбирает «ex\r\nample.ru» в совершенно годное «ample.ru».
Поддомен не равен сайту. Автосбор однажды привёл больше тысячи карточек одного сервиса вакансий: по региональному поддомену на город, и они ссылались друг на друга, накручивая себе приоритет. Владелец считается по eTLD+1 через Public Suffix List, причём с включённой приватной секцией. По числу меток этого не определить: navlya.superjob.ru и fas.gov.ru устроены одинаково, но gov.ru публичный суффикс, и во втором случае это разные ведомства. На одного владельца не больше трёх карточек, с ручным списком исключений для доменов, под которыми живут разные организации, вроде gosuslugi.ru. Все доли по зонам и регистраторам ниже считаются по владельцам, их 15 236 на 17 642 карточки.
Переезды и зеркала. Дедупликация по имени, под которым сайт записали, пропускает сайт, переехавший на новый домен: он заводится второй раз. Финальный адрес после редиректов сверяется с каталогом, но с двумя исключениями: переход между www и апексом или с http на https переездом не считается, и редирект на площадку тоже, иначе первая брошенная визитка «переехала» бы на vk.com, а следом туда же весь каталог.
Цифры: протокол, вёрстка, robots.txt
Все доли считаются от 17 639 сайтов, у которых снят технический паспорт, если не сказано иное.
Признак | Сайтов | Доля |
|---|---|---|
Отдают страницы по HTTPS (по финальному адресу) | 16 397 | 93% |
Объявляют viewport | 16 234 | 92% |
Отдают robots.txt | 15 755 | 89% |
Объявляют карту сайта в robots.txt | 11 097 | 63% |
Кодировка UTF-8 | 17 167 | 97% |
windows-1251, cp1251 и koi8-r | 472 | 2,7% |
Семь процентов без HTTPS это 1 242 сайта, и выборка здесь даёт нижнюю оценку: в ней перевешивают сайты, на которые ссылаются, то есть за которыми хоть кто-то следит. Совпадение долей HTTPS и viewport не случайно: это один слой сайтов, которых не касались с середины десятых. Карта сайта самый просаженный пункт: каждый третий сайт не говорит поисковику, где его страницы, хотя это одна строка в robots.txt.
Медианы по тем же сайтам: главная отвечает за 0,2 секунды, весит 127 КБ разметки без ресурсов и содержит сто ссылок. Медианы, а не средние: одна страница на десять мегабайт сдвинула бы среднее и ничего не сказала бы об остальных. Время измерено один раз из одной точки, так что это порядок величины, а не бенчмарк. Порядок величины говорит главное: типичная главная рунета всё ещё документ с меню и подвалом, а не пустой div под бандл.
Зоны по владельцам: .ru 93%, .рф 5%, .su 1%, остальные вместе меньше процента. Регистраторов фактически два: RU-CENTER 55% и REG.RU 23%, дальше Beget, Regtime и Timeweb по 3–4%.
Возраст доменов

Дата регистрации известна у 16 981 домена, только для зон, которые обслуживает российский реестр. Нулевые самый большой период, треть всех живых доменов, а дальше каждая пятилетка даёт ровно по 19%: рунет прибавляет линейно уже полтора десятка лет. Самые старые домены выборки из 1996 года: Рамблер, Softline, «Учительская газета», МГТУ «Станкин», УлГТУ, Госархив Пермского края, НАУФОР. Вузы, библиотеки и ассоциации пришли в сеть раньше магазинов и банков и домены не потеряли.
Платформы: правило «не угадывать»
Определители CMS обычно собирают десятки косвенных примет: имена CSS-классов, заголовки ответа, имена cookie, и выдают вероятность. Здесь правило другое и жёсткое: платформа записывается только по явному тегу generator или по характерным путям ресурсов в разметке (/bitrix/, /wp-content/, /_next/static/, /_nuxt/). Ссылка на статью о /wp-content/ в тексте сайт вордпрессом не делает. generator важнее путей: у сайта на Битриксе может лежать /_next/static/ от одного встроенного виджета. Нет однозначного признака, поле пустое. Цена ошибки здесь неверное утверждение о чужом сайте, которое читатель проверить не может, и она ничем не лучше выдумки.
Следствие: платформа определилась у 11 315 сайтов из 17 639, у 64%. Доли на графике считаются от определившихся, иначе число говорило бы о качестве распознавания, а не о рунете.

Битрикс вдвое обгоняет WordPress, хотя в мировой статистике WordPress держит около двух третей сайтов с известной CMS. Tilda с 18% стоит третьей, и это сайты, на которые ссылаются, а не одноразовые лендинги. Next.js и Nuxt вместе дают 9%, больше Joomla и Drupal вместе взятых: два фреймворка, которых десять лет назад не было, обогнали две CMS, которые в нулевые делили рынок с Битриксом. Оговорка про фреймворки честная: признак /_next/static/ говорит о фронтенде, а не о том, что за ним стоит, и часть этих сайтов наверняка headless-сборки поверх той же CMS.
Чего в этих данных нет и что дальше
Выборка смещена, и смещена предсказуемо. Каталог растёт по графу ссылок, поэтому в нём перевешивают сайты, на которые ссылаются: госпорталы, вузы, СМИ, крупные компании. Отсюда доля Битрикса и старых доменов по всему рунету наверняка ниже, а доля http и сайтов без viewport выше. Платформа неизвестна у трети сайтов, и среди них есть WordPress и Битрикс с вычищенной разметкой. Время ответа измерено один раз из одной точки. Всё это написано рядом с каждой цифрой на самой странице, и знаменатель стоит рядом с каждой долей.
Чего каталог не собирает намеренно: контактные данные, поле владельца в WHOIS, скрипты и счётчики на странице, внутренние страницы глубже главной. Первое два по этическим соображениям, остальное потому, что правило «один запрос на сайт» важнее любой дополнительной метрики.
Следующий срез будет за четвёртый квартал, и тогда появится динамика: сколько сайтов перешли на HTTPS за квартал, сколько ушли с Joomla, сколько переехали на другой домен. История изменений уже пишется на каждую карточку: смена протокола, переезд, переписанное описание. Если вам нужен разрез, которого здесь нет, например платформы по разделам или возраст доменов по зонам, напишите в комментариях: данные есть, вопрос только в том, что из них считать.
Автор делает РуКат, каталог сайтов рунета. Цифры статьи: срез за III квартал 2026, живая статистика на /stats.

