Як дізнатися відвідуваність 3.8 млн. сайтів

Так вийшло що ми в seo11.ru знаємо відвідуваність приблизно 1 млн. сайтів. Дані беруться з рейтингів Liveinternet, Mail, Rambler, Openstat і Hotlog. Але величезна кількість сайтів не беруть участь в цих рейтингах і воліють вимірювати відвідуваність Гугл.Аналітиком або Яндекс.Метрикою. У Аналітика немає відкритих інформерів, тому отримати дані не вийде. А у Метрики є!

План

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.

Моральний аспектЯ не питав у Яндекса дозвіл на парсинг Метрики, але ж і вона не питає у мене дозвіл коли парсити мої сайти. Щоб заборонити Яндексу індексувати мій сайт, мені потрібно створювати файл robots.txt і прописувати якісь директиви. Якщо Яндекс не хоче, щоб я парсил їх Метрику, то нехай створить файл xyu.txt в корені свого сайту і пропише в ньому директиви, які я попрошу.

Перша проблема — від інформера можна отримати дані тільки за 24 години. Рішення завантажувати інформери в 23:55. Зрозуміло, будуть невеликі розбіжності з реальними даними, але це краще, ніж нічого.
Друга проблема — інформер обнуляється в 00:00 відповідно до часового поясу, вибраному у налаштуваннях лічильника. Як дізнатися який часовий пояс, вибраний в налаштуваннях? Аж ніяк. Тому потрібно заздалегідь пропарсить інформер з періодичністю щогодини і подивитися коли він обнуляється.

На цьому все. Результат роботи доступний на seo11.ru
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.