Pull to refresh

Как узнать посещаемость 3.8 млн. сайтов

Reading time2 min
Views8.3K
Так получилось, что мы в seo11.ru знаем посещаемость примерно 1 млн. сайтов. Данные берутся из рейтингов Liveinternet, Mail, Rambler, Openstat и Hotlog. Но огромное число сайтов не участвуют в этих рейтингах и предпочитают измерять посещаемость Гугл.Аналитиком или Яндекс.Метрикой. У Аналитика нет открытых информеров, поэтому получить данные не получится. А у Метрики есть!

План


1. Собираем базу сайтов рунета.
2. Ищем на них код Метрики.
3. Проверяем, открыт информер Метрики или нет.
4. Если открыт, то парсим картинку, распознаем и записываем в базу.

Решение


1. Сначала нужно получить список всех сайтов рунета. Первая мысль — обойти все домены в зонах ru, su и рф. Однако многие русскоязычные сайты размещаются на международных доменах. Можно было бы обойти еще Топ Alexa, Яндекс.Каталог и русский раздел Dmoz, но все это не даст полной базы. Пришлось бы писать полноценный краулер, но трезво оценив свои ресурсы стал искать альтернативные варианты.

Ведь не мне первому понадобилось обходить сайты рунета. Решено было обратиться к коллегам из Keys.so. У них свой краулер и почти 20 млн. проанализированных сайтов. Они обходят сайты для сбора ключевых слов и другие SEO-данных.

2. Итак, есть база из 20 млн. сайтов. Осталось найти на них код метрики. JS-код счетчика имеет несколько вариантов. Если искать по yandexMetrikaId, то многие сайты не будут определяться. Например, на самом yandex.ru есть метрика, но по yandexMetrikaId ее не найти. Если искать по yaCounter или Ya.Metrik, то многие другие сайты не будут детектироваться, например dnevnik.ru

Самое правильное — ориентироваться на последовательность «mc.yandex.ru/watch/», например «mc.yandex.ru/watch/17969140». Соответственно 17969140 — это ID сайта. Таким образом, Keys.so видит Метрику на 3 846 867 доменах.

3. Зная ID сайта, можно запросить картинку информера по адресу:

informer.yandex.ru/informer/37616330/3_0_FFFFFFFF_FFFFFFFF_0_pageviews

Сверху вниз: просмотры, визиты, посетители. Если в настройках Яндекс.Метрики выключен информер, то картинка будет выглядеть вот так:

informer.yandex.ru/informer/17969140/3_0_FFFFFFFF_FFFFFFFF_0_pageviews

Такой информер нет смысла запрашивать и распознавать. Достаточно получить content-length и отсеять ненужные.

4. Из 3.8 млн. сайтов информер открыт у чуть больше 1 млн. сайтов. Парсить и распознавать будем с помощью NodeJS. Для парсинга я использую модуль request, для создания очереди async.queue. Картинки распознаю с помощью OCR-библиотеки okrabyte.

Первая проблема: от информера можно получить данные только за 24 часа. Решение — скачивать информеры в 23:55. Разумеется, будут небольшие расхождения с реальными данными, но это лучше, чем ничего.

Вторая проблема: информер обнуляется в 00:00 согласно часовому поясу, выбранному в настройках счетчика. Как узнать, какой часовой пояс выбран в настройках? Никак. Поэтому нужно заранее пропарсить информер с периодичностью каждый час и посмотреть, когда он обнуляется.

На этом все. Результат работы доступен на seo11.ru
Tags:
Hubs:
+25
Comments8

Articles