پایش سئوی یک سایت محتوایی با Claude

پاسخ کوتاه: کار را تقسیم کنید. کد اعداد را از Search Console می‌گیرد و حساب می‌کند: تغییر کلیک، impression و میانگین جایگاه هر صفحه بین دو دوره برابر و یک دسته‌بندی اولیه برای هر افت: تقاضا (جست‌وجوی کمتر) یا رتبه (جایگاه بدتر). Claude جدول محاسبه‌شده را می‌خواند، به زبان ساده توضیح می‌دهد چه خبر است و یک فهرست کوتاه و اولویت‌بندی‌شده از اقدام‌ها پیش‌نویس می‌کند. مدل‌ها در استدلال روی یک خلاصه خوب‌اند و در جمع زدن یک صفحه‌گسترده بد؛ پس به هر طرف کاری را بدهید که در آن خوب است.

یک مثال واقعی: افتی که جریمه نبود

ترافیک یک سایت محتوایی حدود نصف می‌شود. اولین شک همیشه این است که «گوگل جریمه‌مان کرده» و همین شک مستقیم به بازنویسی صفحه‌ها و دنبال کردن آپدیت‌های الگوریتم می‌رسد.

داده می‌تواند چیز دیگری بگوید. اگر impression در کل سایت کم شده ولی میانگین جایگاه‌ها سر جایشان مانده‌اند، صفحه‌ها هنوز رتبه دارند؛ آدم‌های کمتری جست‌وجو می‌کنند یا آدم‌های کمتری به سایت دسترسی دارند. این پاسخ کاملاً متفاوتی می‌خواهد: منظم منتشر کنید، اختلال‌های بیرونی را پشت سر بگذارید و به صفحه‌هایی که رتبه خوبی دارند دست نزنید.

همین تفکیک ارزشمندترین چیزی است که یک بررسی هفتگی می‌دهد؛ و دقیقاً از آن نوع چیزهایی است که کد می‌تواند دسته‌بندی کند و مدل می‌تواند توضیح دهد.

گام ۱: داده قابل مقایسه بگیرید

در Search Console به Performance ← Search results بروید، Compare را بزنید و دو دوره برابر انتخاب کنید (مثلاً ۲۸ روز اخیر در برابر ۲۸ روز قبل). خروجی بگیرید؛ برگه Pages برای هر آدرس یک ردیف دارد با کلیک، impression، CTR و جایگاه. برای خودکارسازی، API سرچ کنسول همین داده را برمی‌گرداند.

هر دوره را جداگانه به‌صورت CSV با ستون‌های Top pages, Clicks, Impressions, CTR, Position خروجی بگیرید.

گام ۲: حساب را به کد بسپارید

یک برنامه کنسولی کوچک روی .NET 10 هر دو خروجی را می‌خواند، صفحه‌ها را تطبیق می‌دهد و هر صفحه را دسته‌بندی می‌کند:

using System.Globalization;

/// <summary>One row of Search Console's "Pages" export: Top pages, Clicks, Impressions, CTR, Position.</summary>
public sealed record PageStats(string Url, int Clicks, int Impressions, double Position);

public enum DropCause
{
    Stable,

    /// <summary>Fewer people searched: impressions fell, but the page still ranks where it did.</summary>
    Demand,

    /// <summary>The page ranks worse: average position moved down by more than a couple of places.</summary>
    Ranking,
}

public sealed record PageChange(string Url, int ClicksBefore, int ClicksAfter, double ImpressionChange, double PositionChange, DropCause Cause);

public static class TrafficDiagnosis
{
    public static IReadOnlyList<PageStats> ReadPagesCsv(string path) =>
        [.. File.ReadLines(path).Skip(1) // header: Top pages,Clicks,Impressions,CTR,Position
            .Select(line => line.Split(','))
            .Where(cells => cells.Length >= 5)
            .Select(cells => new PageStats(
                cells[0].Trim('"'),
                int.Parse(cells[1], CultureInfo.InvariantCulture),
                int.Parse(cells[2], CultureInfo.InvariantCulture),
                double.Parse(cells[^1], CultureInfo.InvariantCulture)))];

    /// <summary>
    /// Compares two periods page by page. Position is "lower is better", so a positive PositionChange means the page fell.
    /// </summary>
    public static IReadOnlyList<PageChange> Compare(IEnumerable<PageStats> before, IEnumerable<PageStats> after, int minImpressions = 100)
    {
        var current = after.ToDictionary(p => p.Url);
        return [.. before
            .Where(p => p.Impressions >= minImpressions && current.ContainsKey(p.Url))
            .Select(p =>
            {
                var now = current[p.Url];
                var impressionChange = (now.Impressions - p.Impressions) / (double)p.Impressions;
                var positionChange = now.Position - p.Position;
                var cause = impressionChange > -0.2 ? DropCause.Stable
                    : positionChange > 2 ? DropCause.Ranking
                    : DropCause.Demand;
                return new PageChange(p.Url, p.Clicks, now.Clicks, impressionChange, positionChange, cause);
            })
            .OrderBy(c => c.ClicksAfter - c.ClicksBefore)];
    }
}

