Проверка некачественных ссылок: сравнение снимков в SQLite
Ни один скрипт не может назвать ссылку токсичной именно для вас. Он может показать, какие реферальные домены появились, какие исчезли и какие выглядят достаточно странно, чтобы их можно было прочитать вручную.
Редакция Linkzoid ·
Таблица серьезности для новых реферальных доменов
Наши собственные эвристические правила для сортировки, а не определение Google
Уровень
Сигнал
Действие
Игнорировать
Новый домен, DR выше 30, якорь — название вашего бренда или чистый URL
Записать в лог, двигаться дальше
Внимательно посмотреть
50 или более новых доменов за неделю из одного TLD, который вы никогда не целевой
Открыть десять из них
Внимательно изучить
Одинаковый точный якорь на 20 или более новых доменах
Проверить облако якорей, найти источник
Действовать
Сеть, похожая на платную, или взломанные страницы, ведущие на вас
Документировать; рассмотреть файл disavow только если у вас также есть ручное действие
Подождать
Домен исчез в этом месяце
Перепроверить после следующего ежемесячного обновления
Почему diff вместо однократного сканирования
Один снимок показывает, что есть. Diff показывает, что изменилось, и именно там проявляются проблемы.
Google говорит об этом уже много лет: с выпуска Penguin 4.0 в сентябре 2016 года и снова в обновлении спам-ссылок в декабре 2022 года, что в основном игнорирует спамные ссылки, а не наказывает за них. Эту работу выполняет SpamBrain. Поэтому поток мусора чаще является шумом, чем угрозой, а diff в основном защищает вас от реакции на шум.
Ведите свою собственную историю. Пакеты перезаписывают свои данные.
Построение таблицы истории в четыре шага
Diff работает только если каждый запуск попадает в одну и ту же таблицу, в одной и той же форме. Эти шаги сохраняют это состояние.
01
Создать таблицу один раз
Запустите оператор create-if-not-exists с необходимыми столбцами: день, домен и оценка. Сохраните это в скрипте, чтобы новая машина могла воссоздать ту же таблицу без ручных шагов.
02
Вставлять одну строку на домен в день
Используйте параметризованный insert и коммит один раз за запуск. Один коммит предотвращает оставление половины дня в файле при сбое.
03
Защита от второго запуска
Удалите строки за день перед вставкой или добавьте уникальный ключ по дню и домену. Повторный запуск в тот же день заменит строки, а не удвоит их.
04
Сравнить с предыдущим днем в файле
Выберите самую раннюю предыдущую дату с фильтром max(day), а не вчерашнюю дату. Сравнение останется корректным, если неделя была пропущена.
diff.py
Две таблицы были бы аккуратнее. Одной достаточно для любительской настройки: строка на домен на дату снимка.
python
import json, sqlite3, sys, datetime
db = sqlite3.connect('links.db')
db.execute('create table if not exists snap(day text, dom text, dr int)')
rows = json.load(open(sys.argv[1]))
day = datetime.date.today().isoformat()
db.executemany('insert into snap values (?,?,?)',
[(day, r.get('domain'), r.get('dr')) for r in rows])
db.commit()
prev = db.execute('select max(day) from snap where day < ?', (day,)).fetchone()[0]
if prev:
new = db.execute('select dom from snap where day=? except select dom from snap where day=?', (day, prev)).fetchall()
gone = db.execute('select dom from snap where day=? except select dom from snap where day=?', (prev, day)).fetchall()
print(len(new), 'new,', len(gone), 'gone')
Устранение неполадок diff
Симптом
Вероятная причина
Исправление
Сотни «исчезнувших» за ночь
Обновление индекса заменило выборку
Сравнивайте ежемесячно, а не ежедневно
Каждый домен выглядит новым
Таблица была пустой или изменился формат day
Проверьте select distinct day
Столбец DR полностью NULL
Имя поля строки отличается от dr
Вывести одну сырую строку и скорректировать
Дубликаты после повторного запуска
Один и тот же день вставлен дважды
Сначала удалите этот день или добавьте уникальный ключ
Выбор пороговых значений на основе вашей собственной истории
Пороговое значение, скопированное из поста в блоге, — это догадка о чужом сайте. Проверка некачественных ссылок полезна ровно настолько, насколько полезны ее лимиты, а ваша собственная история показывает, что является нормой для вашего домена.
Начните с записи нескольких месяцев без принятия мер. Дайте системе успокоиться. Затем запишите типичные еженедельные колебания. Только после этого устанавливайте лимиты в таблице серьезности.
Начните с базового уровня
Записывайте количество новых и исчезнувших доменов для каждого запуска без реакции на них. Несколько месяцев спокойной записи дают вам диапазон, который принадлежит вашему домену, а не чужому.
Как только базовый уровень существует, одна плохая неделя выделяется на его фоне, и вы можете объяснить разницу без догадок. В этом и есть вся цель базового уровня.
Выберите одно предупреждение на сигнал
Каждый сигнал в таблице получает один порог, одного владельца и одно действие. Сигнал с тремя предупреждениями — это сигнал, который никто не читает, и предупреждения в итоге игнорируются вместе.
Запишите предупреждение рядом с его сигналом в коде, чтобы таблица на этой странице и скрипт никогда не расходились.
Пересматривайте лимиты каждый квартал
Ваш сайт растет, и растет его норма. Перепроверяйте лимиты каждые три месяца и записывайте причину рядом с любым изменением, чтобы история объясняла себя позже.
Чтение таблицы серьезности на практике
Таблица — это помощь в сортировке, а не приговор. Каждая строка говорит вам, куда смотреть, а столбец действий не дает вам панически хвататься за файл disavow.
Работайте сверху. Большинство недель заканчиваются на Ignore или Look. Строка Look начинается с нескольких минут чтения, а строка Look hard начинается с более длительного обзора якорей. Не пропускайте строки, потому что неделя была загруженной. Пропущенная строка — это неделя, когда наводнение осталось незамеченным.
Выберите образец перед принятием решения
Откройте десять отмеченных доменов и прочитайте страницы. Наводнение, которое оказывается одним скрейпером каталога, — это другая проблема, чем наводнение из unrelated блогов, и только страницы позволяют их различить.
Запишите, что вы решили
Ведите одну строку на решение: домен, уровень, что вы проверили и что сделали. Следующий человек, читающий лог, включая будущего вас, получит обоснование без совещания.
Ежемесячное резюме этих строк занимает мало времени и служит хорошим черновиком для обзора.
Что это не может вам сказать
Это не может доказать, что ссылка вредит вам. Никто вне Google не может, и отчет о ручных действиях Search Console — единственное место, где указано наказание.
Это также не может увидеть ссылки моложе последнего обновления. Для более свежих данных спросите людей, управляющих ссылающимся сайтом, или прочитайте логи вашего сервера для рефереров. Наша заметка о времени раскрывает это глубже.
Если вам нужна сторона якорей, anchor_cloud стоит 2 кредита и группирует текст по частоте, что является самым быстрым способом обнаружить скопление точных совпадений.
Ссылки, появившиеся между обновлениями
Все, что моложе последнего обновления, отсутствует в обеих частях diff. Ссылка, которая появляется и исчезает внутри одного окна обновления, вообще не показывается, поэтому сравнение должно запускаться ежемесячно.
Якоря, которые кажутся вам неправильными
Diff видит домен, а не предложение вокруг ссылки. Два одинаковых якоря на двух разных страницах могут означать очень разные вещи, поэтому сохраняйте проверку якорей как отдельный ручной шаг.
Варианты хранения для любительской настройки
SQLite — самая простая база данных, которая все еще отвечает на вопрос diff одним запросом. Она живет в одном файле, поэтому помещается в репозиторий или папку резервных копий без сервера.
Файлы JSON с датой тоже работают. Их медленнее запрашивать, но легче открыть в текстовом редакторе, когда что-то выглядит неправильно. В любом случае, скопируйте хранилище во второе место перед любой очисткой и храните копию полный квартал перед удалением чего-либо.
Когда одного файла достаточно
Одна таблица с столбцом дня покрывает один сайт на годы. Файл остается маленьким, и запросы на этой странице не требуют настройки.
Когда перейти на сервер
Когда несколько человек пишут в одну историю, файл на одной машине становится узким местом. В этот момент управляемая база данных — честный выбор, а схема остается той же.
До этого момента файл в репозитории — самая простая вещь, которая переживает смену ноутбука.
Подключение diff к еженедельной задаче
Запустите diff.py сразу после шага снимка. Выведите счетчики и выйдите с ненулевым кодом, когда new превышает выбранный вами лимит, скажем, 200 за неделю для небольшого сайта. Задача станет красной, и GitHub отправит вам письмо. Просто.
Выберите лимит из своей собственной истории. После двух месяцев вы знаете, является ли 15 новых доменов в неделю нормой или пиком, и любое фиксированное число, скопированное из поста в блоге, — это догадка.
Тихие недели — это норма.
Вопросы о плохих ссылках, отвеченные прямо
Существует ли надежный инструмент проверки некачественных ссылок?
Ни один инструмент не может с уверенностью пометить ссылку вредной, потому что только Google знает, как он относится к каждой из них. Скрипт может выявить паттерны, которые стоит прочитать: внезапные наводнения, повторяющиеся точные якоря, странные TLD. Вы принимаете решение после открытия страниц.
Должен ли я disavow то, что отмечает diff?
Редко. Google сказал, что в значительной степени игнорирует спам-ссылки, а файл disavow предназначен для случаев, таких как ручное действие или беспорядок с платными ссылками, который вы создали сами. Сначала документировать, а затем проверить Search Console перед отправкой чего-либо.
Как часто я должен его запускать?
Снимок еженедельно, обзор ежемесячно. Индекс обновляется примерно раз в месяц, поэтому ежедневный diff в основном сравнивает таблицу саму с собой. Ежемесячный обзор соответствует данным и снижает шум.
Какие столбцы должна сохранять таблица?
Сохраняйте день, домен, DR и столбец источника. Добавьте якорь только если вы также извлекаете якоря. Больше столбцов кажется тщательным, но каждое дополнительное поле — это еще одно, которое может дрейфовать между запусками.
Могу ли я diff две пакеты друг против друга?
Вы можете сравнить их счетчики для одного и того же сайта, но два результата не совпадут. Запустите diff внутри одного источника и сравните направление изменений между источниками, то же правило, которое применяется везде на этом сайте.
Что если домен уходит и возвращается в следующем месяце?
Он показывается как исчезнувший, а затем как новый, что является шумом. Считайте возвраты отдельно или сравнивайте три месяца за раз, чтобы домен, который выпадает на одно обновление, не запускал обзор.