Как обработать данные по поисковым запросам из органики Google в Google BigQuery

Автор: Антон Леонтьев, руководитель отдела веб-аналитики eLama

Практически каждый сайт так или иначе оптимизируют для поисковых систем, а в рунете для двух — Яндекса и Google. Для оценки эффективности SEO-продвижения, необходимо отслеживать переходы на сайт из органики и поисковые запросы. С Яндексом все достаточно просто: в отчете «Поисковые системы» в Метрике доступны список поисковых фраз в Яндексе и динамика переходов по ним.

C Google все несколько сложней. В Google Analytics нет статистики по поисковым фразам. Можно только связать ресурс Google Analytics с Google Search Console, откуда и будут подгружаться данные в систему аналитики, но со следующими ограничениями:

  1. Не будет привязки конкретной поисковой фразы к сеансу на сайте. Поисковые фразы доступны только в единственном отчете ‘Источники трафика’ -> ‘Search Console’ -> ‘Запросы’, и нет возможности использовать их в сегментах или любых других отчетах.
  2. Отслеживаются не все поисковые фразы, многие помечаются как ‘(other)’. Например, на сайте eLama.ru таких поисковых фраз около 40%, а на ppc.world — до 80%.
  3. В Google Analytics для импорта из Search Console можно настроить только один ресурс, а не набор ресурсов. Это имеет значение если у вас есть поддомены.
  4. Сейчас нет возможности дать доступ другому пользователю к набору ресурсов в Search Console.
  5. В нем хранятся данные за последние 90 дней:

Первые две проблемы невозможно решить без серьезных изменений на стороне Google. Но как решить последние три, мы рассмотрим в этой статье. Заодно построим два отчета. Первый - с динамикой переходов из поиска Google с разбивкой на брендированные и небрендированные запросы:

Показатели в таблице:

period — отчетный месяц;

b_clicks — количество кликов по брендированным запросам;

b_percent — доля кликов по брендированным запросам;

b_impressions — количество показов по брендированным запросам;

b_ctr — CTR брендированных запросов;

nb_clicks — количество кликов по небрендированным запросам;

nb_percent — доля кликов по небрендированным запросам;

nb_impressions — количество показов по небрендированным запросам;

nb_ctr — CTR небрендированных запросов;

o_clicks — количество кликов по неизвестным запросам (others);

o_part_off — какую долю от всех переходов из поиска Google составляют эти фразы (others);

o_impressions — количество показов по неизвестным запросам (others);

o_ctr — CTR неизвестных запросов (others).

Второй отчет будет содержать список небрендированных запросов и их статистику по месяцам:

Показатели:

search_term — поисковая фраза;

clicksAllTime — количество кликов за все время;

c_17_03 — количество кликов в марте 2017 г.

p_17_03 — позиция, которую занимала фраза в марте 2017 г.

Чтобы получить такие отчеты, мы будем каждый месяц скачивать из Google Search Console CSV-файл со статистикой за предыдущий месяц и загружать его в облачную базу данных Google BigQuery, где данные будут храниться и обрабатываться. Итак, подробнее по шагам:

  1. Нужно зайти в Search Console и скачать статистику за определенный месяц. Ограничение — доступно максимум 999 поисковых запросов. Если вам нужно больше данных — они доступны в Google Search Console API.
  1. В Google BigQuery создадим dataset, например ‘search_console_google’. О том, как начать работать с BigQuery можно прочитать в одной из моих предыдущих статей. Загрузим полученные CSV-файлы в созданный dataset:
  1. У вас, скорее всего, сначала получится загрузить статистику только за 2-3 месяца. Для ppc.world выгружали статистику из Search Console раньше, поэтому у нас данных больше. Вот так выглядят загруженные таблицы в веб-интерфейсе BigQuery:
  1. Теперь в нужно создать виртуальную таблицу (view) search_console_google.all, содержащую этот SQL-скрипт.
SELECT

   period,

   domain,

   search_term,

   CASE

      WHEN search_term='(other)' THEN '(other)'

      WHEN search_term CONTAINS 'ppc world' OR

           search_term CONTAINS 'ppcworld' OR

           search_term CONTAINS 'ppc.world' OR

           search_term CONTAINS 'ppc новости' OR

           search_term CONTAINS 'ppc-world' OR

           search_term CONTAINS 'world ppc' OR

           search_term = 'ppc' THEN 'branded'

      ELSE 'not branded'

   END as type,

   clicks,

   impressions,

   ctr,

   FLOAT (REPLACE(position,',','.')) as position,

FROM

