Rankift
RankiftЗарегистрироваться

Рецепт

Отслеживайте обратные ссылки с помощью еженедельного сравнения, которое можно прочитать за минуту

Получение, хранение, сравнение, публикация. Весь рецепт — это один файл Python, папка с датированными JSON и одна строка cron.

Мастерская верста с ключом, соединяющим два водоема и часами

Рецепт от начала до конца

  1. 1

    Создайте ключ

    Войдите через Google, создайте ключ на странице аккаунта и экспортируйте его как RANKIFT_KEY. Никогда не коммитьте его в репозиторий.

  2. 2

    Выберите действие

    refdomains для сравнения на уровне доменов, что нужно большинству алертов. Используйте backlinks, только если вам нужны URL и якоря, за те же 2 кредита.

  3. 3

    Храните датированные снимки

    Один файл на домен за запуск, с именем, содержащим дату. Диск дешев, а старые файлы позволяют ответить на вопросы, которые еще никто не задал.

  4. 4

    Сравнение и публикация

    Сравните два последних файла, выведите то, что исчезло и что появилось, и тихо завершитесь, если оба списка пусты.

  5. 5

    Запланируйте

    Cron в понедельник утром. Добавьте уведомление об ошибке, потому что молчащий мониторинг хуже, чем его отсутствие.

diff.py

Проверено по документированным параметрам: action, q, per, page и key. Формат ответа зависит от действия, поэтому выведите один реальный ответ и установите ROWS и ID в соответствие перед тем, как доверять ему.

python
import json, os, sys, glob, urllib.parse, urllib.request

KEY, SITE = os.environ['RANKIFT_KEY'], 'https://rankift.com/api.php'
ROWS, ID = 'rows', 'domain'   # adjust after inspecting one response

def pull(domain):
    out, page = [], 1
    while True:
        qs = urllib.parse.urlencode({'action': 'refdomains', 'q': domain,
                                     'per': 1000, 'page': page, 'key': KEY})
        with urllib.request.urlopen(f'{SITE}?{qs}') as r:
            batch = json.load(r)[ROWS]
        out += batch
        if len(batch) < 1000 or page >= 5:   # five pages = 5,000 rows
            return out
        page += 1

domain, date = sys.argv[1], sys.argv[2]
json.dump(pull(domain), open(f'snap/{domain}-{date}.json', 'w'))

files = sorted(glob.glob(f'snap/{domain}-*.json'))
if len(files) > 1:
    old = {r[ID] for r in json.load(open(files[-2]))}
    new = {r[ID] for r in json.load(open(files[-1]))}
    lost, gained = sorted(old - new), sorted(new - old)
    if lost or gained:
        print(f'{domain}: -{len(lost)} +{len(gained)}')
        print('lost:', lost[:25])

Почему сравнение лучше дашборда

График показывает, что линия сдвинулась. Сравнение показывает, какие именно домены сдвинулись, а это то, с чем можно работать.

Инструменты вроде Ahrefs и Semrush показывают новые и потерянные ссылки в своем интерфейсе, и для разовых задач это нормально. Проблемы начинаются, когда у вас 50 сайтов и один аналитик: ритуал понедельника, когда нужно открывать каждый проект, съедает утро.

Скрипт превращает этот ритуал в файл. Он также оставляет датированный архив, так что в марте вы сможете ответить, как выглядел профиль в октябре, не прося у вендора экспорт.

Строка cron

Запускается в понедельник в 07:00 по серверному времени и отправляет любой вывод вам по почте, поэтому скрипт ничего не выводит, если ничего не изменилось.

bash
0 7 * * 1  cd /srv/linkwatch && for d in example.com rival-one.com rival-two.com; do python3 diff.py $d $(date +%F); done | mail -s 'link diff' your-team-list

Сколько это стоит

1 кредит — $0.0001. Каждый вызов оплачивается один раз независимо от количества строк, до 1 000 строк.
НастройкаВызовов в неделюКредитов в неделюВ год
1 домен, менее 1 000 реферальных доменов12около $0.01
1 домен, 4 000 реферальных доменов48около $0.04
Ваш сайт и 5 конкурентов, по 1 странице каждый612около $0.06
50 клиентских сайтов, по 1 странице каждый50100около $0.52
Садовник, подстригающий куст в тихом саду с граблями

Подводные камни, которые мы нашли, чтобы вы их не нашли

Снимки меняются только при обновлении индекса. Мы обновляем его примерно раз в месяц, поэтому большинство еженедельных запусков возвращают идентичный список и ничего не выводят. Это намеренно. Тихий результат — ожидаемый.

Глубокая пагинация ограничена 50 000 строк, а лимит в пять страниц в скрипте держит вас далеко от этого предела. Для крупных доменов нужен другой план: сортируйте с помощью sort и order=desc по полю, которое принимает действие, и останавливайтесь рано, как только строки перестанут быть интересными.

Запустите первое получение вручную и прочитайте JSON. Проверьте имена полей. Затем сравните количество строк с общим количеством реферальных доменов из одного ответа бесплатного действия overview, если такой ответ содержит такие данные.

Обработайте HTTP 401 и 402 явно, потому что 401 означает неверный ключ, а 402 означает, что баланс исчерпан. Оба случая должны попадать в уведомление об ошибке. Когда срабатывает сравнение, в первый час следуйте руководству по потерянным ссылкам.

Измерение эффективности купленной ссылочной кампании по одному снимку за раз

Покупка ссылок без базового уровня — распространенный способ получить цифру, которую нельзя защитить. Сделайте снимок до запуска первой ссылки и храните его рядом с каждым последующим снимком.

