Как мы с локальной LLM легально победили жесткий антифрод и создали визуально-текстового DOM-агента в обход блокировок
DISCLAIMER: Автор статьи категорически осуждает злонамеренное использование методов и способов массового и деструктивного автоматизированного сбора данных с любых сайтов объявлений и обсуждение подобных методов. Цель статьи в другом - рассказать о том как можно искать нужное, не нарушая при этом правил. Эта история о том, как обычная задача по поиску редкого оборудования на вторичном рынке превратилась в полноценное инженерное исследование. В итоге мне удалось научить локальную языковую модель класса 7B/8B (Qwen) обходить агрессивные системы защиты, обфусцированный фронтенд и сетевые ограничения изолированной песочницы. Никакого платного API поисковиков, никаких прокси. Только Python, Playwright и пиксельно-логический подход. Статья написана по горячим следам нашего с ИИ “технологического прорыва”. Предыстория и боль: Почему requests к крупным сайтам - это гарантированный бан. Задача казалась тривиальной: попросить локальную модель в среде Strata найти объявления о продаже флагманской мобильной рабочей станции в максимальной комплектации с редкой профессиональной видеокартой на популярном сайте объявлений. Но современные крупные площадки объявлений обладают просто свирепой системой защиты от ботов. Попытка сделать прямой requests.get() или использовать стандартный BeautifulSoup моментально упирается в банальные “HTTP 403 Forbidden” или “HTTP 429 Too Many Requests”. Работу модели мгновенно отсекал WAF (веб-инструмент защиты) на сетевом уровне. Тогда я попытался использовать классическую «прослойку» - научить модель искать объявления через поисковые системы (Google, Яндекс, DuckDuckGo) с оператором site: domain.ru . Но и тут меня ждало фиаско! Один поисковик выдал типовую заглушку «Вы не робот», которую текстовый скрипт не мог пройти. Текстовое HTML-зеркало второго поисковика намертво зависало по таймауту из-за сетевого allow-list’а внутри изолированного окружения Strata. Третий поисковик отдавал живой HTML, который при парсинге оказывался пустой JavaScript-заглушкой перенаправления. Читать далее
