TL;DR
LLM-краулеры стали новым вызовом для веба, агрессивно выкачивая контент для обучения моделей. Разбираем технические аспекты защиты и обходные пути, которые используют скрейперы.
Введение: новый фронт в войне за контент
С появлением LLM (Large Language Models) скрейпинг перешёл на промышленные масштабы. Традиционные методы вроде rate limiting и CAPTCHA часто бесполезны против распределённых сетей прокси.
// Типичный User-Agent LLM-краулера
const LLM_CRAWLERS = [
'GPTBot',
'CCBot',
'ChatGPT-User',
'anthropic-ai'
];
Эволюция анти-скрейпинга
1. Динамический контент через hydration
Современные фронтенд-фреймворки усложняют скрейпинг:
// Next.js пример с динамической загрузкой
export default function ProtectedContent() {
const [data, setData] = useState(null);
useEffect(() => {
fetch('/api/protected')
.then(res => {
if (!res.ok) throw new Error('Blocked');
return res.json();
})
.then(setData);
}, []);
return data ? <Article content={data} /> : <Loader />;
}
2. Behavioral fingerprinting
Современные системы анализируют:
- Паттерны навигации
- Время между запросами
- Canvas/webGL fingerprint
// Пример детекции неестественного скролла
window.addEventListener('scroll', () => {
const scrollSpeed = calculateScrollVelocity();
if (scrollSpeed > 1000) { // Нечеловеческая скорость
blockSession();
}
});
Оборона и нападение: технические детали
Защита через Edge Functions
Cloudflare Workers пример:
// Cloudflare Worker для блокировки LLM
export default {
async fetch(request, env) {
const ua = request.headers.get('user-agent');
const ip = request.headers.get('cf-connecting-ip');
if (LLM_CRAWLERS.some(bot => ua.includes(bot))) {
return new Response('Access denied', { status: 403 });
}
// Проверка по IP-репутации
const ipRep = await checkIPReputation(ip);
if (ipRep.score > 7) {
return serveHoneypotContent();
}
return fetch(request);
}
}
Методы обхода защиты
Скрейперы используют:
- Headless Chrome с Puppeteer
- Эмуляцию человеческого поведения
- Распределённые прокси-сети
# Пример Puppeteer с человеческими паузами
async def human_like_scroll(page):
for _ in range(random.randint(3, 7)):
await page.mouse.wheel({deltaY: random.randint(200, 500)})
await page.waitForTimeout(random.uniform(0.5, 2.0))
Практические рекомендации
-
Слоёная защита:
- Статический анализ (User-Agent, IP)
- Динамический анализ (поведение)
- Контентная защита (obfuscation)
-
Юридические методы:
- Обновление robots.txt
User-agent: GPTBot Disallow: / -
Технические санкции:
- Ответы с задержкой для подозрительных запросов
- Возврат искажённых данных
Заключение
Гонка вооружений между создателями контента и LLM-краулерами только начинается. Современный фронтенд-разработчик должен понимать не только React, но и основы кибербезопасности. В ближайшие годы мы увидим новые стандарты веб-безопасности, специально адаптированные под угрозы ИИ.
Ключевой вывод: Защита контента теперь требует комплексного подхода, сочетающего технические, юридические и поведенческие методы.
Источник: https://webdecoy.com/blog/ai-scraping-war-llm-crawlers-breaking-the-web/