<?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/fr/tags/google-search-console/</link><description>Recent content in Google Search Console on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/google-search-console/index.xml" rel="self" type="application/rss+xml"/><item><title>Ce que les ingénieurs doivent faire pour augmenter le trafic mensuel de leur blog technique</title><link>http://kenji.blog/fr/p/tech-blog-growth-strategies-for-engineers/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/fr/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 Ce que les ingénieurs doivent faire pour augmenter le trafic mensuel de leur blog technique" />&lt;h2 id="introduction--le-growth-hacking-des-blogs-techniques-une-compétence-propre-aux-ingénieurs">Introduction : Le Growth Hacking des blogs techniques, une compétence propre aux ingénieurs
&lt;/h2>&lt;p>Beaucoup d&amp;rsquo;ingénieurs logiciels lancent un blog technique, mais rares sont ceux qui parviennent à attirer un certain niveau de trafic et à le maintenir ou l&amp;rsquo;augmenter sur le long terme. Rédiger des articles techniques de haute qualité est une condition préalable, mais l&amp;rsquo;époque où « écrire de bons articles suffisait pour être lu naturellement » est bel et bien révolue. Les algorithmes actuels des moteurs de recherche sont devenus complexes, et le flux d&amp;rsquo;informations sur les réseaux sociaux est plus rapide que jamais.&lt;/p>
&lt;p>Cependant, les ingénieurs possèdent des atouts que d&amp;rsquo;autres professions n&amp;rsquo;ont pas. Ils sont capables de « comprendre l&amp;rsquo;architecture des systèmes, de combiner des outils pour automatiser des processus, et d&amp;rsquo;analyser des données via la programmation ». Dans cet article, au lieu de nous limiter à de simples techniques de rédaction, nous considérerons le blog technique comme un véritable « produit » et expliquerons de manière très détaillée et pratique les stratégies permettant d&amp;rsquo;augmenter drastiquement le trafic mensuel grâce au pouvoir de l&amp;rsquo;ingénierie.&lt;/p>
&lt;hr>
&lt;h2 id="1-architecture-seo-pour-les-blogs-techniques-à-lattention-des-ingénieurs">1. Architecture SEO pour les blogs techniques à l&amp;rsquo;attention des ingénieurs
&lt;/h2>&lt;p>Le système de base du blog (comme les générateurs de sites statiques) et la structure HTML sont les éléments les plus cruciaux pour que les moteurs de recherche puissent interpréter correctement le contenu.&lt;/p>
&lt;h3 id="11-optimisation-des-signaux-web-essentiels-core-web-vitals">1.1 Optimisation des Signaux Web Essentiels (Core Web Vitals)
&lt;/h3>&lt;p>Google utilise l&amp;rsquo;expérience sur la page comme facteur de classement, et les &lt;strong>Signaux Web Essentiels (LCP, FID/INP, CLS)&lt;/strong> ne peuvent être ignorés, même pour un blog technique.
Les blogs techniques utilisent souvent de nombreux blocs de code source, des formules mathématiques (MathJax / KaTeX) et des illustrations. Ces éléments ont tendance à retarder le rendu de la page.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>LCP (Largest Contentful Paint)&lt;/strong> : Vitesse de chargement du contenu principal dans la ligne de flottaison. Utilisez le WebP ou l&amp;rsquo;AVIF pour les images à la une, et préchargez-les en ajoutant l&amp;rsquo;attribut &lt;code>fetchpriority=&amp;quot;high&amp;quot;&lt;/code>. De plus, les gros fichiers CSS ou JS pour la coloration syntaxique doivent être chargés de manière asynchrone ou conçus pour n&amp;rsquo;être chargés que sur les pages nécessaires.&lt;/li>
&lt;li>&lt;strong>CLS (Cumulative Layout Shift)&lt;/strong> : Décalage inattendu de la mise en page pendant le chargement de l&amp;rsquo;article. En réservant à l&amp;rsquo;avance l&amp;rsquo;espace d&amp;rsquo;affichage pour les formules et les images à l&amp;rsquo;aide de la propriété CSS &lt;code>aspect-ratio&lt;/code>, etc., vous évitez les sauts visuels lors de l&amp;rsquo;insertion ultérieure de nœuds DOM.&lt;/li>
&lt;li>&lt;strong>INP (Interaction to Next Paint)&lt;/strong> : Réactivité aux interactions de l&amp;rsquo;utilisateur. Il est impératif de ne pas exécuter de JavaScript lourd (par exemple, une recherche plein texte dynamique côté client ou l&amp;rsquo;exécution d&amp;rsquo;un énorme parseur Markdown) sur le thread principal. Il faut le déléguer à un Web Worker ou générer du HTML statique lors du build (SSG).&lt;/li>
&lt;/ul>
&lt;h3 id="12-implémentation-des-données-structurées-json-ld">1.2 Implémentation des données structurées (JSON-LD)
&lt;/h3>&lt;p>Afin d&amp;rsquo;indiquer explicitement aux moteurs de recherche que la page est un « article » et qui en est « l&amp;rsquo;auteur », implémentez des données structurées au format JSON-LD. L&amp;rsquo;utilisation de schémas tels que &lt;code>TechArticle&lt;/code> ou &lt;code>SoftwareSourceCode&lt;/code> augmente la probabilité d&amp;rsquo;apparaître dans les résultats enrichis de Google, ce qui améliore le CTR (taux de clics).&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;Ce que les ingénieurs doivent faire pour augmenter le trafic mensuel de leur blog technique&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-sémantique-et-optimisation-de-la-structure-du-document">1.3 HTML sémantique et optimisation de la structure du document
&lt;/h3>&lt;p>L&amp;rsquo;imbrication correcte des balises d&amp;rsquo;en-tête (&lt;code>h1&lt;/code> à &lt;code>h6&lt;/code>) est fondamentale, mais un blog technique exige également l&amp;rsquo;utilisation précise des balises sémantiques HTML5 telles que &lt;code>article&lt;/code>, &lt;code>section&lt;/code>, &lt;code>aside&lt;/code> et &lt;code>nav&lt;/code>. De plus, l&amp;rsquo;utilisation appropriée des balises &lt;code>&amp;lt;code&amp;gt;&lt;/code> et &lt;code>&amp;lt;pre&amp;gt;&lt;/code> pour le code source, &lt;code>&amp;lt;kbd&amp;gt;&lt;/code> pour les entrées clavier, et &lt;code>&amp;lt;var&amp;gt;&lt;/code> pour les variables permet de fournir un HTML lisible par les machines. Il s&amp;rsquo;agit également d&amp;rsquo;une méthode très efficace pour l&amp;rsquo;indexation de contenu par l&amp;rsquo;IA (collecte de données d&amp;rsquo;apprentissage pour les LLM et systèmes RAG).&lt;/p>
&lt;hr>
&lt;h2 id="2-psychologie-de-lintention-de-recherche-et-stratégie-de-mots-clés">2. Psychologie de l&amp;rsquo;intention de recherche et stratégie de mots-clés
&lt;/h2>&lt;p>Pour maximiser le trafic en provenance des moteurs de recherche (trafic organique), il est nécessaire de déchiffrer avec précision l&amp;rsquo;intention de recherche de l&amp;rsquo;utilisateur, c&amp;rsquo;est-à-dire « pourquoi il a cherché ce mot-clé ». Les intentions de recherche dans le domaine technique peuvent être classées en deux grandes catégories.&lt;/p>
&lt;h3 id="21-type--résolution-derreur--et-type--apprentissage-systématique--revue-">2.1 Type « Résolution d&amp;rsquo;erreur » et Type « Apprentissage systématique / Revue »
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Type Résolution d&amp;rsquo;erreur (Troubleshooting Intent)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Exemples de mots-clés : &lt;code>Docker &amp;quot;no space left on device&amp;quot; solution&lt;/code>, &lt;code>Python IndexError list index out of range cause&lt;/code>&lt;/li>
&lt;li>Psychologie : Bloqué par une erreur lors du développement, l&amp;rsquo;utilisateur cherche un remède immédiat sous forme de commande ou d&amp;rsquo;extrait de code.&lt;/li>
&lt;li>Stratégie : Présentez la « conclusion (code ou commande pour résoudre le problème) » dès le début de l&amp;rsquo;article (dans la ligne de flottaison). Placez le contexte et les explications détaillées des mécanismes plus bas, afin de satisfaire immédiatement le désir de l&amp;rsquo;utilisateur de « réparer tout de suite ». Cela permet de réduire le taux de rebond (bounce rate).&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Type Apprentissage systématique / Revue (Learning &amp;amp; Review Intent)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Exemples de mots-clés : &lt;code>React vs Vue 2026 comparaison&lt;/code>, &lt;code>Rust traitement asynchrone introduction&lt;/code>, &lt;code>GCP architecture réseau conception&lt;/code>&lt;/li>
&lt;li>Psychologie : Souhaite sélectionner une nouvelle stack technique ou approfondir sa compréhension depuis les bases, et est prêt à prendre le temps de lire.&lt;/li>
&lt;li>Stratégie : Enrichissez la table des matières (TOC) et utilisez de nombreux schémas et diagrammes d&amp;rsquo;architecture (comme Mermaid). Comparez objectivement les avantages et les inconvénients, et incluez des cas d&amp;rsquo;utilisation pour montrer comment cela s&amp;rsquo;applique dans la pratique, ce qui augmentera le temps passé sur la page.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="22-modèle-de-décroissance-exponentielle-du-trafic-et-stratégie-de-longue-traîne">2.2 Modèle de décroissance exponentielle du trafic et stratégie de longue traîne
&lt;/h3>&lt;p>Le trafic d&amp;rsquo;un article technique a tendance à former un pic (augmentation soudaine) immédiatement après sa publication grâce au buzz sur les réseaux sociaux, puis à diminuer de manière exponentielle. Ce trafic $V(t)$ peut être approximé par le modèle mathématique suivant :&lt;/p>
$$ V(t) = V_0 e^{-\lambda t} + C $$&lt;p>Où :&lt;/p>
&lt;ul>
&lt;li>$V(t)$ : Volume de trafic à l&amp;rsquo;instant $t$&lt;/li>
&lt;li>$V_0$ : Volume du pic de trafic initial dû au buzz sur les réseaux sociaux juste après la publication&lt;/li>
&lt;li>$\lambda$ : Constante d&amp;rsquo;atténuation due à l&amp;rsquo;obsolescence du contenu ou à l&amp;rsquo;oubli sur les réseaux sociaux (dépend de la vitesse d&amp;rsquo;évolution des tendances technologiques)&lt;/li>
&lt;li>$C$ : Trafic organique stable provenant des moteurs de recherche (trafic de base)&lt;/li>
&lt;/ul>
&lt;p>La clé pour augmenter le trafic sur le long terme ne réside pas dans la recherche d&amp;rsquo;un buzz temporaire ($V_0$), mais dans &lt;strong>la façon d&amp;rsquo;augmenter le terme constant $C$ (l&amp;rsquo;afflux continu provenant des moteurs de recherche)&lt;/strong>. En couvrant un grand nombre de « mots-clés de longue traîne » – comme des erreurs spécifiques et de niche ou des méthodes d&amp;rsquo;intégration entre des outils précis – qui ont un faible volume de recherche mais aucune concurrence, vous ferez croître la somme de $C$ pour en faire un volume colossal.&lt;/p>
&lt;hr>
&lt;h2 id="3-analyse-de-contenu-axée-sur-les-données-à-laide-de-lapi-google-search-console">3. Analyse de contenu axée sur les données à l&amp;rsquo;aide de l&amp;rsquo;API Google Search Console
&lt;/h2>&lt;p>Afin de construire une base de trafic stable $C$, il est nécessaire d&amp;rsquo;utiliser les données de la Google Search Console (GSC) et d&amp;rsquo;analyser objectivement « comment vous êtes évalué par Google ». Cependant, cliquer manuellement sur l&amp;rsquo;interface web de GSC a ses limites. En tant qu&amp;rsquo;ingénieur, automatisez l&amp;rsquo;analyse à l&amp;rsquo;aide de l&amp;rsquo;API GSC et de Python.&lt;/p>
&lt;h3 id="31-approche-dautomatisation-avec-lapi-gsc-et-python">3.1 Approche d&amp;rsquo;automatisation avec l&amp;rsquo;API GSC et Python
&lt;/h3>&lt;p>Nous allons créer un script qui détecte automatiquement la manière dont le classement de recherche d&amp;rsquo;un article spécifique baisse avec le temps (Decaying Content), ou les « articles gaspillés » qui ont un nombre élevé d&amp;rsquo;impressions mais un taux de clics (CTR) anormalement bas.
Pour cela, nous utiliserons &lt;code>google-api-python-client&lt;/code> et &lt;code>pandas&lt;/code>.&lt;/p>
&lt;h3 id="32-implémentation-en-python--extraction-automatique-des-contenus-à-faible-ctr">3.2 Implémentation en Python : Extraction automatique des contenus à faible CTR
&lt;/h3>&lt;p>Voici un exemple de script qui récupère les données de performance de recherche des 30 derniers jours via l&amp;rsquo;API, et extrait les « mots-clés et URL d&amp;rsquo;articles ayant une grande marge d&amp;rsquo;amélioration pour le titre ou la description », c&amp;rsquo;est-à-dire ceux dont le nombre d&amp;rsquo;impressions est supérieur ou égal à 1000 et le CTR inférieur ou égal à 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. Authentification et construction du service 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. Calcul de la période de requête (30 derniers jours)&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. Exécution de la requête 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. Traitement des données et filtrage avec 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"># Conditions de filtrage : Impressions &amp;gt;= 1000 &amp;amp; CTR &amp;lt; 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"># Tri croissant par position (priorité aux classements élevés non cliqués)&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;【Liste des recommandations pour améliorer les titres/méta-descriptions】&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"># Export CSV si nécessaire&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;Aucune donnée trouvée.&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>En exécutant ce script via des tâches planifiées avec cron ou GitHub Actions, vous pouvez toujours décider de manière axée sur les données « quels titres d&amp;rsquo;articles doivent être réécrits ». Au lieu de se fier à l&amp;rsquo;intuition, une amélioration continue basée sur les données (une sorte de Continuous Content Improvement plutôt que CI/CD) est primordiale.&lt;/p>
&lt;hr>
&lt;h2 id="4-gestion-du-cycle-de-vie-des-articles-et-stratégie-de-réécriture">4. Gestion du cycle de vie des articles et stratégie de réécriture
&lt;/h2>&lt;p>Un article technique ne s&amp;rsquo;arrête pas à sa publication. Avec l&amp;rsquo;évolution des technologies (mise à jour de frameworks, dépréciation d&amp;rsquo;API, etc.), le contenu devient obsolète en un clin d&amp;rsquo;œil. Continuer à fournir des informations obsolètes nuit non seulement à la crédibilité du blog, mais entraîne également une évaluation négative en termes de SEO.&lt;/p>
&lt;h3 id="41-gestion-du-cycle-de-vie-du-contenu-diagramme-de-gantt">4.1 Gestion du cycle de vie du contenu (Diagramme de Gantt)
&lt;/h3>&lt;p>Nous illustrons le cycle de vie idéal pour la gestion du contenu avec un diagramme de Gantt Mermaid.&lt;/p>
&lt;pre class="mermaid">
gantt
title Gestion du cycle de vie du contenu axée sur les données
dateFormat YYYY-MM-DD
axisFormat %m/%d
section &amp;#34;Phase 1 : Planification et Rédaction&amp;#34;
&amp;#34;Analyse des mots-clés et des tendances de recherche&amp;#34; :a1, 2026-09-01, 3d
&amp;#34;Brouillon et validation du code&amp;#34; :a2, after a1, 5d
&amp;#34;Relecture et correction&amp;#34; :a3, after a2, 2d
section &amp;#34;Phase 2 : Publication et Promotion&amp;#34;
&amp;#34;Déploiement via pipeline CI/CD&amp;#34; :p1, 2026-09-11, 1d
&amp;#34;Distribution automatique sur réseaux sociaux (X, LinkedIn, RSS)&amp;#34; :p2, 2026-09-11, 1d
&amp;#34;Propagation vers des services comme Hatena Bookmark&amp;#34; :p3, after p2, 3d
section &amp;#34;Phase 3 : Observation et Analyse&amp;#34;
&amp;#34;Période d&amp;#39;accumulation de données GSC&amp;#34; :m1, 2026-09-14, 28d
&amp;#34;Évaluation des performances via API Python&amp;#34; :m2, after m1, 2d
section &amp;#34;Phase 4 : Amélioration (Réécriture)&amp;#34;
&amp;#34;Correction des titres des articles à faible CTR&amp;#34; :r1, after m2, 3d
&amp;#34;Mise à jour du code vers la dernière version&amp;#34; :r2, after r1, 4d
&lt;/pre>
&lt;p>Ainsi, traiter la création d&amp;rsquo;articles comme un projet de développement logiciel à part entière, et intégrer la phase d&amp;rsquo;exploitation et de maintenance (réécriture) post-publication dans votre planification est le secret pour maintenir et augmenter le trafic.&lt;/p>
&lt;h3 id="42-modèle-mathématique-du-roi-retour-sur-investissement-de-la-création-de-contenu">4.2 Modèle mathématique du ROI (retour sur investissement) de la création de contenu
&lt;/h3>&lt;p>Puisque les ingénieurs consacrent un temps précieux à rédiger des articles, ils doivent être conscients du retour sur investissement (ROI).
Le ROI d&amp;rsquo;un blog peut être formulé de la manière suivante :&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$ : Durée de vie utile de l&amp;rsquo;article (période avant qu&amp;rsquo;il ne devienne obsolète)&lt;/li>
&lt;li>$Rev_{ad}(t)$ : Revenus directs issus de la publicité, de l&amp;rsquo;affiliation ou du sponsoring&lt;/li>
&lt;li>$Val_{brand}(t)$ : Valeur monétaire équivalente de l&amp;rsquo;impact positif sur la carrière en mettant en avant vos compétences techniques (augmentation des offres salariales lors d&amp;rsquo;un changement d&amp;rsquo;emploi, demandes d&amp;rsquo;intervention, etc.)&lt;/li>
&lt;li>$Val_{skill}(t)$ : Valeur de l&amp;rsquo;amélioration de vos propres compétences grâce à l&amp;rsquo;apprentissage et à la recherche effectués pour rédiger l&amp;rsquo;article&lt;/li>
&lt;li>$Cost_{time}$ : Temps consacré à la rédaction de l&amp;rsquo;article, à la création des schémas et à la validation du code (converti à votre taux horaire)&lt;/li>
&lt;/ul>
&lt;p>Le point fort d&amp;rsquo;un blog technique est que même si $Rev_{ad}$ est faible, $Val_{brand}$ et $Val_{skill}$ ont tendance à être extrêmement élevés. En particulier, une explication technique de haute qualité devient directement un portfolio, ce qui s&amp;rsquo;avère redoutablement efficace lors de la recherche d&amp;rsquo;emploi ou de l&amp;rsquo;acquisition de missions en freelance.&lt;/p>
&lt;hr>
&lt;h2 id="5-distribution-via-github-actions-et-lintégration-doutils-dautomatisation-externes">5. Distribution via GitHub Actions et l&amp;rsquo;intégration d&amp;rsquo;outils d&amp;rsquo;automatisation externes
&lt;/h2>&lt;p>Après avoir créé du contenu, le défi est de savoir comment le diffuser efficacement à votre public cible (distribution). Publier manuellement des liens sur chaque réseau social à chaque fois est inefficace et indigne d&amp;rsquo;un ingénieur.&lt;/p>
&lt;h3 id="51-architecture-dautomatisation-du-partage-sur-les-réseaux-sociaux">5.1 Architecture d&amp;rsquo;automatisation du partage sur les réseaux sociaux
&lt;/h3>&lt;p>Nous allons mettre en place une architecture qui automatise l&amp;rsquo;intégralité du processus, de la compilation au déploiement, en passant par la notification sur de multiples plateformes, dès l&amp;rsquo;instant où un fichier Markdown est fusionné dans la branche principale (main) du dépôt GitHub.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Développeur (Git Push)&amp;#34;] --&amp;gt; B[&amp;#34;Dépôt GitHub&amp;#34;]
B --&amp;gt;|Webhook| C[&amp;#34;GitHub Actions (CI/CD)&amp;#34;]
C --&amp;gt;|Build| D[&amp;#34;Générateur de site statique (Hugo/Gatsby)&amp;#34;]
D --&amp;gt;|Déployer| E[&amp;#34;Hébergement (Vercel / Cloudflare Pages)&amp;#34;]
D --&amp;gt;|Générer| F[&amp;#34;Flux RSS (index.xml)&amp;#34;]
F --&amp;gt;|Interrogé par| G[&amp;#34;Zapier / IFTTT / Make&amp;#34;]
G --&amp;gt;|Appel API| H[&amp;#34;Publication auto sur X (Twitter)&amp;#34;]
G --&amp;gt;|Appel API| I[&amp;#34;Publication d&amp;#39;article LinkedIn&amp;#34;]
G --&amp;gt;|Appel API| J[&amp;#34;Webhook de communauté Discord / Slack&amp;#34;]
C --&amp;gt;|Script Actions| K[&amp;#34;API de publication croisée Qiita / Zenn&amp;#34;]
&lt;/pre>
&lt;h3 id="52-points-clés-pour-la-mise-en-place-dun-pipeline-automatisé">5.2 Points clés pour la mise en place d&amp;rsquo;un pipeline automatisé
&lt;/h3>&lt;ol>
&lt;li>
&lt;p>&lt;strong>Compilation et déploiement via GitHub Actions&lt;/strong>
Si vous utilisez un générateur de site statique, automatisez la génération HTML et le déploiement vers votre hébergeur (Vercel, Netlify, Cloudflare Pages, etc.) à l&amp;rsquo;aide de GitHub Actions. À cette occasion, pour répondre aux exigences des Signaux Web Essentiels mentionnées précédemment, il est également efficace d&amp;rsquo;intégrer un processus d&amp;rsquo;optimisation des images (comme la conversion automatique en WebP) dans le pipeline de compilation.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Intégration des réseaux sociaux déclenchée par RSS via Zapier/IFTTT&lt;/strong>
Le générateur de site produit un flux RSS (XML) à jour lors de la compilation. En important cela dans une iPaaS telle que Zapier ou Make (anciennement Integromat), vous pouvez construire un workflow tel que : « Dès qu&amp;rsquo;un nouvel élément est ajouté au RSS, publier le titre et l&amp;rsquo;URL sur X (Twitter) et LinkedIn ». Cela permet de notifier automatiquement vos abonnés à l&amp;rsquo;instant même où l&amp;rsquo;article est publié.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Publication croisée sur Qiita/Zenn (Utilisation de balises canoniques)&lt;/strong>
Tant que l&amp;rsquo;autorité de domaine de votre blog personnel ou d&amp;rsquo;entreprise est faible, il peut être judicieux de tirer parti de la force d&amp;rsquo;attraction de plateformes techniques comme Qiita ou Zenn. Cependant, un simple copier-coller présente le risque de subir des pénalités SEO pour contenu dupliqué.
Ce problème peut être résolu en définissant la &lt;strong>balise Canonical&lt;/strong> dans les métadonnées des articles sur Qiita ou Zenn, en pointant vers l&amp;rsquo;URL de l&amp;rsquo;article original sur votre propre blog. En appelant les API des différentes plateformes depuis GitHub Actions et en écrivant un script pour générer automatiquement l&amp;rsquo;article à partir de votre fichier Markdown, vous pouvez automatiser entièrement la diffusion multicanale.&lt;/p>
&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="conclusion--faire-tourner-le-cycle-de-lamélioration-continue">Conclusion : Faire tourner le cycle de l&amp;rsquo;amélioration continue
&lt;/h2>&lt;p>Pour augmenter drastiquement le trafic mensuel d&amp;rsquo;un blog technique, au-delà de l&amp;rsquo;acte d&amp;rsquo;« écrire », les approches d&amp;rsquo;ingénierie telles que celles présentées ici sont indispensables.&lt;/p>
&lt;ol>
&lt;li>Construction d&amp;rsquo;une architecture de site et d&amp;rsquo;un HTML robustes axés sur le SEO&lt;/li>
&lt;li>Conception d&amp;rsquo;articles prenant en compte l&amp;rsquo;intention de recherche de l&amp;rsquo;utilisateur (résolution d&amp;rsquo;erreur vs apprentissage systématique)&lt;/li>
&lt;li>Analyse de données à l&amp;rsquo;aide de l&amp;rsquo;API Google Search Console et de Python&lt;/li>
&lt;li>Gestion du cycle de vie du contenu et réécriture en tenant compte du ROI&lt;/li>
&lt;li>Automatisation complète de la distribution via le CI/CD et l&amp;rsquo;intégration de Zapier&lt;/li>
&lt;/ol>
&lt;p>Si vous parvenez à assembler ces éléments en un système, votre blog technique deviendra l&amp;rsquo;actif (asset) le plus puissant pour propulser votre propre carrière. Ingénieurs souffrant d&amp;rsquo;une stagnation de trafic, n&amp;rsquo;hésitez pas à commencer le « Growth Hacking de votre blog » dès aujourd&amp;rsquo;hui. Vos compétences en programmation et votre capacité de conception d&amp;rsquo;architecture, cultivées lors de vos activités de développement, seront assurément vos meilleures armes dans la gestion de votre blog.&lt;/p></description></item><item><title>Stratégie de réécriture d'articles techniques passés à l'aide de Google Search Console</title><link>http://kenji.blog/fr/p/google-search-console-rewrite-strategy/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/fr/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 Stratégie de réécriture d'articles techniques passés à l'aide de Google Search Console" />&lt;h2 id="1-introduction--limportance-de-la-réécriture-dans-les-blogs-techniques-et-lapproche-axée-sur-les-données">1. Introduction : L&amp;rsquo;importance de la réécriture dans les blogs techniques et l&amp;rsquo;approche axée sur les données
&lt;/h2>&lt;p>Lors de la gestion d&amp;rsquo;un blog technique ou d&amp;rsquo;un média propriétaire pour les développeurs, la réécriture d&amp;rsquo;articles passés est tout aussi importante, voire plus, que la rédaction continue de nouveaux articles. En particulier pour les sujets liés à l&amp;rsquo;informatique et à la technologie, l&amp;rsquo;information devient rapidement obsolète, et il n&amp;rsquo;est pas rare que des extraits de code ou des spécifications d&amp;rsquo;API écrits il y a quelques années soient désormais obsolètes (Deprecated). Cependant, le simple fait de mettre à jour aveuglément les articles passés ne permet pas de maximiser le trafic (afflux) en provenance des moteurs de recherche.&lt;/p>
&lt;p>Dans cet article, nous utiliserons les données de &lt;strong>Google Search Console (GSC)&lt;/strong> et &lt;strong>Google Analytics 4 (GA4)&lt;/strong>, et emploierons une approche basée sur les données et mathématique pour identifier les articles techniques qui doivent être réécrits. Nous expliquerons une stratégie avancée pour améliorer considérablement le classement de recherche et le taux de clics (CTR).&lt;/p>
&lt;p>Plus précisément, de l&amp;rsquo;intégration des données de GSC et GA4 à l&amp;rsquo;aide de Python et BigQuery pour découvrir des « articles d&amp;rsquo;opportunité perdue » avec un CTR faible par rapport aux impressions (nombre d&amp;rsquo;affichages), jusqu&amp;rsquo;à l&amp;rsquo;utilisation de l&amp;rsquo;analyse TF-IDF de la NLP (traitement du langage naturel) pour identifier les mots-clés manquants dans les titres H2 ou H3, nous couvrirons de manière exhaustive les méthodes pour combler efficacement les lacunes de contenu.&lt;/p>
&lt;hr>
&lt;h2 id="2-analyse-de-lécart-entre-le-ctr-attendu-et-le-ctr-réel-introduction-de-modèles-mathématiques">2. Analyse de l&amp;rsquo;écart entre le CTR attendu et le CTR réel (Introduction de modèles mathématiques)
&lt;/h2>&lt;p>L&amp;rsquo;un des indicateurs les plus fondamentaux du SEO est le « taux de clics par rapport au classement de recherche (CTR) ». En général, la nature est que le CTR est d&amp;rsquo;environ 25 à 30 % pour un classement de recherche de 1ère place, d&amp;rsquo;environ 15 % pour la 2ème place, et diminue fortement par la suite. Cette relation entre le classement et le CTR peut être modélisée comme une distribution obéissant à une loi de puissance (Power Law).&lt;/p>
&lt;p>On sait que le taux de clics attendu $CTR(r)$ pour le classement $r$ est approximé par la formule suivante :&lt;/p>
$$
CTR(r) = a \cdot r^{-b}
$$&lt;p>Ici, $a$ représente le CTR attendu à la 1ère place (par exemple : $0.30$ pour 30 %), et $b$ représente le paramètre d&amp;rsquo;atténuation (généralement entre $1.0$ et $1.5$).&lt;/p>
&lt;p>L&amp;rsquo;approche la plus efficace lors de la sélection des articles cibles pour la réécriture est de &lt;strong>trouver les articles (mots-clés) dont le « CTR réel » est nettement inférieur à ce « CTR attendu »&lt;/strong>. Par exemple, si le classement de recherche est 3ème (CTR attendu d&amp;rsquo;environ 10 %) mais que le CTR réel n&amp;rsquo;est que de 2 %, il est fort probable qu&amp;rsquo;il y ait un décalage entre l&amp;rsquo;intention de recherche et le titre/la description, ou que les clics soient volés par des facteurs concurrentiels tels que les extraits enrichis (rich snippets).&lt;/p>
&lt;p>Le graphique ci-dessous est une image montrant l&amp;rsquo;écart entre le CTR attendu et le CTR réel dans un certain blog technique.&lt;/p>
&lt;pre class="mermaid">
xychart-beta
title CTR attendu vs CTR réel par position
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>(※ Le graphique linéaire indique le CTR attendu et le graphique à barres indique le CTR réel. On peut constater qu&amp;rsquo;il est nettement inférieur aux 4ème et 8ème places.)&lt;/p>
&lt;hr>
&lt;h2 id="3-extraction-automatique-des-données-de-performances-de-recherche-à-laide-de-lapi-gsc-python">3. Extraction automatique des données de performances de recherche à l&amp;rsquo;aide de l&amp;rsquo;API GSC (Python)
&lt;/h2>&lt;p>Bien qu&amp;rsquo;il soit possible de télécharger des fichiers CSV à partir de l&amp;rsquo;interface Web de GSC pour les analyser, pour les blogs à grande échelle ou les analyses continues, il est préférable de créer un système pour extraire automatiquement les données avec Python à l&amp;rsquo;aide de l&amp;rsquo;API GSC.&lt;/p>
&lt;p>Vous trouverez ci-dessous un extrait Python utilisant &lt;code>google-api-python-client&lt;/code> pour obtenir les données de performances (clics, impressions, CTR, position moyenne) par page et par requête pour une période donnée.&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"># Chargement des informations d&amp;#39;identification et construction du client 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"># Configuration de la charge utile de la requête API (spécification de la page et de la requête comme dimensions)&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"># Exécution de l&amp;#39;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"># Extraction des données à partir de la réponse et conversion en 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"># Exemple d&amp;#39;exécution&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>Avec ce script, vous pouvez obtenir des données détaillées liées aux URL de page et aux requêtes de recherche sous forme de DataFrame. Cela permet de comprendre de manière exhaustive avec quels mots-clés un article spécifique est affiché.&lt;/p>
&lt;hr>
&lt;h2 id="4-filtrage-des-mots-clés-techniques-à-laide-dexpressions-régulières-regex">4. Filtrage des mots-clés techniques à l&amp;rsquo;aide d&amp;rsquo;expressions régulières (Regex)
&lt;/h2>&lt;p>Une fonctionnalité très puissante dans l&amp;rsquo;analyse de blogs techniques est le &lt;strong>filtre d&amp;rsquo;expression régulière (Regex)&lt;/strong> de GSC.
Par exemple, si vous écrivez des articles sur un large éventail de sujets, du front-end au back-end en passant par l&amp;rsquo;infrastructure, vous voudrez peut-être extraire uniquement les « articles sur les erreurs ou tutoriels concernant Python ou Pandas » pour déterminer la priorité de réécriture.&lt;/p>
&lt;p>À l&amp;rsquo;aide des filtres d&amp;rsquo;expressions régulières personnalisés de GSC, vous pouvez affiner les requêtes avec des conditions complexes.&lt;/p>
&lt;p>&lt;strong>Exemples réels de filtrage de mots-clés techniques :&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Enquête sur les erreurs liées à Python : &lt;code>^(python|pandas|numpy|matplotlib).* (error|exception|bug|erreur|panne)&lt;/code>&lt;/li>
&lt;li>Construction d&amp;rsquo;infrastructure liée à AWS : &lt;code>(aws|amazon web services|ec2|s3|lambda).* (construction|configuration|tutoriel|tutorial|how to)&lt;/code>&lt;/li>
&lt;li>Mise à jour de version d&amp;rsquo;une bibliothèque spécifique : &lt;code>(react|vue|angular) (v17|v18|v3) (migration|mise à niveau|transition)&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Lors de l&amp;rsquo;intégration de cela dans une requête API GSC, utilisez &lt;code>dimensionFilterGroups&lt;/code> pour appliquer des conditions d&amp;rsquo;expression régulière. En utilisant pleinement ce filtrage, vous pouvez extraire précisément des mots-clés de type résolution de problèmes de grande valeur pour lesquels les développeurs « cherchent des solutions parce qu&amp;rsquo;ils sont bloqués en ce moment ».&lt;/p>
&lt;hr>
&lt;h2 id="5-intégration-des-données-ga4-et-gsc-avec-bigquerypandas">5. Intégration des données GA4 et GSC avec BigQuery/Pandas
&lt;/h2>&lt;p>Les données GSC seules ne fournissent que le « classement de recherche et le taux de clics ». Pour savoir « combien de temps les utilisateurs qui sont arrivés sur cet article y sont restés et s&amp;rsquo;ils ont converti (par exemple, passage à un dépôt GitHub, abonnement à une newsletter, etc.) », vous devez les intégrer (JOIN) avec les données de &lt;strong>Google Analytics 4 (GA4)&lt;/strong>.&lt;/p>
&lt;p>Si vous stockez les données d&amp;rsquo;exportation de GA4 et les données d&amp;rsquo;exportation en masse de GSC dans BigQuery, vous pouvez utiliser une requête SQL comme la suivante pour combiner les deux et extraire les articles avec « beaucoup d&amp;rsquo;impressions et un classement de recherche décent, mais avec un taux de rebond élevé ou un temps d&amp;rsquo;engagement court ».&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>En utilisant ce résultat, nous classerons les cibles de réécriture avec la matrice suivante.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>High Impression, Low CTR, High Engagement&lt;/strong> :
Tant qu&amp;rsquo;il est cliqué dans les résultats de recherche, les lecteurs sont satisfaits de l&amp;rsquo;article. La priorité absolue doit être donnée à la &lt;strong>correction du titre et de la méta description&lt;/strong> uniquement.&lt;/li>
&lt;li>&lt;strong>High CTR, Low Engagement&lt;/strong> :
Il reçoit des clics, mais le contenu déçoit et les utilisateurs quittent la page. Une réécriture majeure du corps de l&amp;rsquo;article est nécessaire, comme &lt;strong>l&amp;rsquo;amélioration de l&amp;rsquo;introduction, la mise à jour avec le code le plus récent et l&amp;rsquo;amélioration de l&amp;rsquo;exhaustivité des informations (ajout de H2/H3)&lt;/strong>.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="6-analyse-des-lacunes-de-contenu-avec-la-nlp-et-le-tf-idf">6. Analyse des lacunes de contenu avec la NLP et le TF-IDF
&lt;/h2>&lt;p>Une fois les articles à réécrire identifiés, la prochaine étape est d&amp;rsquo;analyser « quels titres (H2/H3) et mots-clés spécifiques devraient être ajoutés ». Ici aussi, au lieu de nous fier à l&amp;rsquo;intuition, nous utiliserons le &lt;strong>TF-IDF (Term Frequency-Inverse Document Frequency) en traitement du langage naturel (NLP)&lt;/strong>.&lt;/p>
&lt;p>Le TF-IDF est une statistique permettant d&amp;rsquo;évaluer l&amp;rsquo;importance d&amp;rsquo;un mot au sein d&amp;rsquo;un document.&lt;/p>
$$
TF\text{-}IDF(t, d) = tf(t, d) \times \log\left(\frac{N}{df(t)}\right)
$$&lt;p>Où,&lt;/p>
&lt;ul>
&lt;li>$tf(t, d)$ est la fréquence d&amp;rsquo;apparition du mot $t$ dans le document $d$&lt;/li>
&lt;li>$N$ est le nombre total de documents&lt;/li>
&lt;li>$df(t)$ est le nombre de documents dans lesquels le mot $t$ apparaît&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Approche :&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Obtenez les données textuelles des 10 meilleurs articles (sites concurrents) pour le mot-clé cible, via le web scraping par exemple.&lt;/li>
&lt;li>Préparez les données textuelles de l&amp;rsquo;article cible de votre propre site.&lt;/li>
&lt;li>À l&amp;rsquo;aide du &lt;code>TfidfVectorizer&lt;/code> de &lt;code>scikit-learn&lt;/code> en Python, extrayez les mots-clés (mots caractéristiques) qui apparaissent avec un score élevé en commun parmi les meilleurs articles concurrents, mais qui n&amp;rsquo;existent pas dans l&amp;rsquo;article de votre site, ou qui ont un score significativement plus bas.&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 = [Texte de votre propre site, Texte de l&amp;#39;article concurrent 1, Texte de l&amp;#39;article concurrent 2, ...]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ici, nous supposons une liste de textes qui ont déjà été tokenisés pour l&amp;#39;analyse morphologique (MeCab, etc.)&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"># Calculer le score TF-IDF moyen des articles concurrents (index 1 et suivants)&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"># Obtenir le score TF-IDF de l&amp;#39;article de votre propre site (index 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"># Calculer l&amp;#39;écart des mots qui sont importants pour les concurrents, mais absents (ou rares) sur votre site&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"># Extraire les meilleurs mots avec un écart important&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"># Exemple : 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>Grâce à cette analyse, vous pouvez découvrir quantitativement &lt;strong>des omissions de sujets (lacunes de contenu)&lt;/strong>, comme « En fait, les meilleurs articles mentionnent également &amp;lsquo;comment déployer sur des conteneurs Docker&amp;rsquo; et &amp;rsquo;la construction de pipelines CI/CD&amp;rsquo;, mais mon article ne l&amp;rsquo;aborde pas ».&lt;/p>
&lt;p>Au lieu de simplement disperser les mots-clés importants découverts dans le texte, l&amp;rsquo;ajout de sections significatives en tant que &lt;strong>titres H2 ou H3 (balises de titre)&lt;/strong> et la rédaction d&amp;rsquo;explications techniques détaillées et d&amp;rsquo;extraits de code pour ces titres peuvent améliorer considérablement l&amp;rsquo;évaluation de Google.&lt;/p>
&lt;hr>
&lt;h2 id="7-pipeline-de-données-et-cycle-damélioration-continue">7. Pipeline de données et cycle d&amp;rsquo;amélioration continue
&lt;/h2>&lt;p>Les processus expliqués jusqu&amp;rsquo;à présent ne sont pas quelque chose que vous faites une fois et que vous terminez. En faire un pipeline et l&amp;rsquo;exécuter en continu est la clé du succès SEO. L&amp;rsquo;architecture globale et le flux opérationnel sont présentés ci-dessous dans un organigramme Mermaid.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Données de l&amp;#39;API GSC (Impressions, Clics, Positions)&amp;#34;] --&amp;gt; C[&amp;#34;BigQuery / Entrepôt de données&amp;#34;]
B[&amp;#34;Données d&amp;#39;exportation GA4 (Pages vues, Temps d&amp;#39;engagement)&amp;#34;] --&amp;gt; C
C --&amp;gt; D[&amp;#34;Jointure et analyse de données avec Python / Pandas&amp;#34;]
D --&amp;gt; E[&amp;#34;Identifier les articles à fortes impressions / faible CTR&amp;#34;]
E --&amp;gt; F[&amp;#34;Scraping des concurrents NLP et extraction de mots-clés TF-IDF&amp;#34;]
F --&amp;gt; G[&amp;#34;Optimiser les balises H2/H3 et réécrire le contenu&amp;#34;]
G --&amp;gt; H[&amp;#34;Publier l&amp;#39;article mis à jour&amp;#34;]
H --&amp;gt; I[&amp;#34;Surveiller les changements de CTR (Attendu vs Réel)&amp;#34;]
I --&amp;gt; |&amp;#34;Boucle de rétroaction&amp;#34;| A
&lt;/pre>
&lt;p>En systématisant cette série d&amp;rsquo;étapes : de la collecte de données à partir de GSC et GA4, la sélection des cibles par l&amp;rsquo;analyse, l&amp;rsquo;optimisation du contenu par la NLP, jusqu&amp;rsquo;au suivi des résultats, votre média de blog deviendra un atout qui continuera à se développer automatiquement.&lt;/p>
&lt;hr>
&lt;h2 id="8-conclusion-et-perspectives-futures">8. Conclusion et perspectives futures
&lt;/h2>&lt;p>La réécriture d&amp;rsquo;articles techniques à l&amp;rsquo;aide de Google Search Console n&amp;rsquo;est pas une simple correction de texte. C&amp;rsquo;est une ingénierie avancée qui utilise des données et des modèles mathématiques pour présenter des solutions optimales face à la boîte noire qu&amp;rsquo;est l&amp;rsquo;algorithme du moteur de recherche.&lt;/p>
&lt;p>Pour résumer les méthodes expliquées dans cet article :&lt;/p>
&lt;ol>
&lt;li>Calculer &lt;strong>l&amp;rsquo;écart entre le CTR attendu et le CTR réel&lt;/strong> pour identifier les articles dont la modification aura un impact important.&lt;/li>
&lt;li>Extraire automatiquement les données de performances en utilisant &lt;strong>l&amp;rsquo;API GSC et Python&lt;/strong>.&lt;/li>
&lt;li>Combiner cela avec les données d&amp;rsquo;engagement de GA4 sur &lt;strong>BigQuery&lt;/strong> et corriger le corps des articles ayant un taux de rebond élevé.&lt;/li>
&lt;li>Découvrir les lacunes de contenu avec les concurrents par &lt;strong>l&amp;rsquo;analyse NLP utilisant le TF-IDF&lt;/strong>, et optimiser les titres (H2/H3).&lt;/li>
&lt;/ol>
&lt;p>Les tendances technologiques changent constamment. Afin de répondre avec précision aux erreurs et aux défis auxquels vos lecteurs sont actuellement confrontés, nous vous encourageons à intégrer une réécriture stratégique, avec les données de votre côté, dans vos opérations quotidiennes.&lt;/p></description></item></channel></rss>