قواعد عمداً ساده و مکتوب‌اند:

  • صفحه‌های کوچک نادیده گرفته می‌شوند (minImpressions)؛ صفحه‌ای که از ۱۲ به ۶ impression می‌رسد نویز است.
  • پایدار اگر impression کمتر از ۲۰ درصد افت کرده.
  • رتبه اگر impression افت کرده و میانگین جایگاه بیش از دو پله بدتر شده.
  • تقاضا اگر impression افت کرده ولی جایگاه ثابت مانده.

نتیجه را به‌شکل یک جدول Markdown چاپ کنید. همین جدول، و نه خروجی خام، چیزی است که مدل می‌بیند.

گام ۳: بگذارید Claude بخواندش

جدول محاسبه‌شده را همراه با زمینه‌ای که در اعداد نیست به Claude بدهید: چه منتشر کردید، تغییرات سایت، قطعی‌ها یا اختلال‌های اینترنت. یک پرامپت که خوب کار می‌کند:

داری داده‌های هفتگی Search Console یک نشریه تخصصی فارسی را بررسی می‌کنی. پایین جدولی از صفحه‌ها هست با کلیک قبل و بعد، تغییر impression، تغییر جایگاه و یک علت محاسبه‌شده (Demand، Ranking یا Stable). زمینه: این دوره به‌جای ۸ مقاله معمول ۲ مقاله منتشر کردیم؛ سه روز اختلال سراسری اینترنت داشتیم.

  1. در سه جمله خلاصه کن چه اتفاقی افتاده.
  2. صفحه‌هایی که Ranking دسته‌بندی شده‌اند را فهرست کن، به ترتیب بیشترین کلیک ازدست‌رفته، با یک فرضیه برای هر کدام.
  3. حداکثر پنج اقدام برای این هفته پیشنهاد بده، به ترتیب اثر مورد انتظار. بازنویسی صفحه‌هایی که Demand دسته‌بندی شده‌اند را پیشنهاد نده.

دستور آخر مهم است. بدون آن، مدل با خیال راحت پیشنهاد می‌دهد هر صفحه‌ای که کلیک از دست داده بهینه شود.

گام ۴: روالش کنید

خروجی و برنامه کنسولی را هر هفته اجرا کنید، جدول‌ها را نگه دارید و هفته به هفته مقایسه کنید. وقتی روال جا افتاد، خروجی می‌تواند زمان‌بندی‌شده از API بیاید و خلاصه Claude هر جایی برسد که چیزها را می‌خوانید: ایمیل، پیام تلگرام، یک یادداشت در داشبورد.

مزایا و معایب

مزایا

  • اعداد محاسبه می‌شوند، نه ساخته؛ مدل فقط توضیحشان می‌دهد.
  • افت تقاضا و افت رتبه پاسخ‌های متفاوتی می‌گیرند؛ صفحه‌های سالم «تعمیر» نمی‌شوند.
  • یک خلاصه مکتوب هفتگی، تاریخچه‌ای از این‌که چه شد و چرا می‌سازد.

معایب

  • داده Search Console نمونه‌برداری‌شده است و چند روز تأخیر دارد؛ روند را نشان می‌دهد، نه حقیقت دقیق.
  • آستانه‌ها قاعده سرانگشتی‌اند؛ صفحه‌های مرزی را دستی بررسی کنید.
  • مدل فقط زمینه‌ای را می‌داند که به آن می‌دهید. قطعی‌ها، وقفه‌های انتشار و تغییرات سایت باید در پرامپت نوشته شوند.

یک روال پایش این‌چنینی برای سایتتان می‌خواهید، یا کمک برای فهمیدن یک افت ترافیک؟ ببینید چطور می‌توانم کمک کنم.

پرسش‌های متداول

چرا خروجی خام Search Console را مستقیم به هوش مصنوعی ندهیم؟

چون مدل‌های زبانی در حساب روی هزاران ردیف قابل اعتماد نیستند. اعداد را با کد حساب کنید (تغییرها، دسته‌بندی‌ها، جمع‌ها) و بعد جدول محاسبه‌شده را به مدل بدهید و بخواهید توضیح دهد، اولویت‌بندی کند و اقدام پیشنهاد دهد.

افت تقاضا را از افت رتبه چطور تشخیص دهم؟

Impression و میانگین جایگاه هر صفحه را بین دو دوره برابر مقایسه کنید. اگر impression کم شده ولی جایگاه تقریباً ثابت مانده، جست‌وجوی کمتری شده (تقاضا). اگر جایگاه پایین رفته، رتبه از دست رفته. کلیک به‌تنهایی این را نمی‌گوید.

هر چند وقت یک بار اجرا شود؟

برای بیشتر سایت‌های محتوایی هفتگی ریتم خوبی است: آن‌قدر طولانی که نوسان روزانه صاف شود و آن‌قدر کوتاه که مشکل قبل از هزینه کردن یک ماه دیده شود. روزهای هفته یکسان را مقایسه کنید تا اثر تعطیلات کم شود.