(

   SELECT

      period, domain, search_term, clicks, impressions, ctr, position,

   FROM

   (

      SELECT '2017-02' as period, 'ppc.world' as domain, search_term, clicks, impressions, ctr, position

      FROM search_console_google.ppcworld_2017_02

   ),

   (

      SELECT '2017-03' as period, 'ppc.world' as domain, search_term, clicks, impressions, ctr, position

      FROM search_console_google.ppcworld_2017_03

   ),

   (

      SELECT '2017-04' as period, 'ppc.world' as domain, search_term, clicks, impressions, ctr, position

      FROM search_console_google.ppcworld_2017_04

   ),

   (

      SELECT '2017-05' as period, 'ppc.world' as domain, search_term, clicks, impressions, ctr, position

      FROM search_console_google.ppcworld_2017_05

   ),

   (

      SELECT '2017-06' as period, 'ppc.world' as domain, search_term, clicks, impressions, ctr, position

      FROM search_console_google.ppcworld_2017_06

   ),

   (

      SELECT '2017-07' as period, 'ppc.world' as domain, search_term, clicks, impressions, ctr, position

      FROM search_console_google.ppcworld_2017_07

   ),

   (

      SELECT '2017-08' as period, 'ppc.world' as domain, search_term, clicks, impressions, ctr, position

      FROM search_console_google.ppcworld_2017_08

   ),

   (

      SELECT '2017-06' as period, 'ppc.world' as domain, '(other)' as search_term, 3039 as clicks, 65804 as impressions,

   ),

   (

      SELECT '2017-07' as period, 'ppc.world' as domain, '(other)' as search_term, 3076 as clicks, 68038 as impressions,

   ),

   (

      SELECT '2017-08' as period, 'ppc.world' as domain, '(other)' as search_term, 3771 as clicks, 76011 as impressions,

   ),

)

Отредактируйте его под свой проект, запустите в BigQuery и сохраните view. Эта таблица будет содержать подробную информацию по каждому поисковому запросу за каждый отчетный месяц по вашему сайту или нескольким поддоменам. Ее нужно будет дополнять каждый месяц.

Посмотрим на результат выполнения этого скрипта (нужно нажать Edit Query, Run Query):

Показатели отчета:

period — отчетный период, соотносится с каждой таблицей из Search Console, прописывается в SQL-запросе;

domain — домен, соотносится с каждой таблицей из Search Console, прописывается в SQL-запросе;

search_term — поисковая фраза;

type — тип ключевой фразы, определяется в SQL-запросе, принимает три значения: ‘(other)’, ‘branded’, ‘not branded’;

clicks — количество кликов; для фраз ‘(other)’ значение нужно взять из Google Analytics, потому что в Search Console эти значения не отображаются, и прописать в SQL-запросе (соответственно если у вас несколько поддоменов, то получиться указать значения только для одного из них) ;

impressions — количество показов, аналогично как с кликами;

ctr — CTR поисковой фразы, берется из загруженного CSV-файла без изменений; для фраз ‘(other)’ не указывается (NULL);

position — позиция поисковой фразы, берется из загруженного CSV-файла и преобразуется в тип FLOAT; для фраз ‘(other)’ не указывается (NULL).

  1. Чтобы получить первый отчет о динамике переходов из поиска Google с разбивкой на брендированные и небрендированные запросы, создайте view search_console_google.months, содержащий следующий SQL-скрипт.
SELECT

   period,

   SUM (branded_clicks) as b_clicks,

   ROUND(100 * SUM (branded_clicks) / (SUM (branded_clicks) + SUM (not_branded_clicks))) as b_percent,

   SUM (branded_impressions) as b_impressions,

   ROUND (100 * SUM (branded_clicks) / SUM (branded_impressions), 1) as b_ctr,

   SUM (not_branded_clicks) as nb_clicks,

   ROUND(100 * SUM (not_branded_clicks)/ (SUM (branded_clicks) + SUM (not_branded_clicks))) as nb_percent,

   SUM (not_branded_impressions) as nb_impressions,

   ROUND (100 * SUM (not_branded_clicks) / SUM (not_branded_impressions), 1) as nb_ctr,

   SUM (others_clicks) as o_clicks,

   ROUND(100 * SUM (others_clicks)/ (SUM (branded_clicks) + SUM (not_branded_clicks) + SUM (others_clicks))) as o_part_off,

   SUM (others_impressions) as o_impressions,

   IFNULL(ROUND (100 * SUM (others_clicks) / SUM (others_impressions), 1),0) as o_ctr,

FROM

(

   SELECT

      period,

      IF (type='branded' , clicks, 0) as branded_clicks,

      IF (type='not branded' , clicks, 0) as not_branded_clicks,

      IF (type='(other)' , clicks, 0) as others_clicks,

      IF (type='branded' , impressions, 0) as branded_impressions,

      IF (type='not branded' , impressions, 0) as not_branded_impressions,

      IF (type='(other)' , impressions, 0) as others_impressions,

   FROM [your-project-id:search_console_google.all]

)  

GROUP BY period,

ORDER BY period DESC

