Так получилось, что мы в 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.

Моральный аспект
Я не спрашивал у Яндекса разрешение на парсинг Метрики, но ведь и она не спрашивает у меня разрешение когда парсит мои сайты. Чтобы запретить Яндексу индексировать мой сайт, мне нужно создавать файл robots.txt и прописывать какие-то директивы. Если Яндекс не хочет, чтобы я парсил их Метрику, то пусть создаст файл xyu.txt в корне своего сайта и пропишет в нем директивы, которые я попрошу.

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

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

На этом все. Результат работы доступен на seo11.ru
Поделиться с друзьями
-->

Комментарии (8)


  1. ZAZmaster
    21.10.2016 13:05
    +16

    Больше всего понравился «Моральный аспект» =)


    1. xenon
      21.10.2016 22:20
      -2

      Смешно. Но все таки — robots.txt — де-факто стандарт в интернете, и про него все знают. И формат файла так же стандартен. (Это не злой Яндекс его выдумал и принуждает делать неочевидные вещи, чтоб защититься от него). И все «вежливые» роботы этот файл уважают. В том числе и Яндексовский поисковик.

      https://informer.yandex.ru/robots.txt:
      User-Agent: *
      Disallow: /


      по дефолту (нет файла) — разрешено. Но если создать — любой вежливый робот любого поисковика будет соблюдать.

      А вот про xyu.txt никакого стандарта нет — это на самом деле выдумка для оправдания.


  1. wispoz
    21.10.2016 13:06

    А где на сайте результат работы?


    1. zapolnoch
      21.10.2016 14:40

      В результатах анализа сайта. Если в базе есть данные Метрики, то появится блок «Посещаемость». Пример.


  1. tommy_13
    21.10.2016 15:18

    зачем картинки метрики распознавать?
    идем на https://metrika.yandex.ru/dashboard?group=dekaminute&period=2016-10-21%3A2016-10-21&id=_счетчик_ и парсим результаты. через API, думаю, еще проще


    1. zapolnoch
      21.10.2016 15:18
      +1

      Эта страница доступна только у тех сайтов, которые в настройках информера выбрали «Расширенный» тип. Таких сайтов еще меньше, чем тех, у которых открыта хотя бы картинка.


  1. rhamdeew
    21.10.2016 15:36

    И на какие только ухищрения люди не идут) Видимо придется скоро еще и яндексовую капчу распознавать.


  1. keslo
    21.10.2016 21:43

    Если можете, то поделитесь кодом реализации парсера на NodeJS. Интересно