Рецепт
Відстежуйте зворотні посилання за допомогою щотижневого diff, який можна прочитати за хвилину
Отримання, зберігання, порівняння, публікація. Весь рецепт — це один файл Python, папка з dated JSON та рядок cron.

Рецепт від початку до кінця
- 1
Створіть ключ
Увійдіть через Google, створіть ключ на сторінці облікового запису та експортуйте його як
RANKIFT_KEY. Ніколи не фіксуйте його в репозиторії. - 2
Оберіть дію
refdomainsдля diff на рівні домену, що потрібно більшості сповіщень. Використовуйтеbacklinksлише тоді, коли вам потрібні URL та якірні тексти, за ту ж саму вартість у 2 кредити. - 3
Зберігайте знімки з датою
Один файл на домен за один запуск, іменовано з датою. Диск дешевий, а старі файли дозволяють відповідати на питання, які ще ніхто не задавав.
- 4
Diff та публікація
Порівняйте два найновіші файли, виведіть те, що зникло і що з'явилося, і виходьте тихо, якщо обидва списки порожні.
- 5
Заплануйте це
Cron у понеділок вранці. Додайте сповіщення про помилку, бо тихий монітор гірший за відсутність монітора.
diff.py
Перевірено проти задокументованих параметрів: action, q, per, page та key. Формат відповіді відрізняється залежно від дії, тому надрукуйте одну реальну відповідь та встановіть ROWS та ID відповідно до неї, перш ніж довіряти їй.
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])Чому diff перевершує дашборд
Графік показує, що лінія змістилася. Diff показує, які саме домени змістилися, а це те, на що ви можете вплинути.
Інструменти на кшталт Ahrefs та Semrush показують нові та втрачені посилання у своєму інтерфейсі, і для разової роботи це добре. Проблеми починаються, коли у вас п'ятдесят сайтів та один аналітик, і понеділковий ритуал відкриття кожного проекту з'їдає ранок.
Скрипт перетворює цей ритуал на файл. Він також залишає архів з датою, тому у березні ви зможете відповісти, як виглядав профіль у жовтні, не прохаючи постачальника про експорт.
Рядок cron
Запускається в понеділок о 07:00 за серверним часом і надсилає будь-який вивід вам поштою, тому скрипт нічого не друкує, коли нічого не змінилося.
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 домен, менше 1 000 доменів-посилальників | 1 | 2 | приблизно $0.01 |
| 1 домен, 4 000 доменів-посилальників | 4 | 8 | приблизно $0.04 |
| Ваш сайт та 5 конкурентів, по 1 сторінці кожен | 6 | 12 | приблизно $0.06 |
| 50 сайтів клієнтів, по 1 сторінці кожен | 50 | 100 | приблизно $0.52 |

Пастки, на які ми потрапили, щоб ви їх уникли
Знімки змінюються лише тоді, коли змінюється індекс. Ми оновлюємо його приблизно щомісяця, тому більшість щотижневих запусків повертають ідентичний список і нічого не виводять. Це навмисно. Тихий результат є очікуваним.
Глибока пагінація обмежена 50 000 рядків, а п'ятирядковий ліміт у скрипті тримає вас далеко від цієї межі. Великі домени потребують іншого плану: сортируйте за допомогою sort та order=desc для поля, яке приймає дія, і зупиніться рано, коли рядки перестають бути цікавими.
Запустіть перше отримання вручну та прочитайте JSON. Перевірте назви полів. Потім порівняйте кількість рядків із загальною кількістю доменів-посилальників з однієї відповіді безкоштовної дії overview, якщо ця відповідь її містить.
Обробляйте HTTP 401 та 402 явно, бо 401 означає неправильний ключ, а 402 означає, що баланс вичерпано. Обидва варіанти мають потрапляти у ваше сповіщення про помилку. Коли diff спрацює, дотримуйтесь runbook втрачених посилань протягом першої години.
Вимірювання кампанії куплених посилань, по одному знімку за раз
Купівля посилань без базового рівня — поширений спосіб отримати число, яке ви не зможете захистити. Зробіть знімок до того, як буде розміщено перше посилання, і зберігайте його поруч із кожним наступним знімком.
Потім порівнюйте домени-посилальники, а не сирі підрахунки, бо один донор може містити багато посилань. Кожен новий рядок у diff — це один сайт, який ви можете відкрити та перевірити вручну.
Кампанія, яка виглядає плоскою протягом місяця, не є автоматично невдалою. Оновлення індексу повільні, тому diff відстає від того, що сталося на живих сторінках, і ця затримка є частиною методу.
Як виміряти, чи спрацювали куплені зворотні посилання?
Починайте з дати першого розміщення і шукайте рядки донорів, які з'явилися після нього. Рахуйте лише ті, які залишилися в наступних двох знімках. Потім зіставте цю кількість із тим, що ви заплатили за розміщення, і запишіть результат поруч із датами.
Що має містити знімок перед покупкою?
Повний список доменів-посилальників, збережений у тому ж форматі файлу, що й кожен наступний запуск, з датою та доменом у назві файлу. Базовий рівень в іншому форматі не можна порівняти, і це та помилка, яку неможливо виправити пізніше.

