<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Google Search Console on kenji.blog</title><link>http://kenji.blog/ru/tags/google-search-console/</link><description>Recent content in Google Search Console on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ru</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/ru/tags/google-search-console/index.xml" rel="self" type="application/rss+xml"/><item><title>Стратегия переписывания старых технических статей с использованием Google Search Console</title><link>http://kenji.blog/ru/p/google-search-console-rewrite-strategy/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/ru/p/google-search-console-rewrite-strategy/</guid><description>&lt;img src="http://kenji.blog/p/google-search-console-rewrite-strategy/img/eyecatch.jpg" alt="Featured image of post Стратегия переписывания старых технических статей с использованием Google Search Console" />&lt;h2 id="1-введение-важность-переписывания-и-подход-на-основе-данных-в-технических-блогах">1. Введение: Важность переписывания и подход на основе данных в технических блогах
&lt;/h2>&lt;p>При ведении технического блога или корпоративного медиа для разработчиков &amp;ldquo;переписывание прошлых статей&amp;rdquo; так же важно, а возможно, и более важно, чем постоянное написание новых. Особенно в сфере IT и технологий информация быстро устаревает, и нередко фрагменты кода или спецификации API, написанные несколько лет назад, теперь устарели (Deprecated). Однако, просто слепо обновляя старые статьи, невозможно максимизировать трафик (приток посетителей) из поисковых систем.&lt;/p>
&lt;p>Поэтому в этой статье будет рассказано о продвинутой стратегии, которая использует данные &lt;strong>Google Search Console (далее GSC)&lt;/strong> и &lt;strong>Google Analytics 4 (GA4)&lt;/strong>, а также подходы на основе данных и математических моделей для выявления технических статей, нуждающихся в переписывании, с целью значительного повышения позиций в поиске и показателя кликабельности (CTR).&lt;/p>
&lt;p>В частности, мы подробно рассмотрим методы, начиная от интеграции данных GSC и GA4 с помощью Python и BigQuery для выявления &amp;ldquo;статей упущенной выгоды&amp;rdquo; с низким CTR по отношению к количеству показов (impressions), до выявления недостающих ключевых слов в заголовках H2 и H3 с использованием анализа TF-IDF из области обработки естественного языка (NLP) для эффективного заполнения пробелов в контенте.&lt;/p>
&lt;hr>
&lt;h2 id="2-анализ-разрыва-между-ожидаемым-ctr-и-фактическим-ctr-введение-математической-модели">2. Анализ разрыва между ожидаемым CTR и фактическим CTR (Введение математической модели)
&lt;/h2>&lt;p>Одним из самых базовых показателей в SEO является &amp;ldquo;показатель кликабельности (CTR) относительно позиции в поиске&amp;rdquo;. Как правило, если позиция в поиске равна 1, CTR составляет около 25-30%, на 2-м месте — около 15%, после чего он резко падает. Эту зависимость между позицией и CTR можно смоделировать как распределение, подчиняющееся степенному закону (Power Law).&lt;/p>
&lt;p>Известно, что ожидаемый показатель кликабельности $CTR(r)$ для позиции $r$ аппроксимируется следующей формулой:&lt;/p>
$$
CTR(r) = a \cdot r^{-b}
$$&lt;p>Здесь $a$ — это ожидаемый CTR на 1-м месте (например, $0.30$ для 30%), а $b$ — параметр затухания (обычно от $1.0$ до $1.5$).&lt;/p>
&lt;p>Наиболее эффективный подход при выборе статей для переписывания — &lt;strong>найти статьи (ключевые слова), где &amp;ldquo;фактический CTR&amp;rdquo; значительно ниже &amp;ldquo;ожидаемого CTR&amp;rdquo;&lt;/strong>. Например, если позиция в поиске — 3-я (ожидаемый CTR около 10%), но фактический CTR составляет всего 2%, высока вероятность того, что поисковое намерение не совпадает с заголовком и описанием (description) или клики забирают факторы конкурентов, такие как расширенные сниппеты.&lt;/p>
&lt;p>Следующий график иллюстрирует разрыв между ожидаемым CTR и фактическим CTR в техническом блоге.&lt;/p>
&lt;pre class="mermaid">
xychart-beta
title Ожидаемый CTR против Фактического CTR по позициям
x-axis [&amp;#34;1&amp;#34;, &amp;#34;2&amp;#34;, &amp;#34;3&amp;#34;, &amp;#34;4&amp;#34;, &amp;#34;5&amp;#34;, &amp;#34;6&amp;#34;, &amp;#34;7&amp;#34;, &amp;#34;8&amp;#34;, &amp;#34;9&amp;#34;, &amp;#34;10&amp;#34;]
y-axis &amp;#34;CTR (%)&amp;#34; 0 --&amp;gt; 35
line [30.5, 15.2, 10.1, 7.5, 5.2, 4.1, 3.2, 2.5, 2.0, 1.5]
bar [32.1, 14.0, 8.5, 4.0, 5.0, 2.1, 1.5, 1.0, 1.2, 0.5]
&lt;/pre>
&lt;p>(* Линия графика показывает ожидаемый CTR, а гистограмма — фактический CTR. Можно заметить значительное отставание на 4-й и 8-й позициях.)&lt;/p>
&lt;hr>
&lt;h2 id="3-автоматическое-извлечение-данных-о-поисковой-эффективности-с-помощью-gsc-api-python">3. Автоматическое извлечение данных о поисковой эффективности с помощью GSC API (Python)
&lt;/h2>&lt;p>Хотя данные можно скачивать в формате CSV из веб-интерфейса GSC для анализа, для больших блогов или постоянного анализа лучше всего создать систему для автоматического извлечения данных на Python с помощью GSC API.&lt;/p>
&lt;p>Ниже приведен фрагмент кода на Python, использующий &lt;code>google-api-python-client&lt;/code> для получения данных о производительности по страницам и запросам (количество кликов, количество показов, CTR, средняя позиция) за определенный период.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">google.oauth2&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">service_account&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">googleapiclient.discovery&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">get_gsc_data&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">site_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">start_date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Загрузка учетных данных и создание клиента API&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">credentials&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">service_account&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Credentials&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_service_account_file&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">key_path&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">scopes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;https://www.googleapis.com/auth/webmasters.readonly&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">service&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">build&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;searchconsole&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;v1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">credentials&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">credentials&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Настройка полезной нагрузки запроса к API (указание страниц и запросов в качестве параметров)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">request&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;startDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">start_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;endDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;dimensions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;page&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;query&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;rowLimit&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">25000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Выполнение API-запроса&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">service&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">searchanalytics&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">siteUrl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">site_url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">body&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">request&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">execute&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Извлечение данных из ответа и преобразование в Pandas DataFrame&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rows&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;rows&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">[])&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">row&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">rows&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">keys&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;keys&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;page&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">keys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;query&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">keys&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;clicks&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;clicks&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;impressions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;impressions&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;ctr&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;ctr&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;position&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;position&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Пример выполнения&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># df_gsc = get_gsc_data(&amp;#39;credentials.json&amp;#39;, &amp;#39;https://kenji.blog/&amp;#39;, &amp;#39;2026-08-01&amp;#39;, &amp;#39;2026-08-31&amp;#39;)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># print(df_gsc.head())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>С помощью этого скрипта вы можете получить подробные данные, связывающие URL страниц и поисковые запросы, в виде DataFrame. Это позволяет получить полное представление о том, по каким ключевым словам показывается конкретная статья.&lt;/p>
&lt;hr>
&lt;h2 id="4-фильтрация-технических-ключевых-слов-с-помощью-регулярных-выражений-regex">4. Фильтрация технических ключевых слов с помощью регулярных выражений (Regex)
&lt;/h2>&lt;p>Одной из очень мощных функций при анализе технического блога является &lt;strong>фильтр по регулярным выражениям (Regex)&lt;/strong> в GSC.
Например, если вы пишете множество статей по темам от фронтенда до бэкенда и инфраструктуры, вы можете захотеть выделить только &amp;ldquo;статьи об ошибках и туториалы по Python и Pandas&amp;rdquo;, чтобы определить приоритеты для переписывания.&lt;/p>
&lt;p>Используя пользовательские фильтры по регулярным выражениям в GSC, вы можете сузить запросы по сложным условиям.&lt;/p>
&lt;p>&lt;strong>Примеры фильтрации технических ключевых слов:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Исследование ошибок, связанных с Python: &lt;code>^(python|pandas|numpy|matplotlib).* (error|exception|bug|ошибка|не работает)&lt;/code>&lt;/li>
&lt;li>Построение инфраструктуры, связанной с AWS: &lt;code>(aws|amazon web services|ec2|s3|lambda).* (создание|настройка|туториал|tutorial|how to)&lt;/code>&lt;/li>
&lt;li>Обновление версий конкретных библиотек: &lt;code>(react|vue|angular) (v17|v18|v3) (migration|миграция|переход)&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Если вы встраиваете это в запрос к GSC API, используйте &lt;code>dimensionFilterGroups&lt;/code> для применения условий регулярного выражения. Искусно используя эту фильтрацию, вы сможете точечно выделять высокоценные ключевые слова, направленные на решение проблем, которые разработчики &amp;ldquo;активно гуглят прямо сейчас&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="5-интеграция-данных-ga4-и-gsc-с-помощью-bigquerypandas">5. Интеграция данных GA4 и GSC с помощью BigQuery/Pandas
&lt;/h2>&lt;p>Одни только данные GSC показывают лишь &amp;ldquo;позицию в поиске и CTR&amp;rdquo;. Чтобы узнать, &amp;ldquo;насколько долго пользователи, попавшие на статью, фактически оставались на ней и достигли ли они конверсии (например, переход в репозиторий GitHub или подписка на рассылку)&amp;rdquo;, необходимо объединить (JOIN) их с данными &lt;strong>Google Analytics 4 (GA4)&lt;/strong>.&lt;/p>
&lt;p>Если вы храните экспортированные данные GA4 и данные массового экспорта GSC в BigQuery, вы можете использовать следующий SQL-запрос для их объединения и извлечения &amp;ldquo;статей с большим количеством показов и приемлемой позицией в поиске, но с высоким показателем отказов (bounce rate) или коротким временем вовлеченности&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">WITH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gsc_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">page_path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SUM&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">impressions&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">total_impressions&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SUM&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">clicks&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">total_clicks&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AVG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sum_top_position&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">avg_position&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">project&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">searchconsole&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">searchdata_url_impression&lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">data_date&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BETWEEN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;2026-08-01&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;2026-08-31&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">ga4_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">REGEXP_REPLACE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">string_value&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNNEST&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">event_params&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;page_location&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="s1">&amp;#39;^https?://[^/]+&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">page_path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">COUNT&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">DISTINCT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">user_pseudo_id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AVG&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">value&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">int_value&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">UNNEST&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">event_params&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">key&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;engagement_time_msec&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">avg_engagement_sec&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="o">`&lt;/span>&lt;span class="n">project&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">analytics_123456789&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">events_&lt;/span>&lt;span class="o">*`&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">event_name&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;page_view&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">GROUP&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">page_path&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">SELECT&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">page_path&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">total_impressions&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">total_clicks&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">SAFE_DIVIDE&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">total_clicks&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">total_impressions&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AS&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">ctr&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">avg_position&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">users&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">avg_engagement_sec&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">FROM&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">gsc_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">JOIN&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="n">ga4_data&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">page_path&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">a&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">page_path&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">WHERE&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">total_impressions&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">1000&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">avg_position&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BETWEEN&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">AND&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="mi">15&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">ORDER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="k">g&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">total_impressions&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DESC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Используя эти результаты, можно классифицировать статьи для переписывания с помощью следующей матрицы:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>High Impression, Low CTR, High Engagement (Высокие показы, Низкий CTR, Высокая вовлеченность)&lt;/strong>:
Статьи, которыми читатели остаются довольны, если кликают на них в результатах поиска. &lt;strong>Исправление заголовков и мета-описаний&lt;/strong> должно быть главным приоритетом.&lt;/li>
&lt;li>&lt;strong>High CTR, Low Engagement (Высокий CTR, Низкая вовлеченность)&lt;/strong>:
Статьи, на которые кликают, но содержимое разочаровывает, и пользователи уходят. Требуется масштабное переписывание основного текста, например, &lt;strong>улучшение вступления, обновление кода до последних версий и повышение полноты информации (добавление H2/H3)&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="6-анализ-пробелов-в-контенте-с-использованием-nlp-и-tf-idf">6. Анализ пробелов в контенте с использованием NLP и TF-IDF
&lt;/h2>&lt;p>Как только статьи для переписывания определены, следующим шагом является анализ того, &amp;ldquo;какие конкретно заголовки (H2/H3) или ключевые слова следует добавить&amp;rdquo;. Вместо того чтобы полагаться на интуицию, мы будем использовать &lt;strong>TF-IDF (Term Frequency-Inverse Document Frequency) из области обработки естественного языка (NLP)&lt;/strong>.&lt;/p>
&lt;p>TF-IDF — это статистический показатель, используемый для оценки того, насколько важно слово в данном документе.&lt;/p>
$$
TF\text{-}IDF(t, d) = tf(t, d) \times \log\left(\frac{N}{df(t)}\right)
$$&lt;p>Где:&lt;/p>
&lt;ul>
&lt;li>$tf(t, d)$ — частота появления слова $t$ в документе $d$&lt;/li>
&lt;li>$N$ — общее количество документов&lt;/li>
&lt;li>$df(t)$ — количество документов, в которых встречается слово $t$&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Подход:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Получите текстовые данные 10 лучших статей (с сайтов конкурентов) по целевому ключевому слову с помощью веб-скрапинга и т. д.&lt;/li>
&lt;li>Подготовьте текстовые данные целевой статьи с вашего собственного сайта.&lt;/li>
&lt;li>Используя &lt;code>TfidfVectorizer&lt;/code> из библиотеки &lt;code>scikit-learn&lt;/code> на Python, извлеките ключевые слова (характерные слова), которые часто встречаются с высоким показателем в статьях конкурентов, но отсутствуют или имеют значительно более низкий показатель в статье на вашем собственном сайте.&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">sklearn.feature_extraction.text&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">TfidfVectorizer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">numpy&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">np&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># documents = [Текст вашего сайта, Текст статьи конкурента 1, Текст статьи конкурента 2, ...]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Предполагается список текстов, уже разделенных на слова с помощью морфологического анализатора (например, MeCab для японского языка)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">extract_missing_keywords&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">documents&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">vectorizer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">TfidfVectorizer&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">max_df&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.9&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">min_df&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tfidf_matrix&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">vectorizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">fit_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">documents&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">feature_names&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">vectorizer&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get_feature_names_out&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Расчет среднего показателя TF-IDF для статей конкурентов (начиная с индекса 1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">competitor_mean_tfidf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">mean&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tfidf_matrix&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">:]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">toarray&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="n">axis&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Получение показателей TF-IDF для статьи на вашем сайте (индекс 0)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">my_article_tfidf&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">tfidf_matrix&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">toarray&lt;/span>&lt;span class="p">()[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Расчет разрыва для слов, важных у конкурентов, но отсутствующих (или редких) на вашем сайте&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">gap_scores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">competitor_mean_tfidf&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">my_article_tfidf&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Извлечение верхних слов с наибольшим разрывом&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df_gap&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s1">&amp;#39;keyword&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">feature_names&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;gap_score&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">gap_scores&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df_gap&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df_gap&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">by&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;gap_score&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ascending&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">False&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">df_gap&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">20&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Пример: missing_keywords = extract_missing_keywords(processed_docs)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># print(missing_keywords)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>С помощью этого анализа вы сможете количественно обнаружить &lt;strong>пробелы в темах (контентные пробелы)&lt;/strong>, такие как &amp;ldquo;на самом деле, топовые статьи упоминают «как развернуть в Docker-контейнере» и «построение CI/CD пайплайна», а в моей статье об этом ни слова&amp;rdquo;.&lt;/p>
&lt;p>Обнаруженные группы важных ключевых слов не следует просто разбрасывать по тексту; добавив их в виде осмысленных разделов с &lt;strong>заголовками H2 или H3 (теги Heading)&lt;/strong>, и написав подробные технические объяснения и фрагменты кода под этими заголовками, вы сможете значительно повысить оценку от Google.&lt;/p>
&lt;hr>
&lt;h2 id="7-конвейер-данных-и-цикл-непрерывного-улучшения">7. Конвейер данных и цикл непрерывного улучшения
&lt;/h2>&lt;p>Ключ к успеху в SEO — это не просто однократное выполнение процессов, описанных до сих пор, а их превращение в конвейер и постоянное выполнение. Ниже приведена общая архитектура и рабочий процесс (workflow) в виде блок-схемы Mermaid.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Данные GSC API (Показы, Клики, Позиции)&amp;#34;] --&amp;gt; C[&amp;#34;BigQuery / Хранилище данных&amp;#34;]
B[&amp;#34;Экспорт данных GA4 (Просмотры страниц, Время вовлеченности)&amp;#34;] --&amp;gt; C
C --&amp;gt; D[&amp;#34;Python / Pandas Объединение и анализ данных&amp;#34;]
D --&amp;gt; E[&amp;#34;Определение статей с высокими показами / низким CTR&amp;#34;]
E --&amp;gt; F[&amp;#34;NLP Скрапинг конкурентов и извлечение ключевых слов TF-IDF&amp;#34;]
F --&amp;gt; G[&amp;#34;Оптимизация тегов H2/H3 и переписывание контента&amp;#34;]
G --&amp;gt; H[&amp;#34;Публикация обновленной статьи&amp;#34;]
H --&amp;gt; I[&amp;#34;Мониторинг изменений CTR (Ожидаемый против Фактического)&amp;#34;]
I --&amp;gt; |&amp;#34;Цикл обратной связи&amp;#34;| A
&lt;/pre>
&lt;p>Таким образом, систематизируя весь поток — от сбора данных из GSC и GA4 до выбора целей с помощью анализа, оптимизации контента с помощью NLP и мониторинга результатов — медиа-блог становится активом, который продолжает расти автоматически.&lt;/p>
&lt;hr>
&lt;h2 id="8-заключение-и-перспективы">8. Заключение и перспективы
&lt;/h2>&lt;p>Переписывание технических статей с использованием Google Search Console — это не просто исправление текста. Это продвинутая инженерия, которая использует данные и математические модели для предложения оптимальных решений &amp;ldquo;черному ящику&amp;rdquo; алгоритмов поисковых систем.&lt;/p>
&lt;p>Подведем итоги методов, описанных в этой статье:&lt;/p>
&lt;ol>
&lt;li>Вычислите разрыв между &lt;strong>ожидаемым CTR и фактическим CTR&lt;/strong> для выявления статей, на которые исправления окажут наибольшее влияние.&lt;/li>
&lt;li>Используйте &lt;strong>GSC API и Python&lt;/strong> для автоматического извлечения данных о производительности.&lt;/li>
&lt;li>Объедините эти данные с данными о вовлеченности из GA4 в &lt;strong>BigQuery&lt;/strong> и перепишите текст статей с высоким показателем отказов.&lt;/li>
&lt;li>Выявите пробелы в контенте с конкурентами посредством &lt;strong>анализа NLP с использованием TF-IDF&lt;/strong> и оптимизируйте заголовки (H2/H3).&lt;/li>
&lt;/ol>
&lt;p>Технологические тренды постоянно меняются. Чтобы точно отвечать на ошибки и проблемы, с которыми сейчас сталкиваются читатели, обязательно внедрите в свои повседневные операции стратегическое переписывание, опирающееся на данные.&lt;/p></description></item><item><title>Что должны делать инженеры, чтобы увеличить ежемесячный трафик своего технического блога</title><link>http://kenji.blog/ru/p/tech-blog-growth-strategies-for-engineers/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/ru/p/tech-blog-growth-strategies-for-engineers/</guid><description>&lt;img src="http://kenji.blog/p/tech-blog-growth-strategies-for-engineers/img/eyecatch.jpg" alt="Featured image of post Что должны делать инженеры, чтобы увеличить ежемесячный трафик своего технического блога" />&lt;h2 id="введение-гроуз-хакинг-технического-блога-доступный-только-инженерам">Введение: Гроуз-хакинг технического блога, доступный только инженерам
&lt;/h2>&lt;p>Многие инженеры-программисты создают технические блоги, но далеко не всем удается привлечь определенное количество трафика и поддерживать, а тем более увеличивать его в течение длительного времени. Написание качественных технических статей является обязательным условием, но эпоха «напиши хорошую статью, и её обязательно прочитают» уже прошла. Сегодня алгоритмы поисковых систем стали значительно сложнее, а скорость распространения информации в социальных сетях достигла небывалых высот.&lt;/p>
&lt;p>Однако у инженеров есть преимущество перед представителями других профессий. Оно заключается в способности «понимать системную архитектуру, комбинировать инструменты для автоматизации и программно анализировать данные». В этой статье мы не ограничимся лишь техниками написания текстов, а рассмотрим технический блог как «продукт» и подробно, с практическими примерами, разберем стратегии радикального увеличения ежемесячного трафика с помощью инженерных навыков.&lt;/p>
&lt;hr>
&lt;h2 id="1-seo-архитектура-технического-блога-для-инженеров">1. SEO-архитектура технического блога для инженеров
&lt;/h2>&lt;p>Базовая система блога (например, генератор статических сайтов) и структура HTML являются важнейшими факторами для правильной интерпретации контента поисковыми системами.&lt;/p>
&lt;h3 id="11-оптимизация-core-web-vitals">1.1 Оптимизация Core Web Vitals
&lt;/h3>&lt;p>Google использует Page Experience как фактор ранжирования, и в частности &lt;strong>Core Web Vitals (LCP, FID/INP, CLS)&lt;/strong> не стоит игнорировать даже в технических блогах.
В технических блогах часто используется множество блоков исходного кода, математических формул (MathJax / KaTeX) и иллюстраций. Они могут стать причиной задержки рендеринга страницы.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LCP (Largest Contentful Paint)&lt;/strong>: Скорость загрузки основного контента на первом экране. Для главного изображения используйте форматы WebP или AVIF и предзагружайте его с атрибутом &lt;code>fetchpriority=&amp;quot;high&amp;quot;&lt;/code>. Огромные CSS и JS для подсветки синтаксиса должны загружаться асинхронно или только на тех страницах, где они действительно нужны.&lt;/li>
&lt;li>&lt;strong>CLS (Cumulative Layout Shift)&lt;/strong>: Смещение макета во время загрузки страницы. Резервирование области отображения для формул и изображений заранее с помощью CSS (например, &lt;code>aspect-ratio&lt;/code>) предотвратит скачки макета при последующей вставке DOM-элементов.&lt;/li>
&lt;li>&lt;strong>INP (Interaction to Next Paint)&lt;/strong>: Отзывчивость на действия пользователя. Тяжелый JavaScript (например, динамический полнотекстовый поиск на стороне клиента или выполнение громоздкого парсера Markdown) не должен выполняться в главном потоке — его необходимо выносить в Web Worker или генерировать как статический HTML на этапе сборки (SSG).&lt;/li>
&lt;/ul>
&lt;h3 id="12-внедрение-структурированных-данных-json-ld">1.2 Внедрение структурированных данных (JSON-LD)
&lt;/h3>&lt;p>Чтобы явно сообщить поисковым системам, что страница является «статьей», а также кто является её «автором», внедрите структурированные данные в формате JSON-LD. Использование таких схем, как &lt;code>TechArticle&lt;/code> и &lt;code>SoftwareSourceCode&lt;/code>, повышает шансы на появление в расширенных результатах (Rich Results) Google, что в свою очередь увеличивает CTR (кликабельность).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;application/ld+json&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@context&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://schema.org&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;TechArticle&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;headline&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Что должны делать инженеры, чтобы увеличить ежемесячный трафик своего технического блога&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;image&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;https://example.com/img/eyecatch.jpg&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;datePublished&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;2026-09-14T10:00:00+09:00&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;author&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Person&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Kenji&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://example.com/about/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;publisher&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Organization&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;name&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;Kenji&amp;#39;s Tech Blog&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;logo&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;@type&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;ImageObject&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;url&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://example.com/img/logo.png&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="13-семантический-html-и-оптимизация-структуры-документа">1.3 Семантический HTML и оптимизация структуры документа
&lt;/h3>&lt;p>Правильная вложенность заголовков (&lt;code>h1&lt;/code>–&lt;code>h6&lt;/code>) — это основы, но технический блог требует точного использования семантических тегов HTML5, таких как &lt;code>article&lt;/code>, &lt;code>section&lt;/code>, &lt;code>aside&lt;/code> и &lt;code>nav&lt;/code>. Кроме того, надлежащее использование тегов &lt;code>&amp;lt;code&amp;gt;&lt;/code> и &lt;code>&amp;lt;pre&amp;gt;&lt;/code> для исходного кода, &lt;code>&amp;lt;kbd&amp;gt;&lt;/code> для ввода с клавиатуры и &lt;code>&amp;lt;var&amp;gt;&lt;/code> для переменных позволяет предоставлять машиночитаемый HTML. Это также очень эффективная мера для индексации контента искусственным интеллектом (сбор обучающих данных для LLM или систем RAG).&lt;/p>
&lt;hr>
&lt;h2 id="2-психология-поискового-намерения-search-intent-и-стратегия-ключевых-слов">2. Психология поискового намерения (Search Intent) и стратегия ключевых слов
&lt;/h2>&lt;p>Чтобы максимизировать органический трафик из поисковых систем, необходимо точно понимать поисковое намерение — «почему пользователь ищет именно по этому ключевому слову». В технической сфере поисковые намерения можно условно разделить на две категории.&lt;/p>
&lt;h3 id="21-решение-ошибок-и-системное-обучение-и-обзоры">2.1 «Решение ошибок» и «Системное обучение и обзоры»
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Намерение решить ошибку (Troubleshooting Intent)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Примеры ключевых слов: &lt;code>Решение Docker &amp;quot;no space left on device&amp;quot;&lt;/code>, &lt;code>Причина Python IndexError list index out of range&lt;/code>&lt;/li>
&lt;li>Психология: Пользователь заблокирован ошибкой в процессе разработки и нуждается в быстром решении — команде или фрагменте кода.&lt;/li>
&lt;li>Стратегия: В самом начале статьи (на первом экране) представьте «заключение» (код или команду для решения проблемы). Пояснения, контекст и подробные механизмы размещайте ниже, в первую очередь удовлетворяя желание пользователя «быстро всё исправить». Это позволит снизить показатель отказов (Bounce Rate).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Намерение системного обучения и обзоров (Learning &amp;amp; Review Intent)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Примеры ключевых слов: &lt;code>Сравнение React vs Vue 2026&lt;/code>, &lt;code>Введение в асинхронное программирование Rust&lt;/code>, &lt;code>Проектирование сетевой архитектуры GCP&lt;/code>&lt;/li>
&lt;li>Психология: Пользователь хочет выбрать новый технологический стек или углубить понимание основ, и готов потратить время на чтение.&lt;/li>
&lt;li>Стратегия: Сделайте подробное оглавление (TOC), используйте множество иллюстраций и диаграмм архитектуры (например, Mermaid). Объективное сравнение преимуществ и недостатков, а также примеры использования в реальных рабочих задачах (Use Cases) помогут увеличить время пребывания на странице.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="22-модель-экспоненциального-затухания-трафика-и-стратегия-длинного-хвоста-long-tail">2.2 Модель экспоненциального затухания трафика и стратегия длинного хвоста (Long Tail)
&lt;/h3>&lt;p>Трафик технических статей часто образует пик (всплеск) сразу после публикации за счет виральности в социальных сетях, после чего имеет тенденцию к экспоненциальному снижению. Этот трафик $V(t)$ можно аппроксимировать следующей математической моделью:&lt;/p>
$$ V(t) = V_0 e^{-\lambda t} + C $$&lt;p>Где:&lt;/p>
&lt;ul>
&lt;li>$V(t)$: Объем трафика в момент времени $t$&lt;/li>
&lt;li>$V_0$: Величина начального пика трафика, вызванного соцсетями и т.д. сразу после публикации&lt;/li>
&lt;li>$\lambda$: Константа затухания, связанная с устареванием контента и забыванием в соцсетях (зависит от скорости изменения технологических трендов)&lt;/li>
&lt;li>$C$: Стабильный органический поисковый трафик из поисковых систем (базовый трафик)&lt;/li>
&lt;/ul>
&lt;p>Ключ к долгосрочному росту трафика заключается не в погоне за временными всплесками ($V_0$), а в том, &lt;strong>как максимально увеличить константу $C$ (постоянный приток из поисковиков)&lt;/strong>. Охватывая большое количество «низкочастотных запросов» (Long Tail Keywords), таких как специфические редкие ошибки или способы интеграции определенных инструментов, где мало конкуренции, даже при небольшом объеме поиска, вы можете вырастить общую сумму $C$ до огромных размеров.&lt;/p>
&lt;hr>
&lt;h2 id="3-анализ-контента-на-основе-данных-с-использованием-google-search-console-api">3. Анализ контента на основе данных с использованием Google Search Console API
&lt;/h2>&lt;p>Чтобы построить стабильную базу трафика $C$, необходимо использовать данные Google Search Console (GSC) для объективного анализа того, «как вас оценивает Google». Однако ручная работа в веб-интерфейсе GSC имеет свои ограничения. Если вы инженер, автоматизируйте анализ с помощью GSC API и Python.&lt;/p>
&lt;h3 id="31-подход-к-автоматизации-с-помощью-gsc-api-и-python">3.1 Подход к автоматизации с помощью GSC API и Python
&lt;/h3>&lt;p>Создайте скрипт, который будет автоматически обнаруживать «статьи с упущенным потенциалом» — например, статьи, позиции которых со временем падают (Decaying Content), или статьи с высоким количеством показов (Impressions), но аномально низким показателем кликабельности (CTR).
Для этого используются &lt;code>google-api-python-client&lt;/code> и &lt;code>pandas&lt;/code>.&lt;/p>
&lt;h3 id="32-реализация-на-python-автоматическое-извлечение-контента-со-снижающимся-ctr">3.2 Реализация на Python: Автоматическое извлечение контента со снижающимся CTR
&lt;/h3>&lt;p>Ниже приведен пример скрипта, который получает данные об эффективности поиска за последние 30 дней через API и извлекает «ключевые слова и URL-адреса статей, где есть большой потенциал для улучшения заголовков и описаний» — с количеством показов более 1000 и CTR менее 2%.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pandas&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">pd&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">google.oauth2&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">service_account&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">googleapiclient.discovery&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">build&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">datetime&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. Аутентификация и инициализация сервиса API&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">KEY_FILE_LOCATION&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;path/to/your-service-account-key.json&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SCOPES&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;https://www.googleapis.com/auth/webmasters.readonly&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">SITE_URL&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;https://your-tech-blog.com/&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">credentials&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">service_account&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">Credentials&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">from_service_account_file&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">KEY_FILE_LOCATION&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">scopes&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">SCOPES&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">webmasters_service&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">build&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;searchconsole&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;v1&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">credentials&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">credentials&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. Вычисление периода запроса (последние 30 дней)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">today&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">date&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">today&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">end_date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">today&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">start_date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">today&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">datetime&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">timedelta&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">days&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">32&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">strftime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;%Y-%m-&lt;/span>&lt;span class="si">%d&lt;/span>&lt;span class="s1">&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. Выполнение запроса к API&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">request&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;startDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">start_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;endDate&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">end_date&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;dimensions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;query&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;page&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;rowLimit&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">5000&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">webmasters_service&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">searchanalytics&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">query&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">siteUrl&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">SITE_URL&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">body&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">request&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">execute&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. Обработка данных и фильтрация с использованием Pandas DataFrame&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="s1">&amp;#39;rows&amp;#39;&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rows&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;rows&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">row&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">rows&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">data&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">append&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Query&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;keys&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;URL&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;keys&amp;#39;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Clicks&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;clicks&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Impressions&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;impressions&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;CTR&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;ctr&amp;#39;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s1">&amp;#39;Position&amp;#39;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">row&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;position&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">pd&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DataFrame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Условия фильтрации: Показов 1000 и более И CTR менее 2%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">df&lt;/span>&lt;span class="p">[(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;Impressions&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;CTR&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mf">0.02&lt;/span>&lt;span class="p">)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Сортировка по возрастанию позиции (приоритет тем, которые высоко ранжируются, но по которым не кликают)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sort_values&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">by&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;Position&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ascending&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">True&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;【Рекомендуемый список для улучшения заголовков/мета-описаний】&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_df&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">head&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">10&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Экспорт в CSV при необходимости&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># target_df.to_csv(&amp;#39;improve_candidates.csv&amp;#39;, index=False)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">else&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Данные не найдены.&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Запуская этот скрипт по расписанию через cron или GitHub Actions, вы сможете всегда на основе данных принимать решения о том, «заголовок какой статьи следует переписать». Важно опираться не на интуицию, а на непрерывное улучшение контента на основе данных (Continuous Content Improvement, аналог CI/CD).&lt;/p>
&lt;hr>
&lt;h2 id="4-управление-жизненным-циклом-статей-и-стратегия-переписывания-rewrite">4. Управление жизненным циклом статей и стратегия переписывания (Rewrite)
&lt;/h2>&lt;p>Создание технической статьи не заканчивается её публикацией. С развитием технологий (обновления версий фреймворков, устаревание API и т.д.) контент быстро теряет актуальность. Продолжение предоставления устаревшей информации не только вредит репутации блога, но и негативно сказывается на SEO-оценке.&lt;/p>
&lt;h3 id="41-управление-жизненным-циклом-контента-диаграмма-ганта">4.1 Управление жизненным циклом контента (Диаграмма Ганта)
&lt;/h3>&lt;p>Идеальный жизненный цикл управления контентом показан на диаграмме Ганта Mermaid.&lt;/p>
&lt;pre class="mermaid">
gantt
title Управление жизненным циклом контента на основе данных
dateFormat YYYY-MM-DD
axisFormat %m/%d
section &amp;#34;Фаза 1: Планирование и написание&amp;#34;
&amp;#34;Анализ ключевых слов и трендов&amp;#34; :a1, 2026-09-01, 3d
&amp;#34;Черновик и проверка кода&amp;#34; :a2, after a1, 5d
&amp;#34;Редактура и корректура&amp;#34; :a3, after a2, 2d
section &amp;#34;Фаза 2: Публикация и продвижение&amp;#34;
&amp;#34;Развертывание через CI/CD пайплайн&amp;#34; :p1, 2026-09-11, 1d
&amp;#34;Автоматическая публикация в соцсетях (X, LinkedIn, RSS)&amp;#34; :p2, 2026-09-11, 1d
&amp;#34;Распространение в сервисах закладок (Hatena и др.)&amp;#34; :p3, after p2, 3d
section &amp;#34;Фаза 3: Наблюдение и анализ&amp;#34;
&amp;#34;Период накопления данных GSC&amp;#34; :m1, 2026-09-14, 28d
&amp;#34;Оценка эффективности с помощью Python API&amp;#34;:m2, after m1, 2d
section &amp;#34;Фаза 4: Улучшение (Переписывание)&amp;#34;
&amp;#34;Исправление заголовков статей со снизившимся CTR&amp;#34; :r1, after m2, 3d
&amp;#34;Обновление кода до последней версии&amp;#34;:r2, after r1, 4d
&lt;/pre>
&lt;p>Таким образом, отношение к созданию статей как к проекту по разработке программного обеспечения и включение фазы эксплуатации и обслуживания (переписывания) после релиза в план — это секрет поддержания и увеличения трафика.&lt;/p>
&lt;h3 id="42-математическая-модель-рентабельности-инвестиций-roi-при-создании-контента">4.2 Математическая модель рентабельности инвестиций (ROI) при создании контента
&lt;/h3>&lt;p>Поскольку инженеры тратят свое драгоценное время на написание статей, им следует осознавать рентабельность своих инвестиций (ROI).
ROI для блога можно сформулировать следующим образом:&lt;/p>
$$ ROI = \frac{\sum_{t=1}^{T} \left( Rev_{ad}(t) + Val_{brand}(t) + Val_{skill}(t) \right) - Cost_{time}}{\text{Cost}_{time}} \times 100 \ (\%) $$&lt;ul>
&lt;li>$T$: Срок эффективной жизни статьи (период до её устаревания)&lt;/li>
&lt;li>$Rev_{ad}(t)$: Прямой доход от рекламы, партнерских программ (affiliate) и спонсорства&lt;/li>
&lt;li>$Val_{brand}(t)$: Денежный эквивалент положительного влияния на карьеру за счет демонстрации технических навыков (увеличение суммы оффера при смене работы, приглашения выступить с докладом и т.д.)&lt;/li>
&lt;li>$Val_{skill}(t)$: Ценность повышения собственных навыков за счет обучения и исследований, проведенных для написания статьи&lt;/li>
&lt;li>$Cost_{time}$: Время, затраченное на написание статьи, создание иллюстраций и проверку кода (в пересчете на собственную почасовую ставку)&lt;/li>
&lt;/ul>
&lt;p>Прекрасная особенность технических блогов заключается в том, что даже если $Rev_{ad}$ невелик, $Val_{brand}$ и $Val_{skill}$ имеют тенденцию быть чрезвычайно большими. В частности, качественные технические объяснения становятся вашим портфолио и демонстрируют огромную силу при поиске работы или получении дополнительных заказов (подработки).&lt;/p>
&lt;hr>
&lt;h2 id="5-дистрибуция-за-счет-интеграции-github-actions-и-внешних-инструментов-автоматизации">5. Дистрибуция за счет интеграции GitHub Actions и внешних инструментов автоматизации
&lt;/h2>&lt;p>После создания контента возникает проблема: как наиболее эффективно доставить его целевой аудитории (дистрибуция). Публикация ссылок в каждой социальной сети вручную каждый раз неэффективна и не свойственна инженерам.&lt;/p>
&lt;h3 id="51-архитектура-автоматизации-шаринга-в-социальных-сетях">5.1 Архитектура автоматизации шаринга в социальных сетях
&lt;/h3>&lt;p>Мы построим архитектуру, которая полностью автоматизирует процесс от момента слияния (merge) Markdown-файла в ветку main репозитория GitHub до сборки, развертывания и оповещения на множестве платформ.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Разработчик (Git Push)&amp;#34;] --&amp;gt; B[&amp;#34;Репозиторий GitHub&amp;#34;]
B --&amp;gt;|Webhook| C[&amp;#34;GitHub Actions (CI/CD)&amp;#34;]
C --&amp;gt;|Сборка (Build)| D[&amp;#34;Генератор статических сайтов (Hugo/Gatsby)&amp;#34;]
D --&amp;gt;|Развертывание (Deploy)| E[&amp;#34;Хостинг (Vercel / Cloudflare Pages)&amp;#34;]
D --&amp;gt;|Генерация| F[&amp;#34;RSS-канал (index.xml)&amp;#34;]
F --&amp;gt;|Опрос (Polled by)| G[&amp;#34;Zapier / IFTTT / Make&amp;#34;]
G --&amp;gt;|Вызов API| H[&amp;#34;Автопубликация в X (Twitter)&amp;#34;]
G --&amp;gt;|Вызов API| I[&amp;#34;Публикация статьи в LinkedIn&amp;#34;]
G --&amp;gt;|Вызов API| J[&amp;#34;Webhook сообщества Discord / Slack&amp;#34;]
C --&amp;gt;|Скрипт Actions| K[&amp;#34;Кросс-постинг API в Qiita / Zenn&amp;#34;]
&lt;/pre>
&lt;h3 id="52-ключевые-моменты-создания-пайплайна-автоматизации">5.2 Ключевые моменты создания пайплайна автоматизации
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Сборка и развертывание с помощью GitHub Actions&lt;/strong>
Если вы используете генератор статических сайтов, используйте GitHub Actions для автоматизации генерации HTML и развертывания на хостинге (Vercel, Netlify, Cloudflare Pages и т.д.). При этом, в качестве меры для Core Web Vitals, упомянутой ранее, эффективно внедрить в пайплайн сборки процесс оптимизации изображений (например, автоматическую конвертацию в WebP).&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Интеграция с социальными сетями на основе RSS-триггеров с использованием Zapier/IFTTT&lt;/strong>
Генератор сайтов при сборке создает актуальный RSS-канал (XML). Загрузив его в iPaaS, такие как Zapier или Make (ранее Integromat), можно настроить рабочий процесс (workflow): «Когда в RSS добавляется новый элемент, публиковать заголовок и URL в X (Twitter) и LinkedIn». Таким образом, уведомление подписчиков происходит автоматически в момент публикации статьи.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Кросс-постинг в Qiita/Zenn (использование тега Canonical)&lt;/strong>
Пока сила домена вашего собственного или корпоративного блога невелика, можно использовать привлекающую силу технических платформ, таких как Qiita или Zenn. Однако простой копипаст несет риск получения SEO-санкций за дублированный контент.
Эту проблему можно решить, установив тег &lt;strong>Canonical&lt;/strong> в метаданных статьи на Qiita или Zenn, указав URL оригинальной статьи в вашем блоге. Написав скрипт, который вызывает API различных платформ из GitHub Actions и автоматически генерирует статьи из Markdown, вы можете полностью автоматизировать мульти-канальную дистрибуцию.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="заключение-запуск-цикла-непрерывного-улучшения">Заключение: Запуск цикла непрерывного улучшения
&lt;/h2>&lt;p>Чтобы радикально увеличить ежемесячный трафик в техническом блоге, помимо самого процесса «написания», необходимы инженерные подходы, подобные тем, что представлены в этой статье.&lt;/p>
&lt;ol>
&lt;li>Построение надежной HTML- и сайт-архитектуры с учетом SEO&lt;/li>
&lt;li>Проектирование статей с пониманием поисковых намерений пользователей (решение ошибок против системного обучения)&lt;/li>
&lt;li>Анализ данных с использованием Google Search Console API и Python&lt;/li>
&lt;li>Управление жизненным циклом контента и переписывание с учетом ROI&lt;/li>
&lt;li>Полная автоматизация дистрибуции через интеграцию с CI/CD и Zapier&lt;/li>
&lt;/ol>
&lt;p>Если вы сможете собрать это воедино как систему, ваш технический блог станет мощнейшим активом (Asset), который будет сильно продвигать вашу карьеру. Инженеры, которые страдают от стагнации трафика, пожалуйста, начните применять «гроуз-хакинг блога» уже сегодня. Навыки программирования и проектирования архитектуры, отточенные в процессе разработки, должны стать вашим величайшим оружием и в управлении блогом.&lt;/p></description></item></channel></rss>