Как узнать посещаемость 3.8 млн. сайтов
План
1. Собираем базу сайтов рунета.
2. Ищем на них код Метрики.
3. Проверяем открыт информер Метрики или нет.
4. Если открыт, то парсим картинку, распознаем и записываем в базу.
Решение
1. Сначала нужно получить список всех сайтов рунета. Первая мысль — обойти все домены в зонах ru, su и рф. Однако многие русскоязычные сайты размещаются на международных доменах. Можно было бы обойти еще Топ Alexa, Яндекс.Каталог и русский раздел Dmoz, но все это не даст полной базы. Пришлось бы писать полноценный краулер, но трезво оценив свои ресурсы стал искать альтернативные варианты.
Ведь не мне первому понадобилось обходить сайты рунета. Решено было обратиться к коллегам из Keys.so. У них свой краулер и почти 20 млн. проанализированных сайтов. Они обходят сайты для сбора ключевых слов и другие SEO-данных.
2. Итак, есть база из 20 млн. сайтов. Осталось найти на них код метрики, точнее его ID. 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
Комментарии (2)
21 октября 2016 в 13:05
+1↑
↓
Больше всего понравился «Моральный аспект» =)21 октября 2016 в 13:06
0↑
↓
А где на сайте результат работы?