Частина посилань на цій сторінці партнерські: якщо ви зареєструєтесь через них, сайт отримає комісію, для вас ціна не змінюється. На ціни й рекомендації це не впливає.
Це питання поставили під нашою статтею про аналітику, і поставили в правильному порядку: robots.txt, Cloudflare, Anubis. Їх обговорюють як альтернативи. Вони не альтернативи. Один публікує побажання, другий виконує рішення на межі, третій змушує клієнта заплатити за сторінку. Вибір між ними - це рішення, яка з цих трьох речей вам насправді потрібна.
У нас є пʼятнадцять днів access-логу сайту, який піднявся у жовтні, 9 996 рядків, і одноразовий стек Anubis на ноутбуці. Усе, що нижче з цифрою, походить з одного з двох джерел. Де своїх цифр немає - так і написано.
Спершу: хто взагалі питає
Перед вибором інструмента варто подивитися, чого вартий ввічливий протокол на вашому власному логу. З 9 996 запитів 334 були по robots.txt. Ось хто їх надсилав - проти того, скільки кожен забрав:
| Краулер | Запитів | Запитів robots.txt | Унікальних URL |
|---|---|---|---|
| ClaudeBot | 484 | 78 | 330 |
| Googlebot | 541 | 17 | 333 |
| GoogleOther | 520 | 0 | 327 |
| GPTBot | 391 | 0 | 387 |
| meta-externalagent | 322 | 0 | 315 |
| AhrefsBot | 202 | 21 | 129 |
| bingbot | 164 | 18 | 67 |
| OAI-SearchBot | 108 | 35 | 61 |
| Amazonbot | 96 | 3 | 94 |
| PerplexityBot | 63 | 9 | 21 |
| YandexBot | 49 | 3 | 38 |
| Applebot | 30 | 5 | 22 |
Два нулі в середині таблиці - найцікавіше, і вони означають не те, що здається на перший погляд.
GPTBot не запитав наш robots.txt ані разу на 391 запит. OAI-SearchBot запитав 35 разів - і вони живуть на спільних діапазонах IP. Те саме в Meta: meta-externalagent, краулер навчальних даних, не питав файл ніколи, а facebookexternalhit, який тягне прев’ю посилань, питав вісім разів. Google робить так само: Googlebot - 17 разів, GoogleOther - жодного, і обидва на одній інфраструктурі.
Тож чесне прочитання - не «навчальні краулери ігнорують robots.txt». А те, що запит файлу відбувається десь інде у фліті вендора, і краулер, який ви бачите в логу, стоїть за кешем, якого вам не видно. З цього є практичний наслідок: ваш лог не може сказати, чи правило з robots.txt узагалі хтось побачив, не кажучи про виконання. Єдина перевірка працездатності правила - чи перестали запитувати заборонені шляхи.
Anthropic тут виняток у протилежний бік. 78 запитів на 484 - це одна перевірка robots.txt на кожні шість запитів контенту, а перші два запити ClaudeBot до нас були /robots.txt, а потім /, з інтервалом в одну секунду.
robots.txt: прохання з тонким шаром права позаду
Коштує нічого. Робить, механічно, нічого: заборонений шлях усе одно віддається кожному, хто попросить.
Що змінилося останнім часом - папери позаду. Стаття 53(1)(c) AI Act вимагає від постачальників моделей загального призначення мати політику виявлення і поваги до застережень прав за статтею 4(3) директиви про копірайт, «у тому числі за допомогою передових технологій». Супровідний Code of Practice одну з цих технологій називає прямо: підписанти беруть на себе виконання robots.txt відповідно до RFC 9309.
Перед тим як на це покладатися, прочитайте межі. Обовʼязок падає на постачальників моделей загального призначення, а Code є добровільним і підписним. Скрапер, який сам не є постачальником моделі, поза ним, а що вважати валідним застереженням прав - досі питання до судів. FAQ Комісії перелічує й інші машиночитні механізми поряд з robots.txt.
Практична вартість реальна, але вузька: robots.txt з явними AI-директивами нічого не коштує, і це той артефакт, на який ви вкажете, якщо колись доведеться показати, що застереження було висловлене. Це доказ, не стіна.
Cloudflare: примус, якщо ваш DNS уже там
Це розділ, де своїх цифр у нас немає, і ми радше це скажемо, ніж будемо вдавати, що документація - це замір. Наш блог не стоїть за Cloudflare, тому нічого нижче ми не міряли самі.
З документації Cloudflare: AI Crawl Control показує, які AI-сервіси вас обходять, дає правила дозволу чи блокування по кожному краулеру, відслідковує відповідність robots.txt і має опцію pay per crawl у приватній беті. Функція managed robots.txt генерує директиви з обраних політик і додає їх перед тим, що вже віддає ваш origin. І те, і те в документації позначене як доступне на всіх тарифах.
Архітектурно важливе: це єдиний з трьох варіантів, який зупиняє запит до того, як він дійде до вашого сервера, і єдиний, де список «хто є хто» веде хтось інший. У цьому вся угода. Ви отримуєте примус, не запускаючи нічого, а в обмін рішення про те, що вважати AI-краулером, ухвалює третя сторона, перед вашим сайтом, для кожного відвідувача.
Anubis: нехай клієнт платить
Anubis - це reverse proxy, який ставить перед origin proof-of-work задачу. Жодних заяв про ідентичність: клієнт, який не виконає JavaScript задачі, сторінки не отримає, що б не було в його user-agent.
Ми підняли v1.28.2 перед nginx-origin на ноутбуці й поштурхали його. З дефолтною політикою:
| Клієнт | Відповідь |
|---|---|
curl/8.18.0 | 200, прямо до origin, 53 байти |
| user-agent GPTBot | сторінка відмови, 2 270 байтів, віддана з HTTP 200 |
| user-agent ClaudeBot | сторінка відмови, віддана з HTTP 200 |
| user-agent Googlebot | сторінка задачі, ~7,1 КБ |
| user-agent десктопного Chrome | сторінка задачі, ~7,1 КБ |
Три речі з цієї таблиці варто знати до розгортання.
Сторінка відмови повертається з HTTP 200, не 403. Якщо ви стежите за сайтом по статус-кодах, повністю заблокований краулер виглядає як здоровий.
Звичайний, відкритий небраузерний клієнт проходить без перешкод. Це свідомо - так продовжують працювати curl, читалки фідів і власний моніторинг - але це також означає, що Anubis не є стіною проти скрапінгу взагалі. Усе, що не вдає з себе браузер, за дефолтом пропускається.
А рядок з Googlebot - артефакт лабораторії, і про нього варто сказати: Anubis перевіряє пошуковики зворотним DNS, а для запиту з 127.0.0.1 це неможливо. На реальному розгортанні там був би прохід, не задача. Ми показуємо цей рядок саме тому, що він виглядає як знахідка, а знахідкою не є.
Скільки задача коштує людині
Це та цифра, що вирішує, чи можна ставити Anubis на сайт з живими відвідувачами. Ми проходили задачу headless Chromium і міряли час від навігації до рендеру сторінки origin:
| Складність | Медіана | Прогонів |
|---|---|---|
| 2 (дефолт) | 0.08 с | 5 |
| 4 | 0.27 с | 5 |
| 6 | 50-75 с | 2 з 3 |
На дефолті бар’єр невидимий. Два кроки вгору - і це хвилина крутилки, бо кожен рівень множить роботу на шістнадцять. Третій прогін на складності 6 узагалі не вклався в наш таймаут 90 с - і це чесний вигляд хвоста: на такому налаштуванні витрати не просто великі, вони достатньо неоднорідні, щоб частина відвідувачів просто пішла. Якщо покрутити цей регулятор, бо дефолт «здається низьким», ви цього не відчуєте: ваш власний браузер тримає cookie проходження тиждень. Платить кожен, хто прийшов уперше.
Дві пастки розгортання, кожна з яких забрала більше часу, ніж самі заміри.
Змінна середовища DIFFICULTY на задачу не впливає. У v1.28.2 стартовий лог її повідомляє, віддана задача її ігнорує, а значення береться з файлу політики. Ми це зловили лише прочитавши складність із вбудованого JSON самої сторінки задачі.
Без USE_REMOTE_ADDRESS=true кожен запит повертав HTTP 500 з [misconfiguration] X-Real-IP header is not set у лозі. Anubis вважає, що хтось перед ним ставить цей заголовок. Якщо не ставить ніхто, він закривається на всьому трафіку, не лише на ботах.
Чи взагалі можна зрозуміти, хто є хто
Усі три підходи зводяться до ідентифікації, тож ми перевірили, наскільки вона зараз працює. Кожен запит краулера з нашого логу - проти власного опублікованого списку вендора або зворотного DNS:
| Краулер | Запитів | Підтверджено | Проти чого |
|---|---|---|---|
| ClaudeBot | 484 | 484 / 484 | claude.com/crawling/bots.json |
| GPTBot | 391 | 391 / 391 | openai.com/gptbot.json |
| OAI-SearchBot | 108 | 108 / 108 | openai.com/searchbot.json |
| PerplexityBot | 63 | 63 / 63 | perplexity.ai/perplexitybot.json |
| ChatGPT-User | 39 | 37 / 39 | openai.com/chatgpt-user.json |
| Googlebot | 541 | 541 / 541 | зворотний DNS |
| GoogleOther | 520 | 520 / 520 | зворотний DNS |
| bingbot | 164 | 164 / 164 | зворотний DNS |
| Amazonbot | 96 | 96 / 96 | зворотний DNS |
| YandexBot | 49 | 49 / 49 | зворотний DNS |
| Applebot | 30 | 30 / 30 | зворотний DNS |
| meta-externalagent | 322 | 322 / 322 | анонсовані префікси AS32934 |
Краще, ніж за фольклором. Великі AI-краулери тепер публікують списки IP, які можна забрати й перевірити, і наші зійшлися до запиту.
Два винятки. ChatGPT-User надіслав два запити з адрес поза опублікованим списком - це єдиний у таблиці агент, якого запускає людина, і там розбіжність найменш тривожна. А в meta-externalagent немає ні зворотного DNS, ні опублікованого списку краулерів, який ми змогли б знайти, тож єдина доступна перевірка - чи належить адреса анонсованим мережевим префіксам Meta. Це значно слабше твердження: воно каже, що пакет прийшов з мережі тієї компанії, а не що краулер той, за кого себе видає.
Темп, коли ідентичності немає
Для всього, що не підтверджується і не ідентифікується, поведінка все одно видає. Інтервал між послідовними запитами того самого краулера за пʼятнадцять днів:
| Краулер | Медіана інтервалу | Частка інтервалів до 1 с |
|---|---|---|
| GPTBot | 1 с | 92,1% |
| meta-externalagent | 1 с | 88,2% |
| YandexBot | 1 с | 75,0% |
| ClaudeBot | 1 с | 52,0% |
| AhrefsBot | 29 с | 31,8% |
| Googlebot | 158 с | 8,0% |
| GoogleOther | 137 с | 0,8% |
Розподіл чистий, і йдеться не про ввічливість. Google забрав більше сторінок за всіх (541 і 520 URL) і зробив це з медіаною понад дві хвилини, бо темп обходу - задача, яку він вирішував десятиліттями. Навчальні краулери забрали сайт одним проходом, настільки швидко, наскільки він віддавав.
Практичне застосування: на тихому сайті гістограма інтервалів між запитами відділяє обхід від аудиторії, не читаючи жодного user-agent. Пік, зібраний в одному підсекундному кошику, - це машина. Люди теж дають щільні серії (відновлення вкладок, prefetch), але не тримають їх 390 запитів підряд.
Що ж обрати
| Якщо потрібно | Інструмент | Ціна |
|---|---|---|
| Висловити позицію і мати артефакт | robots.txt з явними AI-директивами | Нічого |
| Зупинити запити до того, як їх побачить сервер, нічого не запускаючи | Cloudflare AI Crawl Control | Ваш DNS іде через них, і їхній список визначає, хто бот |
| Зробити контент недоступним для всього, що не виконує браузерний код | Anubis перед origin | Бар’єр, через який проходить і кожна нова людина |
| Знати, що насправді відбувається | Власний access-лог, розібраний | Один вечір, одноразово |
Вони складаються, і це і є здорова конфігурація: robots.txt каже, чого ви хочете, один з двох інших примушує ту частину, яку вам справді не все одно примусити, а лог показує, чи це взагалі подіяло.
Що стоїть на цьому сайті: robots.txt, і більше нічого. Ми публікуємо статті, щоб їх читали, в тому числі те, що їх потім перекаже. Стек з Anubis ми підняли саме для того, щоб мати цифру по альтернативі, і цифра каже, що інструмент нормальний, а небезпека - в регуляторі складності.
Чого ці заміри сказати не можуть
Один сайт, одна ніша, вікно на пʼятнадцять днів, 9 996 запитів. Сайт з реальним комерційним контентом притягує інший клас скраперів - тих, що не називаються і не з’являються ні в одній з цих таблиць, - і проти цієї публіки всі цифри вище не мають значення.
Заміри Anubis зроблені на ноутбуці проти localhost: без сітьової затримки, один клієнт і процесор, швидший за медіанний телефон. Ставтеся до кривої складності як до форми витрат, не до їх абсолютного значення.
І дірка, яку логами не закрити взагалі: запитати robots.txt не означає виконати його, а не запитати не означає проігнорувати. Усе в першій таблиці - замір запитів, не замір згоди.