В нем ничего менять не нужно кроме project-id из BigQuery, он сразу должен заработать. В скрипте рассчитываются параметры на основе значений из search_console_google.all, который мы настроили в предыдущем пункте.

  1. Чтобы получить второй отчет со статистикой по небрендированным запросам, создайте view search_console_google.kewords на основе следующего SQL-скрипта.
SELECT

   search_term,

   SUM (clicks_2017_02) + SUM (clicks_2017_03) + SUM (clicks_2017_04) +

   SUM (clicks_2017_05) + SUM (clicks_2017_06) + SUM (clicks_2017_07) +

   SUM (clicks_2017_08)     as clicksAllTime,

   SUM (clicks_2017_02) as clicks_17_02,   MAX (position_2017_02) as pos_2017_02,

   SUM (clicks_2017_03) as c_17_03,        MAX (position_2017_03) as p_17_03,

   SUM (clicks_2017_04) as c_17_04,        MAX (position_2017_04) as p_17_04,

   SUM (clicks_2017_05) as c_17_05,        MAX (position_2017_05) as p_17_05,

   SUM (clicks_2017_06) as c_17_06,        MAX (position_2017_06) as p_17_06,

   SUM (clicks_2017_07) as c_17_07,        MAX (position_2017_07) as p_17_07,

   SUM (clicks_2017_08) as c_17_08,        MAX (position_2017_08) as p_17_08,

FROM

(  //установим кол-во кликов и показов в соответствующие колонки по периодам,

   //чтобы потом считать клики и позицию по каждому периоду в отдельности

   SELECT

      search_term,

      IF (period='2017-02' , clicks, 0) as clicks_2017_02,      IF (period='2017-02' , position, 0) as position_2017_02,

      IF (period='2017-03' , clicks, 0) as clicks_2017_03,      IF (period='2017-03' , position, 0) as position_2017_03,

      IF (period='2017-04' , clicks, 0) as clicks_2017_04,      IF (period='2017-04' , position, 0) as position_2017_04,

      IF (period='2017-05' , clicks, 0) as clicks_2017_05,      IF (period='2017-05' , position, 0) as position_2017_05,

      IF (period='2017-06' , clicks, 0) as clicks_2017_06,      IF (period='2017-06' , position, 0) as position_2017_06,

      IF (period='2017-07' , clicks, 0) as clicks_2017_07,      IF (period='2017-07' , position, 0) as position_2017_07,

      IF (period='2017-08' , clicks, 0) as clicks_2017_08,      IF (period='2017-08' , position, 0) as position_2017_08,

   FROM

      [your-project-id:search_console_google.all]

   WHERE

      type='not branded'

)     

GROUP BY search_term

ORDER BY clicksAllTime DESC

В этом скрипте необходимо заменить project-id из BigQuery, и потом нужно будет ежемесячно добавлять новые строки для обработки статистики по новому месяцу.

  1. Отчеты созданы. Теперь можно расшарить своим коллегам dataset и входящие в него отчеты.
  1. С такими отчетами можно работать не только в веб-интерфейсе Google BigQuery, но и просто сохранить в Google Sheets или скачать CSV. Можно поступить другим образом — создать Google Sheets с доступом коллегам, а в него данные подтягивать через OWOX BI BigQuery Reports. Или же подключить инструменты визуализации: Google Data Studio, Redash, Tableau и другие.

Таким образом мы разобрались, как можно сохранить статистику переходов из органики Google, а также автоматизировать отчетность. Если у вас есть вопросы или дополнения — пишите в комментариях.

preview Вирус на службе маркетинга

Вирус на службе маркетинга

Вирусное продвижение бренда по Московской области на примере производителя бытовок
preview Автоматизация сбора данных для интернет-маркетолога

Автоматизация сбора данных для интернет-маркетолога

Многие задачи поисковой оптимизации сайта, равно как и составления рекламных кампаний в Директе можно и нужно автоматизировать
preview 10 вещей, которые напрямую не влияют на ранжирование сайтов в Google

10 вещей, которые напрямую не влияют на ранжирование сайтов в Google

Что общего у возраста сайта, показателя отказов, использования заголовков h1/h2 и виртуального хостинга? Ни один из этих пунктов напрямую не влияет на ранжирование в Google... 
preview Оптимизация плавающих фреймов для SEO

Оптимизация плавающих фреймов для SEO

Команда маркетингового агентства Search Laboratory провела ряд тестов, призванных выяснить, как сделать элементы iframe дружественными к SEO
preview Яндекс: SEO для бизнеса

Яндекс: SEO для бизнеса

Как получить большую отдачу от сайта в органическом трафике
preview Как контент во вкладках может вредить ранжированию сайта

Как контент во вкладках может вредить ранжированию сайта

В статье автор делится результатами тестов, призванных выяснить, как размещение контента во вкладках влияет на ранжирование страниц в Google