[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$ft7kaQhbiWzsZj-kovleFCno96pzau2jccPFhrv1LtRE":3,"$fP12DX0ZpJUpo9ynxF4f2n9WmH-daIMSbx30fQQ2W4KU":25},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":23,"updatedAt":24},"69f8368aaa6b273b0c768e16","google-s-march-core-update-shifted-visibility-away-from-aggregators-via-sejournal-mattgsouthern",0,"Equipe Seogard","Le March 2025 Core Update de Google a produit un signal clair : les agrégateurs de contenu — Reddit, YouTube, Quora, et les comparateurs — perdent de la visibilité US au profit des sites de marque et des sites gouvernementaux. Ce n'est pas un ajustement cosmétique. C'est un changement structurel dans la façon dont Google évalue l'autorité topique et la provenance du contenu.\n\nCet article ne résume pas l'actualité. Il déconstruit les mécanismes techniques probables, mesure l'impact sur différentes typologies de sites, et fournit un plan d'action concret pour les équipes SEO qui gèrent des sites de 500 à 50 000 pages.\n\n## Ce que les données montrent réellement\n\nLes analyses de visibilité post-update publiées par Search Engine Journal, Sistrix et d'autres fournisseurs de données convergent sur plusieurs points :\n\n- **Reddit** a perdu entre 15 et 25 % de sa visibilité organique US sur les requêtes informationnelles entre mars et avril 2025.\n- **YouTube** a reculé sur les requêtes où il occupait des positions organiques classiques (pas les carrousels vidéo, qui relèvent d'un système distinct).\n- **Les comparateurs et agrégateurs** (type Yelp, TripAdvisor, G2) ont vu leurs positions se dégrader sur des requêtes transactionnelles et commerciales.\n- **Les sites de marque** (e-commerce propriétaires, éditeurs avec du contenu first-party, sites institutionnels) ont gagné des positions.\n- **Les sites gouvernementaux** (.gov) ont progressé sur les requêtes liées à la santé, la finance et le droit.\n\n### Pourquoi c'est un signal structurel et non un bruit\n\nGoogle déploie des core updates plusieurs fois par an. La plupart redistribuent la visibilité de façon granulaire, page par page. Celui-ci est différent parce qu'il affecte des **catégories entières de sites** de façon cohérente. Quand Reddit, Quora et YouTube reculent simultanément sur des verticales différentes, ce n'est pas un problème de qualité page-level — c'est un recalibrage du poids accordé au type de source.\n\nL'hypothèse la plus solide : Google a renforcé un signal qui pénalise le contenu **dérivé** (agrégé, compilé, user-generated non modéré) par rapport au contenu **first-party** (produit par l'entité qui a l'expertise directe sur le sujet).\n\nCe n'est pas un concept nouveau. La [documentation officielle de Google sur l'E-E-A-T](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) insiste depuis 2022 sur l'importance de l'expérience de première main. Le March 2025 Core Update semble avoir mécaniquement augmenté le coefficient de ce signal.\n\n## Anatomie technique : comment Google distingue first-party et agrégateur\n\nLa distinction entre contenu first-party et contenu agrégé ne repose pas sur un seul signal. Plusieurs mécanismes techniques sont en jeu, et les comprendre permet d'anticiper les prochains mouvements.\n\n### Le graph d'entités et la cohérence topique\n\nGoogle Knowledge Graph associe chaque domaine à un ensemble d'entités et de topics. Un site comme `decathlon.fr` est fortement associé aux entités \"sport\", \"équipement sportif\", \"running\", etc. Quand Decathlon publie un guide sur le choix de chaussures de trail, la **cohérence entre l'entité du domaine et le topic de la page** est maximale.\n\nReddit, en revanche, couvre tous les sujets. Un thread r/trailrunning sur les chaussures de trail a une cohérence topique faible au niveau du domaine, même si le contenu du thread est pertinent. Le core update semble avoir augmenté le poids de cette cohérence domain-level.\n\nVous pouvez auditer cette cohérence pour votre propre site en utilisant l'API Natural Language de Google :\n\n```python\nfrom google.cloud import language_v1\n\ndef analyze_entity_coherence(urls: list[str]) -> dict:\n    \"\"\"Analyse la cohérence topique d'un ensemble d'URLs.\n    Compare les entités extraites page par page au profil global du domaine.\"\"\"\n    client = language_v1.LanguageServiceClient()\n    domain_entities = {}\n    \n    for url in urls:\n        # Récupérer le contenu HTML rendu (post-JS)\n        html_content = fetch_rendered_html(url)  # votre fonction de rendering\n        text_content = extract_main_content(html_content)  # strip nav, footer, etc.\n        \n        document = language_v1.Document(\n            content=text_content,\n            type_=language_v1.Document.Type.PLAIN_TEXT,\n        )\n        response = client.analyze_entities(\n            request={\"document\": document, \"encoding_type\": language_v1.EncodingType.UTF8}\n        )\n        \n        for entity in response.entities:\n            if entity.salience > 0.01:  # filtrer le bruit\n                key = f\"{entity.name}|{entity.type_.name}\"\n                if key not in domain_entities:\n                    domain_entities[key] = {\"count\": 0, \"total_salience\": 0.0}\n                domain_entities[key][\"count\"] += 1\n                domain_entities[key][\"total_salience\"] += entity.salience\n    \n    # Score de cohérence = concentration des entités dominantes\n    sorted_entities = sorted(\n        domain_entities.items(), \n        key=lambda x: x[1][\"total_salience\"], \n        reverse=True\n    )\n    top_20_salience = sum(e[1][\"total_salience\"] for e in sorted_entities[:20])\n    total_salience = sum(e[1][\"total_salience\"] for e in sorted_entities)\n    \n    return {\n        \"coherence_score\": top_20_salience / total_salience if total_salience > 0 else 0,\n        \"top_entities\": sorted_entities[:20],\n        \"total_unique_entities\": len(domain_entities),\n    }\n```\n\nUn score de cohérence au-dessus de 0.6 indique un site fortement spécialisé. En dessous de 0.3, vous êtes dans la zone des agrégateurs — et potentiellement vulnérable au type de recalibrage qu'on observe en mars 2025.\n\n### Les signaux de provenance du contenu\n\nAu-delà de la cohérence topique, Google évalue si le contenu provient d'une source primaire. Plusieurs signaux techniques contribuent :\n\n**Structured data d'auteur et d'organisation.** Les sites qui implémentent correctement `author` avec un lien vers un profil vérifié et `publisher` avec un schema `Organization` cohérent sont mieux positionnés pour prouver la provenance first-party.\n\n```html\n\u003Cscript type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"Guide de choix : chaussures de trail 2025\",\n  \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Marie Dupont\",\n    \"url\": \"https://www.trailexpert.fr/equipe/marie-dupont\",\n    \"jobTitle\": \"Ingénieure produit — chaussures trail\",\n    \"worksFor\": {\n      \"@type\": \"Organization\",\n      \"name\": \"TrailExpert\",\n      \"url\": \"https://www.trailexpert.fr\"\n    },\n    \"sameAs\": [\n      \"https://www.linkedin.com/in/marie-dupont-trail/\"\n    ]\n  },\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"TrailExpert\",\n    \"url\": \"https://www.trailexpert.fr\",\n    \"logo\": {\n      \"@type\": \"ImageObject\",\n      \"url\": \"https://www.trailexpert.fr/logo.png\"\n    }\n  },\n  \"datePublished\": \"2025-03-15\",\n  \"dateModified\": \"2025-04-02\"\n}\n\u003C/script>\n```\n\nLe point critique ici : le `jobTitle` et le `worksFor` doivent être **cohérents avec le topic de l'article**. Un auteur dont le titre est \"Ingénieure produit — chaussures trail\" qui écrit sur les chaussures de trail envoie un signal de first-party expertise. Un auteur générique \"Rédacteur web\" n'envoie rien.\n\n**Les citations et backlinks entrants.** Quand d'autres sites citent votre contenu comme source primaire (pas comme agrégateur), Google le détecte. Le March Core Update semble avoir renforcé ce signal — ce qui est cohérent avec la [montée en puissance des citations dans la visibilité AI](/blog/500m-ai-searches-later-how-to-actually-improve-ai-search-visibility-citations-via-sejournal-hethr-campbell).\n\n## Scénario concret : un e-commerce de 12K pages face au core update\n\nPrenons un cas réaliste. **MaisonDeco.fr** (fictif, mais basé sur des patterns réels) est un e-commerce de décoration avec 12 000 pages : 8 000 fiches produits, 2 500 pages catégories, 1 200 articles de blog, 300 pages guide d'achat.\n\n### Situation pré-update\n\nAvant le March Core Update, MaisonDeco.fr perdait régulièrement des positions face à des agrégateurs comme Pinterest (résultats images), Houzz (UGC + fiches pro), et des comparateurs type LeLynx ou Idealo sur les requêtes commerciales.\n\nTrafic organique : ~180 000 sessions/mois. 35 % provient des pages catégories, 25 % des articles de blog, 40 % des fiches produits.\n\n### Impact post-update\n\nAprès le rollout complet (4 semaines), MaisonDeco.fr observe dans Search Console :\n\n- **+22 % d'impressions** sur les requêtes commerciales (type \"canapé scandinave 3 places\")\n- **+15 % de clics** sur les pages catégories\n- **-8 % de clics** sur les articles de blog de type \"top 10\" et \"comparatifs\"\n\nLe pattern est limpide. Les pages catégories (contenu first-party : descriptions produit originales, filtres, avis clients propriétaires) gagnent. Les articles de blog qui avaient un format agrégateur (compilations, \"meilleurs X de 2025\" basés sur des données tierces) reculent.\n\n### Plan d'action technique\n\nL'équipe SEO de MaisonDeco.fr met en place trois chantiers :\n\n**Chantier 1 : Renforcer les signaux first-party sur les pages catégories.**\n\nAjout de blocs éditoriaux écrits par les acheteurs internes, avec structured data `author` liée au profil LinkedIn de l'acheteur. Ajout de données propriétaires : \"Basé sur 3 400 commandes en 2024, les canapés 3 places les plus retournés sont...\"\n\n**Chantier 2 : Transformer les articles \"top 10\" en guides d'expertise.**\n\nPlutôt qu'un comparatif qui agrège des informations disponibles partout, chaque guide intègre des données exclusives (tests internes, photos des locaux de test, métriques de durabilité mesurées en interne). Le format passe de \"Top 10 des meilleurs canapés\" à \"Comment nous testons les canapés : 6 critères et 200 heures de tests\".\n\n**Chantier 3 : Monitoring continu des positions par type de page.**\n\nConfiguration d'un suivi segmenté dans Search Console avec un export automatisé :\n\n```bash\n#!/bin/bash\n# Export Search Console segmenté par type de page via l'API\n# Nécessite google-auth et gsc-api-cli (pip install searchconsole)\n\nSITE=\"https://www.maisondeco.fr\"\nSTART_DATE=\"2025-03-01\"\nEND_DATE=\"2025-04-30\"\n\n# Segment catégories\npython3 -c \"\nimport searchconsole\naccount = searchconsole.authenticate(client_config='credentials.json')\nwebproperty = account['$SITE']\nreport = webproperty.query.range('$START_DATE', '$END_DATE') \\\n    .dimension('page', 'query') \\\n    .filter('page', '/categorie/', 'contains') \\\n    .get()\nreport.to_dataframe().to_csv('gsc_categories_post_update.csv', index=False)\nprint(f'Exported {len(report.rows)} rows for category pages')\n\"\n\n# Segment blog\npython3 -c \"\nimport searchconsole\naccount = searchconsole.authenticate(client_config='credentials.json')\nwebproperty = account['$SITE']\nreport = webproperty.query.range('$START_DATE', '$END_DATE') \\\n    .dimension('page', 'query') \\\n    .filter('page', '/blog/', 'contains') \\\n    .get()\nreport.to_dataframe().to_csv('gsc_blog_post_update.csv', index=False)\nprint(f'Exported {len(report.rows)} rows for blog pages')\n\"\n\necho \"Comparez ces exports avec les données pré-update pour isoler l'impact du core update par segment.\"\n```\n\nUn outil de monitoring comme Seogard permet de détecter automatiquement ces variations de visibilité par segment sans attendre un export manuel — particulièrement utile quand le rollout d'un core update s'étale sur plusieurs semaines et que les fluctuations quotidiennes rendent l'analyse manuelle peu fiable.\n\n## Pourquoi Reddit et YouTube reculent : l'hypothèse du \"contenu sans engagement propriétaire\"\n\nIl serait simpliste de dire que Reddit recule parce que c'est de l'UGC. Wikipedia est de l'UGC et ne recule pas. La nuance est ailleurs.\n\n### Le problème de la dilution d'expertise\n\nReddit héberge des millions de threads sur des milliers de sujets. La qualité est extrêmement variable — un thread r/financialplanning peut contenir un conseil d'expert ou une ânerie dangereuse, et Google n'a pas de signal fiable pour distinguer les deux à l'échelle.\n\nJusqu'ici, Google résolvait ce problème en s'appuyant sur les signaux d'engagement (upvotes, commentaires) comme proxy de qualité. Le March Core Update semble avoir réduit le poids de ce proxy en faveur de signaux plus structurels.\n\nYouTube présente le même problème à une échelle différente. Une vidéo YouTube sur la réparation d'un lave-vaisselle Bosch peut être excellente ou catastrophique. Le site officiel Bosch, avec ses fiches de dépannage, a un **engagement propriétaire** sur le sujet — c'est leur produit, leur documentation, leur responsabilité.\n\n### L'impact sur les sites qui dépendent du \"Reddit effect\"\n\nDe nombreux sites SEO ont construit leur stratégie de contenu en ciblant les requêtes où Reddit rankait bien, en produisant du contenu plus structuré sur les mêmes sujets. Si Reddit recule et que ces requêtes sont redistribuées vers des sites de marque, la stratégie de \"remplacement de Reddit\" ne fonctionne que si votre site **est** la marque de référence sur le sujet.\n\nC'est un point fondamental : le core update ne remplace pas les agrégateurs par n'importe quel contenu \"meilleur\". Il les remplace par des sources qui ont une **légitimité structurelle** sur le sujet. Cette logique rejoint directement les réflexions sur [la façon dont les modèles AI comprennent votre marque](/blog/how-ai-models-understand-your-brand) et sur [pourquoi un bon contenu ne suffit plus](/blog/why-great-content-is-no-longer-enough-what-beats-it-in-ai-search-via-sejournal-taylordanrw).\n\n## Implications pour les sites de marque : ne pas crier victoire trop vite\n\nLes sites de marque qui ont gagné des positions après le March Core Update ne doivent pas supposer que ces gains sont permanents. Plusieurs risques techniques subsistent.\n\n### Le piège du thin content sur les pages catégories\n\nBeaucoup d'e-commerces ont des pages catégories quasi vides : un titre, une liste de produits, zéro contenu éditorial. Ces pages ont pu gagner des positions par effet mécanique (les agrégateurs reculent, il faut bien que quelqu'un prenne leur place). Mais elles sont vulnérables au prochain core update si elles ne renforcent pas leurs signaux E-E-A-T.\n\nVérifiez le ratio texte/HTML de vos pages catégories avec Screaming Frog :\n\n1. Crawl complet du site\n2. Filtre sur les URLs `/categorie/` (ou votre pattern)\n3. Export des colonnes : URL, Word Count, Text Ratio, Status Code\n4. Identifiez les pages avec un Word Count \u003C 100 qui ont gagné des positions post-update\n\nCes pages sont en sursis. Priorisez l'ajout de contenu éditorial propriétaire sur les catégories à fort trafic.\n\n### La dérive vers le contenu agrégateur\n\nUn risque plus insidieux : les sites de marque qui, pour alimenter leur blog, produisent du contenu de type agrégateur. Les articles \"Top 10 des tendances déco 2025\" publiés par MaisonDeco.fr sont du contenu agrégateur — ils compilent des informations disponibles partout. Ce type de contenu est désormais pénalisé, même quand il est publié par une marque légitime.\n\nLe correctif technique est de s'assurer que chaque contenu de blog contient **au moins un élément de données ou d'expertise propriétaire** qui ne peut pas être trouvé ailleurs. Un test simple : supprimez mentalement votre marque du contenu. Si un concurrent pourrait publier exactement le même article mot pour mot, c'est du contenu agrégateur déguisé.\n\n## Comment monitorer l'impact d'un core update à l'échelle\n\nL'analyse d'un core update ne peut pas se faire page par page quand vous gérez des milliers d'URLs. Voici une approche systématique.\n\n### Segmentation par template\n\nChaque site a des templates distincts : fiche produit, catégorie, article, landing page, FAQ. L'impact d'un core update est presque toujours corrélé au template, pas à la page individuelle. Créez des segments dans Search Console (via l'API ou via les filtres Regex) pour isoler chaque template :\n\n```python\n# Analyse segmentée de l'impact core update par template\nimport pandas as pd\n\n# Charger les exports GSC pré et post update\npre = pd.read_csv(\"gsc_export_2025-02-01_2025-02-28.csv\")\npost = pd.read_csv(\"gsc_export_2025-04-01_2025-04-30.csv\")\n\n# Définir les segments par pattern d'URL\nSEGMENTS = {\n    \"product\": r\"/produit/\",\n    \"category\": r\"/categorie/\",\n    \"blog\": r\"/blog/\",\n    \"guide\": r\"/guide/\",\n    \"faq\": r\"/faq/\",\n}\n\ndef segment_analysis(df_pre: pd.DataFrame, df_post: pd.DataFrame, segments: dict):\n    results = []\n    for name, pattern in segments.items():\n        seg_pre = df_pre[df_pre[\"page\"].str.contains(pattern, regex=True)]\n        seg_post = df_post[df_post[\"page\"].str.contains(pattern, regex=True)]\n        \n        clicks_pre = seg_pre[\"clicks\"].sum()\n        clicks_post = seg_post[\"clicks\"].sum()\n        impressions_pre = seg_pre[\"impressions\"].sum()\n        impressions_post = seg_post[\"impressions\"].sum()\n        \n        # Position moyenne pondérée par impressions\n        avg_pos_pre = (seg_pre[\"position\"] * seg_pre[\"impressions\"]).sum() / impressions_pre if impressions_pre > 0 else 0\n        avg_pos_post = (seg_post[\"position\"] * seg_post[\"impressions\"]).sum() / impressions_post if impressions_post > 0 else 0\n        \n        results.append({\n            \"segment\": name,\n            \"clicks_delta_pct\": ((clicks_post - clicks_pre) / clicks_pre * 100) if clicks_pre > 0 else None,\n            \"impressions_delta_pct\": ((impressions_post - impressions_pre) / impressions_pre * 100) if impressions_pre > 0 else None,\n            \"avg_position_delta\": avg_pos_post - avg_pos_pre,\n            \"pages_pre\": seg_pre[\"page\"].nunique(),\n            \"pages_post\": seg_post[\"page\"].nunique(),\n        })\n    \n    return pd.DataFrame(results)\n\nimpact = segment_analysis(pre, post, SEGMENTS)\nprint(impact.to_string(index=False))\n```\n\nCe type d'analyse révèle immédiatement si le core update a touché un template spécifique. Si vos pages `/blog/` perdent 20 % de clics alors que vos pages `/produit/` gagnent 15 %, vous savez exactement où concentrer vos efforts.\n\n### Surveiller les requêtes volées aux agrégateurs\n\nAu-delà de vos propres données, identifiez les requêtes sur lesquelles vous étiez en compétition avec des agrégateurs et vérifiez si les positions ont bougé. Dans Search Console, filtrez les requêtes où votre position moyenne était entre 5 et 15 (zone de compétition). Comparez pré et post update. Si vous êtes passé de la position 8 à la position 4 sur des requêtes où Reddit ou un comparateur occupait les positions 3-5, c'est un gain direct du core update.\n\nCe suivi est critique mais fastidieux à faire manuellement sur un site de 10 000+ pages. C'est précisément le type de régression (ou de gain) qu'un outil de monitoring continu comme Seogard permet de détecter automatiquement, sans attendre qu'un analyste lance un export CSV.\n\n## Ce que ça signifie pour la stratégie SEO 2025-2026\n\nLe March 2025 Core Update s'inscrit dans une trajectoire visible depuis 2023 : Google réduit progressivement la visibilité des intermédiaires au profit des sources primaires. Cette tendance est parallèle à l'évolution des [AI Overviews et de leur impact sur les citations](/blog/ai-overview-ctr-fell-61-but-clicks-didn-t-collapse-via-sejournal-mattgsouthern).\n\n### Trois ajustements stratégiques non négociables\n\n**1. Auditez votre ratio contenu first-party / contenu agrégateur.** Si plus de 30 % de votre contenu de blog est du contenu compilé (listes, comparatifs basés sur des sources tierces, roundups), vous êtes exposé. Priorisez la transformation de ce contenu en contenu à valeur propriétaire.\n\n**2. Renforcez les signaux d'entité et d'auteur.** Le structured data n'est pas suffisant seul, mais c'est un prérequis. Assurez-vous que chaque page importante de votre site a un auteur identifiable, avec un profil vérifié et une expertise cohérente avec le sujet. Les [signaux qui définissent la visibilité dans la recherche AI](/blog/4-signals-that-now-define-visibility-in-ai-search) recoupent largement ceux que Google utilise dans les core updates classiques.\n\n**3. Construisez des assets de données propriétaires.** Les sites qui ont le plus gagné après ce core update sont ceux qui publient des données que personne d'autre ne possède : études internes, benchmarks issus de leur activité, retours d'expérience documentés. Un e-commerce qui publie ses données de retour produit a un avantage structurel qu'aucun agrégateur ne peut répliquer.\n\n### Le trade-off à accepter\n\nCe recalibrage a un coût. Les sites de marque qui produisaient du contenu \"volumique\" pour capter du trafic informationnel vont devoir réduire la cadence et augmenter la qualité unitaire. C'est un changement de modèle opérationnel, pas juste un ajustement éditorial. La logique de [produire plus de contenu pour croître en SEO](/blog/why-more-content-is-no-longer-a-reliable-way-to-grow-seo) est définitivement obsolète.\n\nLes équipes qui s'en sortent le mieux sont celles qui traitent leur site comme une [source d'information, pas comme un mégaphone](/blog/your-website-is-a-source-not-a-megaphone-via-sejournal-slobodanmanic) — et qui ont les outils de monitoring en place pour détecter les régressions avant que les dégâts soient visibles dans les dashboards mensuels.\n\nLe March 2025 Core Update n'est pas un événement isolé. C'est l'accélération d'une tendance de fond : Google (et les moteurs de recherche AI) valorisent de plus en plus la provenance vérifiable du contenu, au détriment de l'agrégation pure. Les sites qui investissent maintenant dans leurs signaux d'autorité propriétaire sont ceux qui résisteront aux prochains core updates — et aux prochains bouleversements liés à la recherche AI.","https://seogard.io/blog/google-s-march-core-update-shifted-visibility-away-from-aggregators-via-sejournal-mattgsouthern","Actualités SEO","2026-05-04T06:02:50.712Z","2026-05-04","Analyse technique du March Core Update 2025 : pourquoi YouTube, Reddit et les agrégateurs reculent, et comment adapter votre stack SEO.","\u003Cp>Le March 2025 Core Update de Google a produit un signal clair : les agrégateurs de contenu — Reddit, YouTube, Quora, et les comparateurs — perdent de la visibilité US au profit des sites de marque et des sites gouvernementaux. Ce n'est pas un ajustement cosmétique. C'est un changement structurel dans la façon dont Google évalue l'autorité topique et la provenance du contenu.\u003C/p>\n\u003Cp>Cet article ne résume pas l'actualité. Il déconstruit les mécanismes techniques probables, mesure l'impact sur différentes typologies de sites, et fournit un plan d'action concret pour les équipes SEO qui gèrent des sites de 500 à 50 000 pages.\u003C/p>\n\u003Ch2>Ce que les données montrent réellement\u003C/h2>\n\u003Cp>Les analyses de visibilité post-update publiées par Search Engine Journal, Sistrix et d'autres fournisseurs de données convergent sur plusieurs points :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Reddit\u003C/strong> a perdu entre 15 et 25 % de sa visibilité organique US sur les requêtes informationnelles entre mars et avril 2025.\u003C/li>\n\u003Cli>\u003Cstrong>YouTube\u003C/strong> a reculé sur les requêtes où il occupait des positions organiques classiques (pas les carrousels vidéo, qui relèvent d'un système distinct).\u003C/li>\n\u003Cli>\u003Cstrong>Les comparateurs et agrégateurs\u003C/strong> (type Yelp, TripAdvisor, G2) ont vu leurs positions se dégrader sur des requêtes transactionnelles et commerciales.\u003C/li>\n\u003Cli>\u003Cstrong>Les sites de marque\u003C/strong> (e-commerce propriétaires, éditeurs avec du contenu first-party, sites institutionnels) ont gagné des positions.\u003C/li>\n\u003Cli>\u003Cstrong>Les sites gouvernementaux\u003C/strong> (.gov) ont progressé sur les requêtes liées à la santé, la finance et le droit.\u003C/li>\n\u003C/ul>\n\u003Ch3>Pourquoi c'est un signal structurel et non un bruit\u003C/h3>\n\u003Cp>Google déploie des core updates plusieurs fois par an. La plupart redistribuent la visibilité de façon granulaire, page par page. Celui-ci est différent parce qu'il affecte des \u003Cstrong>catégories entières de sites\u003C/strong> de façon cohérente. Quand Reddit, Quora et YouTube reculent simultanément sur des verticales différentes, ce n'est pas un problème de qualité page-level — c'est un recalibrage du poids accordé au type de source.\u003C/p>\n\u003Cp>L'hypothèse la plus solide : Google a renforcé un signal qui pénalise le contenu \u003Cstrong>dérivé\u003C/strong> (agrégé, compilé, user-generated non modéré) par rapport au contenu \u003Cstrong>first-party\u003C/strong> (produit par l'entité qui a l'expertise directe sur le sujet).\u003C/p>\n\u003Cp>Ce n'est pas un concept nouveau. La \u003Ca href=\"https://developers.google.com/search/docs/fundamentals/creating-helpful-content\">documentation officielle de Google sur l'E-E-A-T\u003C/a> insiste depuis 2022 sur l'importance de l'expérience de première main. Le March 2025 Core Update semble avoir mécaniquement augmenté le coefficient de ce signal.\u003C/p>\n\u003Ch2>Anatomie technique : comment Google distingue first-party et agrégateur\u003C/h2>\n\u003Cp>La distinction entre contenu first-party et contenu agrégé ne repose pas sur un seul signal. Plusieurs mécanismes techniques sont en jeu, et les comprendre permet d'anticiper les prochains mouvements.\u003C/p>\n\u003Ch3>Le graph d'entités et la cohérence topique\u003C/h3>\n\u003Cp>Google Knowledge Graph associe chaque domaine à un ensemble d'entités et de topics. Un site comme \u003Ccode>decathlon.fr\u003C/code> est fortement associé aux entités \"sport\", \"équipement sportif\", \"running\", etc. Quand Decathlon publie un guide sur le choix de chaussures de trail, la \u003Cstrong>cohérence entre l'entité du domaine et le topic de la page\u003C/strong> est maximale.\u003C/p>\n\u003Cp>Reddit, en revanche, couvre tous les sujets. Un thread r/trailrunning sur les chaussures de trail a une cohérence topique faible au niveau du domaine, même si le contenu du thread est pertinent. Le core update semble avoir augmenté le poids de cette cohérence domain-level.\u003C/p>\n\u003Cp>Vous pouvez auditer cette cohérence pour votre propre site en utilisant l'API Natural Language de Google :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> google.cloud \u003C/span>\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> language_v1\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C/span>\u003Cspan style=\"color:#B392F0\"> analyze_entity_coherence\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(urls: list[\u003C/span>\u003Cspan style=\"color:#79B8FF\">str\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]) -> \u003C/span>\u003Cspan style=\"color:#79B8FF\">dict\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"\"\"Analyse la cohérence topique d'un ensemble d'URLs.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    Compare les entités extraites page par page au profil global du domaine.\"\"\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    client \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> language_v1.LanguageServiceClient()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    domain_entities \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> url \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> urls:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        # Récupérer le contenu HTML rendu (post-JS)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        html_content \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> fetch_rendered_html(url)  \u003C/span>\u003Cspan style=\"color:#6A737D\"># votre fonction de rendering\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        text_content \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> extract_main_content(html_content)  \u003C/span>\u003Cspan style=\"color:#6A737D\"># strip nav, footer, etc.\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        document \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> language_v1.Document(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">            content\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">text_content,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">            type_\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">language_v1.Document.Type.\u003C/span>\u003Cspan style=\"color:#79B8FF\">PLAIN_TEXT\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        )\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        response \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> client.analyze_entities(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">            request\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"document\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: document, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"encoding_type\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: language_v1.EncodingType.\u003C/span>\u003Cspan style=\"color:#79B8FF\">UTF8\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        )\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> entity \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> response.entities:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> entity.salience \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0.01\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:  \u003C/span>\u003Cspan style=\"color:#6A737D\"># filtrer le bruit\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                key \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#F97583\"> f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">entity.name\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">|\u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">entity.type_.name\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">                if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> key \u003C/span>\u003Cspan style=\"color:#F97583\">not\u003C/span>\u003Cspan style=\"color:#F97583\"> in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> domain_entities:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                    domain_entities[key] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"count\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total_salience\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                domain_entities[key][\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"count\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 1\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                domain_entities[key][\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total_salience\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">+=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> entity.salience\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Score de cohérence = concentration des entités dominantes\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    sorted_entities \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> sorted\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        domain_entities.items(), \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        key\u003C/span>\u003Cspan style=\"color:#F97583\">=lambda\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> x: x[\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">][\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total_salience\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">], \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        reverse\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">True\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    )\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    top_20_salience \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> sum\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(e[\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">][\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total_salience\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> e \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> sorted_entities[:\u003C/span>\u003Cspan style=\"color:#79B8FF\">20\u003C/span>\u003Cspan style=\"color:#E1E4E8\">])\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    total_salience \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> sum\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(e[\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">][\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"total_salience\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> e \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> sorted_entities)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"coherence_score\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: top_20_salience \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> total_salience \u003C/span>\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> total_salience \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#F97583\"> else\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"top_entities\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: sorted_entities[:\u003C/span>\u003Cspan style=\"color:#79B8FF\">20\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"total_unique_entities\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">len\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(domain_entities),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Un score de cohérence au-dessus de 0.6 indique un site fortement spécialisé. En dessous de 0.3, vous êtes dans la zone des agrégateurs — et potentiellement vulnérable au type de recalibrage qu'on observe en mars 2025.\u003C/p>\n\u003Ch3>Les signaux de provenance du contenu\u003C/h3>\n\u003Cp>Au-delà de la cohérence topique, Google évalue si le contenu provient d'une source primaire. Plusieurs signaux techniques contribuent :\u003C/p>\n\u003Cp>\u003Cstrong>Structured data d'auteur et d'organisation.\u003C/strong> Les sites qui implémentent correctement \u003Ccode>author\u003C/code> avec un lien vers un profil vérifié et \u003Ccode>publisher\u003C/code> avec un schema \u003Ccode>Organization\u003C/code> cohérent sont mieux positionnés pour prouver la provenance first-party.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@context\": \"https://schema.org\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@type\": \"Article\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"headline\": \"Guide de choix : chaussures de trail 2025\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"author\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Person\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"Marie Dupont\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"url\": \"https://www.trailexpert.fr/equipe/marie-dupont\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"jobTitle\": \"Ingénieure produit — chaussures trail\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"worksFor\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"Organization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"name\": \"TrailExpert\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"url\": \"https://www.trailexpert.fr\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"sameAs\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"https://www.linkedin.com/in/marie-dupont-trail/\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"publisher\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Organization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"TrailExpert\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"url\": \"https://www.trailexpert.fr\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"logo\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"@type\": \"ImageObject\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \"url\": \"https://www.trailexpert.fr/logo.png\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"datePublished\": \"2025-03-15\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"dateModified\": \"2025-04-02\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le point critique ici : le \u003Ccode>jobTitle\u003C/code> et le \u003Ccode>worksFor\u003C/code> doivent être \u003Cstrong>cohérents avec le topic de l'article\u003C/strong>. Un auteur dont le titre est \"Ingénieure produit — chaussures trail\" qui écrit sur les chaussures de trail envoie un signal de first-party expertise. Un auteur générique \"Rédacteur web\" n'envoie rien.\u003C/p>\n\u003Cp>\u003Cstrong>Les citations et backlinks entrants.\u003C/strong> Quand d'autres sites citent votre contenu comme source primaire (pas comme agrégateur), Google le détecte. Le March Core Update semble avoir renforcé ce signal — ce qui est cohérent avec la \u003Ca href=\"/blog/500m-ai-searches-later-how-to-actually-improve-ai-search-visibility-citations-via-sejournal-hethr-campbell\">montée en puissance des citations dans la visibilité AI\u003C/a>.\u003C/p>\n\u003Ch2>Scénario concret : un e-commerce de 12K pages face au core update\u003C/h2>\n\u003Cp>Prenons un cas réaliste. \u003Cstrong>MaisonDeco.fr\u003C/strong> (fictif, mais basé sur des patterns réels) est un e-commerce de décoration avec 12 000 pages : 8 000 fiches produits, 2 500 pages catégories, 1 200 articles de blog, 300 pages guide d'achat.\u003C/p>\n\u003Ch3>Situation pré-update\u003C/h3>\n\u003Cp>Avant le March Core Update, MaisonDeco.fr perdait régulièrement des positions face à des agrégateurs comme Pinterest (résultats images), Houzz (UGC + fiches pro), et des comparateurs type LeLynx ou Idealo sur les requêtes commerciales.\u003C/p>\n\u003Cp>Trafic organique : ~180 000 sessions/mois. 35 % provient des pages catégories, 25 % des articles de blog, 40 % des fiches produits.\u003C/p>\n\u003Ch3>Impact post-update\u003C/h3>\n\u003Cp>Après le rollout complet (4 semaines), MaisonDeco.fr observe dans Search Console :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>+22 % d'impressions\u003C/strong> sur les requêtes commerciales (type \"canapé scandinave 3 places\")\u003C/li>\n\u003Cli>\u003Cstrong>+15 % de clics\u003C/strong> sur les pages catégories\u003C/li>\n\u003Cli>\u003Cstrong>-8 % de clics\u003C/strong> sur les articles de blog de type \"top 10\" et \"comparatifs\"\u003C/li>\n\u003C/ul>\n\u003Cp>Le pattern est limpide. Les pages catégories (contenu first-party : descriptions produit originales, filtres, avis clients propriétaires) gagnent. Les articles de blog qui avaient un format agrégateur (compilations, \"meilleurs X de 2025\" basés sur des données tierces) reculent.\u003C/p>\n\u003Ch3>Plan d'action technique\u003C/h3>\n\u003Cp>L'équipe SEO de MaisonDeco.fr met en place trois chantiers :\u003C/p>\n\u003Cp>\u003Cstrong>Chantier 1 : Renforcer les signaux first-party sur les pages catégories.\u003C/strong>\u003C/p>\n\u003Cp>Ajout de blocs éditoriaux écrits par les acheteurs internes, avec structured data \u003Ccode>author\u003C/code> liée au profil LinkedIn de l'acheteur. Ajout de données propriétaires : \"Basé sur 3 400 commandes en 2024, les canapés 3 places les plus retournés sont...\"\u003C/p>\n\u003Cp>\u003Cstrong>Chantier 2 : Transformer les articles \"top 10\" en guides d'expertise.\u003C/strong>\u003C/p>\n\u003Cp>Plutôt qu'un comparatif qui agrège des informations disponibles partout, chaque guide intègre des données exclusives (tests internes, photos des locaux de test, métriques de durabilité mesurées en interne). Le format passe de \"Top 10 des meilleurs canapés\" à \"Comment nous testons les canapés : 6 critères et 200 heures de tests\".\u003C/p>\n\u003Cp>\u003Cstrong>Chantier 3 : Monitoring continu des positions par type de page.\u003C/strong>\u003C/p>\n\u003Cp>Configuration d'un suivi segmenté dans Search Console avec un export automatisé :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#!/bin/bash\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Export Search Console segmenté par type de page via l'API\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Nécessite google-auth et gsc-api-cli (pip install searchconsole)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">SITE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://www.maisondeco.fr\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">START_DATE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2025-03-01\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">END_DATE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"2025-04-30\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Segment catégories\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">python3\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -c\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">import searchconsole\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">account = searchconsole.authenticate(client_config='credentials.json')\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">webproperty = account['\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$SITE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">']\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">report = webproperty.query.range('\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$START_DATE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">', '\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$END_DATE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">') \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    .dimension('page', 'query') \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    .filter('page', '/categorie/', 'contains') \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    .get()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">report.to_dataframe().to_csv('gsc_categories_post_update.csv', index=False)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">print(f'Exported {len(report.rows)} rows for category pages')\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Segment blog\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">python3\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -c\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">import searchconsole\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">account = searchconsole.authenticate(client_config='credentials.json')\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">webproperty = account['\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$SITE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">']\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">report = webproperty.query.range('\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$START_DATE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">', '\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$END_DATE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">') \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    .dimension('page', 'query') \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    .filter('page', '/blog/', 'contains') \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    .get()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">report.to_dataframe().to_csv('gsc_blog_post_update.csv', index=False)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">print(f'Exported {len(report.rows)} rows for blog pages')\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Comparez ces exports avec les données pré-update pour isoler l'impact du core update par segment.\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Un outil de monitoring comme Seogard permet de détecter automatiquement ces variations de visibilité par segment sans attendre un export manuel — particulièrement utile quand le rollout d'un core update s'étale sur plusieurs semaines et que les fluctuations quotidiennes rendent l'analyse manuelle peu fiable.\u003C/p>\n\u003Ch2>Pourquoi Reddit et YouTube reculent : l'hypothèse du \"contenu sans engagement propriétaire\"\u003C/h2>\n\u003Cp>Il serait simpliste de dire que Reddit recule parce que c'est de l'UGC. Wikipedia est de l'UGC et ne recule pas. La nuance est ailleurs.\u003C/p>\n\u003Ch3>Le problème de la dilution d'expertise\u003C/h3>\n\u003Cp>Reddit héberge des millions de threads sur des milliers de sujets. La qualité est extrêmement variable — un thread r/financialplanning peut contenir un conseil d'expert ou une ânerie dangereuse, et Google n'a pas de signal fiable pour distinguer les deux à l'échelle.\u003C/p>\n\u003Cp>Jusqu'ici, Google résolvait ce problème en s'appuyant sur les signaux d'engagement (upvotes, commentaires) comme proxy de qualité. Le March Core Update semble avoir réduit le poids de ce proxy en faveur de signaux plus structurels.\u003C/p>\n\u003Cp>YouTube présente le même problème à une échelle différente. Une vidéo YouTube sur la réparation d'un lave-vaisselle Bosch peut être excellente ou catastrophique. Le site officiel Bosch, avec ses fiches de dépannage, a un \u003Cstrong>engagement propriétaire\u003C/strong> sur le sujet — c'est leur produit, leur documentation, leur responsabilité.\u003C/p>\n\u003Ch3>L'impact sur les sites qui dépendent du \"Reddit effect\"\u003C/h3>\n\u003Cp>De nombreux sites SEO ont construit leur stratégie de contenu en ciblant les requêtes où Reddit rankait bien, en produisant du contenu plus structuré sur les mêmes sujets. Si Reddit recule et que ces requêtes sont redistribuées vers des sites de marque, la stratégie de \"remplacement de Reddit\" ne fonctionne que si votre site \u003Cstrong>est\u003C/strong> la marque de référence sur le sujet.\u003C/p>\n\u003Cp>C'est un point fondamental : le core update ne remplace pas les agrégateurs par n'importe quel contenu \"meilleur\". Il les remplace par des sources qui ont une \u003Cstrong>légitimité structurelle\u003C/strong> sur le sujet. Cette logique rejoint directement les réflexions sur \u003Ca href=\"/blog/how-ai-models-understand-your-brand\">la façon dont les modèles AI comprennent votre marque\u003C/a> et sur \u003Ca href=\"/blog/why-great-content-is-no-longer-enough-what-beats-it-in-ai-search-via-sejournal-taylordanrw\">pourquoi un bon contenu ne suffit plus\u003C/a>.\u003C/p>\n\u003Ch2>Implications pour les sites de marque : ne pas crier victoire trop vite\u003C/h2>\n\u003Cp>Les sites de marque qui ont gagné des positions après le March Core Update ne doivent pas supposer que ces gains sont permanents. Plusieurs risques techniques subsistent.\u003C/p>\n\u003Ch3>Le piège du thin content sur les pages catégories\u003C/h3>\n\u003Cp>Beaucoup d'e-commerces ont des pages catégories quasi vides : un titre, une liste de produits, zéro contenu éditorial. Ces pages ont pu gagner des positions par effet mécanique (les agrégateurs reculent, il faut bien que quelqu'un prenne leur place). Mais elles sont vulnérables au prochain core update si elles ne renforcent pas leurs signaux E-E-A-T.\u003C/p>\n\u003Cp>Vérifiez le ratio texte/HTML de vos pages catégories avec Screaming Frog :\u003C/p>\n\u003Col>\n\u003Cli>Crawl complet du site\u003C/li>\n\u003Cli>Filtre sur les URLs \u003Ccode>/categorie/\u003C/code> (ou votre pattern)\u003C/li>\n\u003Cli>Export des colonnes : URL, Word Count, Text Ratio, Status Code\u003C/li>\n\u003Cli>Identifiez les pages avec un Word Count &#x3C; 100 qui ont gagné des positions post-update\u003C/li>\n\u003C/ol>\n\u003Cp>Ces pages sont en sursis. Priorisez l'ajout de contenu éditorial propriétaire sur les catégories à fort trafic.\u003C/p>\n\u003Ch3>La dérive vers le contenu agrégateur\u003C/h3>\n\u003Cp>Un risque plus insidieux : les sites de marque qui, pour alimenter leur blog, produisent du contenu de type agrégateur. Les articles \"Top 10 des tendances déco 2025\" publiés par MaisonDeco.fr sont du contenu agrégateur — ils compilent des informations disponibles partout. Ce type de contenu est désormais pénalisé, même quand il est publié par une marque légitime.\u003C/p>\n\u003Cp>Le correctif technique est de s'assurer que chaque contenu de blog contient \u003Cstrong>au moins un élément de données ou d'expertise propriétaire\u003C/strong> qui ne peut pas être trouvé ailleurs. Un test simple : supprimez mentalement votre marque du contenu. Si un concurrent pourrait publier exactement le même article mot pour mot, c'est du contenu agrégateur déguisé.\u003C/p>\n\u003Ch2>Comment monitorer l'impact d'un core update à l'échelle\u003C/h2>\n\u003Cp>L'analyse d'un core update ne peut pas se faire page par page quand vous gérez des milliers d'URLs. Voici une approche systématique.\u003C/p>\n\u003Ch3>Segmentation par template\u003C/h3>\n\u003Cp>Chaque site a des templates distincts : fiche produit, catégorie, article, landing page, FAQ. L'impact d'un core update est presque toujours corrélé au template, pas à la page individuelle. Créez des segments dans Search Console (via l'API ou via les filtres Regex) pour isoler chaque template :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Analyse segmentée de l'impact core update par template\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pandas \u003C/span>\u003Cspan style=\"color:#F97583\">as\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pd\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Charger les exports GSC pré et post update\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">pre \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pd.read_csv(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"gsc_export_2025-02-01_2025-02-28.csv\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">post \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pd.read_csv(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"gsc_export_2025-04-01_2025-04-30.csv\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Définir les segments par pattern d'URL\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">SEGMENTS\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"product\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#F97583\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#DBEDFF\">/produit/\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"category\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#F97583\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#DBEDFF\">/categorie/\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"blog\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#F97583\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#DBEDFF\">/blog/\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"guide\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#F97583\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#DBEDFF\">/guide/\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"faq\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#F97583\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#DBEDFF\">/faq/\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C/span>\u003Cspan style=\"color:#B392F0\"> segment_analysis\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(df_pre: pd.DataFrame, df_post: pd.DataFrame, segments: \u003C/span>\u003Cspan style=\"color:#79B8FF\">dict\u003C/span>\u003Cspan style=\"color:#E1E4E8\">):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    results \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> []\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> name, pattern \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> segments.items():\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        seg_pre \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> df_pre[df_pre[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"page\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].str.contains(pattern, \u003C/span>\u003Cspan style=\"color:#FFAB70\">regex\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">True\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        seg_post \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> df_post[df_post[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"page\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].str.contains(pattern, \u003C/span>\u003Cspan style=\"color:#FFAB70\">regex\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">True\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        clicks_pre \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> seg_pre[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"clicks\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].sum()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        clicks_post \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> seg_post[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"clicks\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].sum()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        impressions_pre \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> seg_pre[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"impressions\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].sum()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        impressions_post \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> seg_post[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"impressions\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].sum()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        # Position moyenne pondérée par impressions\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        avg_pos_pre \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (seg_pre[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"position\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> seg_pre[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"impressions\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]).sum() \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions_pre \u003C/span>\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions_pre \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#F97583\"> else\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        avg_pos_post \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (seg_post[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"position\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> seg_post[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"impressions\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]).sum() \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions_post \u003C/span>\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions_post \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#F97583\"> else\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        results.append({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"segment\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: name,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"clicks_delta_pct\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: ((clicks_post \u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> clicks_pre) \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> clicks_pre \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> clicks_pre \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#F97583\"> else\u003C/span>\u003Cspan style=\"color:#79B8FF\"> None\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"impressions_delta_pct\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: ((impressions_post \u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions_pre) \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions_pre \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions_pre \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#F97583\"> else\u003C/span>\u003Cspan style=\"color:#79B8FF\"> None\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"avg_position_delta\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: avg_pos_post \u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> avg_pos_pre,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"pages_pre\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: seg_pre[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"page\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].nunique(),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"pages_post\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: seg_post[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"page\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">].nunique(),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        })\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> pd.DataFrame(results)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">impact \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> segment_analysis(pre, post, \u003C/span>\u003Cspan style=\"color:#79B8FF\">SEGMENTS\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(impact.to_string(\u003C/span>\u003Cspan style=\"color:#FFAB70\">index\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">False\u003C/span>\u003Cspan style=\"color:#E1E4E8\">))\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce type d'analyse révèle immédiatement si le core update a touché un template spécifique. Si vos pages \u003Ccode>/blog/\u003C/code> perdent 20 % de clics alors que vos pages \u003Ccode>/produit/\u003C/code> gagnent 15 %, vous savez exactement où concentrer vos efforts.\u003C/p>\n\u003Ch3>Surveiller les requêtes volées aux agrégateurs\u003C/h3>\n\u003Cp>Au-delà de vos propres données, identifiez les requêtes sur lesquelles vous étiez en compétition avec des agrégateurs et vérifiez si les positions ont bougé. Dans Search Console, filtrez les requêtes où votre position moyenne était entre 5 et 15 (zone de compétition). Comparez pré et post update. Si vous êtes passé de la position 8 à la position 4 sur des requêtes où Reddit ou un comparateur occupait les positions 3-5, c'est un gain direct du core update.\u003C/p>\n\u003Cp>Ce suivi est critique mais fastidieux à faire manuellement sur un site de 10 000+ pages. C'est précisément le type de régression (ou de gain) qu'un outil de monitoring continu comme Seogard permet de détecter automatiquement, sans attendre qu'un analyste lance un export CSV.\u003C/p>\n\u003Ch2>Ce que ça signifie pour la stratégie SEO 2025-2026\u003C/h2>\n\u003Cp>Le March 2025 Core Update s'inscrit dans une trajectoire visible depuis 2023 : Google réduit progressivement la visibilité des intermédiaires au profit des sources primaires. Cette tendance est parallèle à l'évolution des \u003Ca href=\"/blog/ai-overview-ctr-fell-61-but-clicks-didn-t-collapse-via-sejournal-mattgsouthern\">AI Overviews et de leur impact sur les citations\u003C/a>.\u003C/p>\n\u003Ch3>Trois ajustements stratégiques non négociables\u003C/h3>\n\u003Cp>\u003Cstrong>1. Auditez votre ratio contenu first-party / contenu agrégateur.\u003C/strong> Si plus de 30 % de votre contenu de blog est du contenu compilé (listes, comparatifs basés sur des sources tierces, roundups), vous êtes exposé. Priorisez la transformation de ce contenu en contenu à valeur propriétaire.\u003C/p>\n\u003Cp>\u003Cstrong>2. Renforcez les signaux d'entité et d'auteur.\u003C/strong> Le structured data n'est pas suffisant seul, mais c'est un prérequis. Assurez-vous que chaque page importante de votre site a un auteur identifiable, avec un profil vérifié et une expertise cohérente avec le sujet. Les \u003Ca href=\"/blog/4-signals-that-now-define-visibility-in-ai-search\">signaux qui définissent la visibilité dans la recherche AI\u003C/a> recoupent largement ceux que Google utilise dans les core updates classiques.\u003C/p>\n\u003Cp>\u003Cstrong>3. Construisez des assets de données propriétaires.\u003C/strong> Les sites qui ont le plus gagné après ce core update sont ceux qui publient des données que personne d'autre ne possède : études internes, benchmarks issus de leur activité, retours d'expérience documentés. Un e-commerce qui publie ses données de retour produit a un avantage structurel qu'aucun agrégateur ne peut répliquer.\u003C/p>\n\u003Ch3>Le trade-off à accepter\u003C/h3>\n\u003Cp>Ce recalibrage a un coût. Les sites de marque qui produisaient du contenu \"volumique\" pour capter du trafic informationnel vont devoir réduire la cadence et augmenter la qualité unitaire. C'est un changement de modèle opérationnel, pas juste un ajustement éditorial. La logique de \u003Ca href=\"/blog/why-more-content-is-no-longer-a-reliable-way-to-grow-seo\">produire plus de contenu pour croître en SEO\u003C/a> est définitivement obsolète.\u003C/p>\n\u003Cp>Les équipes qui s'en sortent le mieux sont celles qui traitent leur site comme une \u003Ca href=\"/blog/your-website-is-a-source-not-a-megaphone-via-sejournal-slobodanmanic\">source d'information, pas comme un mégaphone\u003C/a> — et qui ont les outils de monitoring en place pour détecter les régressions avant que les dégâts soient visibles dans les dashboards mensuels.\u003C/p>\n\u003Cp>Le March 2025 Core Update n'est pas un événement isolé. C'est l'accélération d'une tendance de fond : Google (et les moteurs de recherche AI) valorisent de plus en plus la provenance vérifiable du contenu, au détriment de l'agrégation pure. Les sites qui investissent maintenant dans leurs signaux d'autorité propriétaire sont ceux qui résisteront aux prochains core updates — et aux prochains bouleversements liés à la recherche AI.\u003C/p>",null,12,[18,19,20,21,22],"core update","google march update","search visibility","agrégateurs","SEO technique","March 2025 Core Update : pourquoi les agrégateurs perdent","Mon May 04 2026 06:02:50 GMT+0000 (Coordinated Universal Time)",[26,41,57],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":31,"description":32,"image":15,"imageAlt":15,"readingTime":16,"tags":33,"title":39,"updatedAt":40},"6a041412aa6b273b0c40f181","how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","https://seogard.io/blog/how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","2026-05-13T06:02:58.743Z","2026-05-13","Guide technique pour construire des pages locales qui performent dans les AI Overviews et AI Mode. Schema, SSR, contenu structuré.",[34,35,36,37,38],"local SEO","AI search","pages locales","schema markup","SSR","Pages locales pour l'AI Search : architecture technique","Wed May 13 2026 06:02:58 GMT+0000 (Coordinated Universal Time)",{"_id":42,"slug":43,"__v":6,"author":7,"canonical":44,"category":10,"createdAt":45,"date":46,"description":47,"image":15,"imageAlt":15,"readingTime":48,"tags":49,"title":55,"updatedAt":56},"6a02c291aa6b273b0c2a74f9","the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","https://seogard.io/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","2026-05-12T06:02:57.339Z","2026-05-12","Comment adapter votre audit technique SEO aux exigences des AI Overviews, du crawl par les LLMs et du grounding. Méthodes, code et scénarios concrets.",14,[50,51,52,53,54],"tech seo audit","ai search","ai visibility","crawl budget","structured data","Audit SEO technique pour l'ère AI Search : guide avancé","Tue May 12 2026 06:02:57 GMT+0000 (Coordinated Universal Time)",{"_id":58,"slug":59,"__v":6,"author":7,"canonical":60,"category":10,"createdAt":61,"date":46,"description":62,"image":15,"imageAlt":15,"readingTime":16,"tags":63,"title":68,"updatedAt":69},"6a02fac0aa6b273b0c58d096","the-consensus-gap-via-sejournal-kevin-indig","https://seogard.io/blog/the-consensus-gap-via-sejournal-kevin-indig","2026-05-12T10:02:40.519Z","Une marque peut dominer dans un dashboard AI agrégé et être absente de deux moteurs sur trois. Analyse technique du Consensus Gap et méthodes pour le détecter.",[64,35,65,66,67],"consensus gap","LLM visibility","GEO","multi-engine","The Consensus Gap : votre marque visible sur un LLM, invisible sur deux autres","Tue May 12 2026 10:02:40 GMT+0000 (Coordinated Universal Time)"]