Затем сравнивайте реферальные домены, а не сырые количества, потому что один донор может содержать много ссылок. Каждая новая строка в сравнении — это один сайт, который можно открыть и проверить вручную.

Кампания, которая выглядит плоской в течение месяца, не обязательно провальна. Обновление индекса происходит медленно, поэтому сравнение отстает от того, что произошло на живых страницах, и это отставание — часть метода.

Как измерить, сработали ли купленные обратные ссылки?

Начните с даты первой ссылки и ищите строки доноров, которые появились после нее. Учитывайте только те, которые остались в следующих двух снимках. Затем сопоставьте это количество с тем, что вы заплатили за ссылки, и запишите результат рядом с датами.

Что должно содержаться в снимке перед покупкой?

Полный список реферальных доменов, сохраненный в том же формате файлов, что и все последующие запуски, с датой и доменом в имени файла. Базовый уровень в другом формате нельзя сравнить, и это та ошибка, которую нельзя исправить позже.

Детектив, сортирующий листья на земле с лупой

Как выглядит шумная неделя в сравнении

Неделя с тысячами новых строк не всегда кризис. Часто это скрейперы. Они копируют страницы, и копии создают ссылки, которые никто не размещал. Сначала проверьте донора, прежде чем делать выводы о своем сайте.

Отсортируйте новые строки по качеству донора, прежде чем читать их. Большинство списка обычно — шум, и короткий взгляд на верхние строки скажет, стоит ли этот всплеск вашего утра.

Если строки — страницы скрейперов, запишите количество и идите дальше. Если это реальные сайты со ссылками на ваши коммерческие страницы, следуйте шагам сортировки.

Почему сравнение показывает прирост от спама?

Потому что сравнение сообщает о том, что появилось в индексе, а не о том, что выбрал человек. Спам, который индекс подхватил, выглядит так же, как редакционная ссылка, пока вы не откроете страницу донора и не прочитаете ее.

Как часто следует проверять кандидатов на дизавоул?

Ежемесячный ритм лучше подходит под ритм индекса, чем ежедневный. Ежедневная проверка в основном показывает тот же список, а ежемесячная дает каждому кандидату время на повторное сканирование, прежде чем вы его оцените. На странице сортировка спам-ссылок есть шаги принятия решений.

Прежде чем доверять первому сравнению

  • Первое получение было прочитано вручную, строка за строкой, хотя бы по одной странице.
  • Имена полей совпадают с константами в начале скрипта.
  • 401 и 402 оба завершают задачу громко, а не тихо.
  • Папка снимков резервируется или синхронизируется куда-то, откуда ее можно восстановить.
  • Кто-то, кроме автора, увидел первый алерт и согласился, что это стоит сообщения.

Делайте архив снимков полезным в течение года

Храните каждый датированный файл, включая те, которые выглядят неизменными. Год еженедельных снимков занимает мало места на диске и отвечает на вопросы, которые еще никто не задал, например, когда впервые появился донор.

Называйте файлы последовательно, с доменом, датой и действием. Смешанные имена заставляют скрипт сравнения выбрать неверную пару, а неверная пара выдает уверенный и неверный алерт.

Сжимайте старые файлы раз в квартал, если место имеет значение. Храните последние двенадцать несжатыми, чтобы еженедельная задача никогда не ждала архив.

Как найти первый снимок, где появился донор?

Отсортируйте датированные файлы по имени, затем ищите в каждом домен донора до первого совпадения. Короткий цикл делает это за несколько строк, и результат зависит только от именования, которое вы поддерживали с самого начала.

Что удалить, а что сохранить?

Сохраняйте каждый снимок, на основе которого было принято решение, а также первый и последний за каждый месяц. Удаляйте остальные только после проверки архива, потому что удаленный файл не сможет ответить на вопрос позже.

Отправляйте сравнение туда, где люди уже читают

Сравнение, попавшее в нечитаемую папку, не имеет ценности. Совместное лучше частного. Опубликуйте результат в канал, который уже смотрит ваша команда, и сделайте сообщение достаточно коротким, чтобы принять решение с одного взгляда.

Хорошее сообщение называет домен, количество потерянных и полученных строк и первый шаг. Оно не содержит полный список, который должен быть в приложенном файле.

Тишина в тихую неделю — часть дизайна. Если ничего не изменилось, никому не нужно напоминание о том, что ничего не изменилось. Оставьте все как есть. Канал остается читаемым для следующего настоящего алерта.

Что должно содержать сообщение?

Три вещи: имя донора или конкурента, два количества и ссылка на сохраненный файл. Когда прикреплен рейтинг, добавьте лучший Domain Rating среди новых строк, потому что один сильный домен меняет приоритет больше, чем десять слабых.

Кто получает уведомление об ошибке?

Тот, кто может исправить задачу, а не только тот, кто читает сообщения. 401 требует новый ключ, а 402 — пополнение с страницы аккаунта. Ни то, ни другое не решается ожиданием следующего понедельника.

Расширение

Замените refdomains на backlinks, если алерт требует URL донора и якорь. Имейте в виду ту же стоимость в два кредита.

Добавьте bulk_dr для оценки каждого нового домена, за один кредит за вызов до 2 000 доменов. Тогда ваше сообщение может сказать «3 новых, лучший DR 72», а не просто список.

Для Google Sheets та же строка запроса работает в Apps Script с UrlFetchApp. А для конкурентов используйте пороги из алертов по обратным ссылкам конкурентов.