Як виглядає шумний тиждень у diff
Тиждень із тисячами нових рядків не завжди є кризою. Часто це скрейпери. Вони копіюють сторінки, і копії створюють посилання, які ніхто не розміщував. Перевірте донора, перш ніж робити висновки про свій сайт.
Сортуйте нові рядки за якістю донора, перш ніж читати їх. Більшість списку зазвичай — це шум, і короткий погляд на верхні рядки скаже вам, чи вартий сплеск решти вашого ранку.
Якщо рядки — це скрейп-сторінки, запишіть кількість і йдіть далі. Якщо це реальні сайти з посиланнями на ваші грошові сторінки, дотримуйтесь кроків тріажа.
Чому diff показує приріст від спаму?
Тому що diff повідомляє про те, що з'явилося в індексі, а не про те, що обрав людина. Спам, який індекс захопив, виглядає так само, як редакційне посилання, доки ви не відкриєте сторінку донора і не прочитаєте її.
Як часто я повинен переглядати кандидатів на disavow?
Щомісяця краще відповідає ритму індексу, ніж щодня. Щоденний перегляд переважно показує той самий список знову, тоді як щомісячний дає кожному кандидату час на повторне скрейпінг, перш ніж ви його оціните. На сторінці тріаж спам-посилань є кроки прийняття рішень.
Перш ніж довіряти першому diff
- Перше отримання було прочитане вручну, рядок за рядком, принаймні для однієї сторінки.
- Назви полів збігаються з константами на початку скрипта.
- 401 та 402 обидва викликають явну помилку завдання, а не тиху.
- Папку зі знімками резервується або синхронізується в місці, з якого ви можете її відновити.
- Хтось інший, крім автора, бачив перше сповіщення і погоджується, що воно варте повідомлення.
Зберігайте архів знімків корисним протягом року
Зберігайте кожен файл з датою, включаючи ті, що виглядають незмінними. Рік щотижневих знімків займає мало місця на диску, і він відповідає на питання, які ще ніхто не задавав, наприклад, коли з'явився донор.
Називайте файли послідовно, з доменом, датою та дією. Різні назви змушують скрипт diff вибрати неправильну пару, а неправильна пара дає впевнене, але хибне сповіщення.
Стискайте старі файли раз на квартал, якщо місце має значення. Зберігайте найновіші дванадцять несжатыми, щоб щотижнева робота ніколи не чекала на архів.
Як знайти перший знімок, де з'явився донор?
Сортуйте файли з датою за назвою, потім шукайте в кожному з них домен донора, доки не знайдете перше збігання. Короткий цикл робить це за кілька рядків, і результат такий самий, як іменування, яке ви зберегли з самого початку.
Що видалити, а що залишити?
Залишайте кожен знімок, на основі якого було прийнято рішення, плюс перший і останній за кожен місяць. Видаліть решту лише після перевірки архіву, бо видалений файл не зможе відповісти на питання пізніше.
Надсилайте diff туди, де люди вже читають
Diff, який потрапляє в непрочитану папку, не має цінності. Спільне краще за приватне. Опублікуйте результат у канал, який ваша команда вже спостерігає, і зробіть повідомлення коротким, щоб можна було діяти з одного погляду.
Гарне повідомлення називає домен, кількість втрачених та отриманих рядків та перший крок. Воно не містить повного списку, який належить у вкладеному файлі.
Тиша в тихий тиждень — частина дизайну. Якщо нічого не змінилося, нікому не потрібно нагадування про те, що нічого не змінилося. Залишайте це так. Канал залишається читабельним для наступного реального сповіщення.
Що має містити повідомлення?
Три речі: назву донора або конкурента, дві кількості та посилання на збережений файл. Коли додано рейтинг, додайте найкращий Domain Rating серед нових рядків, бо один сильний домен змінює пріоритет більше, ніж десять слабких.
Хто отримує сповіщення про помилку?
Хтось, хто може виправити завдання, а не тільки хтось, хто читає повідомлення. 401 потребує нового ключа, а 402 потребує поповнення з облікової сторінки. Жодне з них не вирішується очікуванням наступного понеділка.
Розширення
Замініть refdomains на backlinks, коли сповіщення потребує URL донора та якірного тексту. Майте на увазі ту ж саму вартість у два кредити.
Додайте bulk_dr для оцінки кожного нового домену, за один кредит за виклик до 2 000 доменів. Тоді ваше повідомлення може сказати "3 нових, найкращий DR 72", а не просто список.
Для Google Sheets такий самий рядок запиту працює в Apps Script з UrlFetchApp. А для конкурентів використовуйте порогові значення з сповіщень про зворотні посилання конкурентів.