Содержание урока · 11 разделов
- robots.txt: файл, с которого начинается вежливость
- Почему colly сама не проверяет robots.txt
- Вежливость техническая: кэш, таймауты, темп
- Ступени защиты: реакция сайта и ответ скрапера
- Чего colly не умеет: исполнять JavaScript
- Альтернативы: chromedp и Rod
- Три вопроса перед запуском: ToS, персональные данные, объём
- Если сайт сопротивляется — это ответ
- Песочница урока
- Коротко: что запомнить
- Вопросы и ответы
Сценарий, после которого обычно пишут такой урок: вчера скрипт собирал каталог, сегодня тот же код получает 403, а вместо списка товаров — страницу-заглушку с предложением доказать, что вы не робот. В коде не изменилось ничего, изменилась реакция сайта. За этим стоит простая механика: у сайта есть инструменты защиты от парсинга, от дешёвых и пассивных до дорогих и агрессивных, и каждый следующий уровень обхода стоит вам больше усилий — не всегда разрешённых. Задача урока — не учить пролезать, а нарисовать карту: что делает сайт, что видит colly, что остаётся за пределами библиотеки и какие ответы законны в каждом случае. Карта нужна даже тому, кто скрапит только учебные витрины: однажды витрина кончится, а привычки останутся.
robots.txt: файл, с которого начинается вежливость#
Robots.txt — текстовый файл в корне сайта: https://site.example/robots.txt. Его читают роботы, чтобы понять, куда ходить нельзя. Синтаксис элементарный: блоки User-agent задают, к кому относится правило, строки Disallow перечисляют запрещённые префиксы путей, Allow — исключения из запрета, Crawl-delay просит держать паузу между запросами, звёздочка в пути означает любой фрагмент. Детали сопоставления правил у разных роботов различаются, поэтому не усложняйте: увидели свой путь в Disallow — этот путь не трогаем, и всё. Crawl-delay — не пожелание, а условие доступа: если сайт просит пять секунд паузы, LimitRule с Delay из урока про лимиты и параллелизм — минимальная цена входа. Отдельный честный вопрос: robots.txt — это закон или конвенция? Юридически — не закон, технически — просьба, этически — публичное заявление владельца о том, куда он автоматический трафик не пускает. Для поисковых роботов документ обязателен де-факто, для скрапера это самый дешёвый способ не оказаться в списке врагов.
Как выглядит robots.txt изнутри
GO# https://shop.example/robots.txt
User-agent: *
Disallow: /cart/
Disallow: /search?
Disallow: /*?sort=
Crawl-delay: 5
User-agent: Googlebot
Disallow:Первый блок — для всех роботов: закрыты корзина, поиск и сортировки, между запросами просят пять секунд паузы. Пустой Disallow у Googlebot означает «этот робот ходит свободно»: разделение по агентам работает именно так — правило берётся из блока своего User-agent, а не складывается со всеми. Для скрапера практический вывод: ваш трафик обычно попадает под первую группу, и спорить с ней — осознанное решение с последствиями.
Почему colly сама не проверяет robots.txt#
Colly — HTTP-клиент с колбеками, и ничего о правилах она не знает: за robots.txt не ходит, пути с ним не сверяет, при нарушении не ругается. Решение остаётся за вами, и это не недоработка, а разделение ответственности: что считать запрещённым, библиотека решить не может. Минимальная дисциплина — руками: отдельным Visit забрать файл из корня, прочитать строки, собрать префиксы Disallow и проверять их перед каждым Visit и перед каждой ссылкой из AbsoluteURL. Это пара десятков строк и один слайс, а экономит оно и нервы, и репутацию. Дальше по цепочке — обычные механизмы курса: AllowedDomains не выпускает за чужие домены, MaxDepth не даёт обходу разбегаться вглубь, LimitRule держит темп — всё это разбирали в уроке про URL-фильтры и глубину. Проверить поведение можно только локально: песочница сети не умеет, а живой сайт — лучший инспектор.
Вежливость техническая: кэш, таймауты, темп#
Часть вежливости не про обход защиты, а про экономию чужих ресурсов. CacheDir кэширует ответы на диск — повторный запуск разработки не дёргает сайт второй раз, механика в уроке про кэш и офлайн-режим. SetRequestTimeout не вешает соединение на минуты, если сайт притворяется медленным. Delay и RandomDelay в LimitRule размазывают запросы, чтобы профиль вашего трафика не выглядел как очередь роботов. Ничего из этого не даёт «невидимость» — и не ставит такой цели: это гигиена, которая делает обход дешевле и для сайта, и для вас. Забавно, что те же настройки косвенно снижают и шанс попасть под лимиты по IP: меньше запросов в секунду — меньше поводов для реакции.
Ступени защиты: реакция сайта и ответ скрапера#
| Защита | Как видит её скрапер | Законный ответ |
|---|---|---|
| robots.txt | файл с Disallow-правилами в корне сайта | прочитать и соблюдать: пути из Disallow не трогать |
| Лимиты по IP | 429 и 403, обрывы соединений, временная блокировка адреса | снизить темп: Delay и RandomDelay в LimitRule, один воркер вместо десяти |
| Капча | страница с проверкой «вы человек» вместо контента | остановиться и не повторять: капчи colly не решает и решать не будет |
| JS-рендеринг | в HTML пустой div, данные рисует браузер | искать JSON-эндпоинт или переходить на браузерный движок |
| Поведенческий анализ | реакция на ровные интервалы, странные заголовки, отсутствие сессий | вести себя как честный клиент или отказаться от обхода |
Чего colly не умеет: исполнять JavaScript#
Colly работает с тем, что прислал сервер, и не исполняет JavaScript — это её главный предел. Для сайтов, отрисованных на JS, это значит конкретное: HTML-ответ содержит пару тегов и пустой контейнер вроде <div id='root'></div>, а товары рисует браузер уже после загрузки скриптов. OnHTML('.product') в такой ситуации молчит — элементов в ответе нет. Типичная ошибка новичка — диагностика через инспектор: открыть браузер, увидеть в инспекторе карточки и решить, что селектор рабочий. Инспектор показывает DOM после исполнения скриптов; colly же получает исходник. Проверяйте через просмотр исходного кода страницы (Ctrl+U): если карточек в исходнике нет, colly их не увидит. Здесь часто спасает приём из прошлого урока про JSON вместо HTML — данные, которые рисует скрипт, кто-то же ему отдал.
Альтернативы: chromedp и Rod#
Когда без JavaScript никак, Go-разработчик берёт браузерный движок: chromedp или Rod. Оба управляют настоящим Chrome через DevTools Protocol: открывают страницу, ждут появления элементов, скроллят, кликают и отдают DOM уже после исполнения скриптов. Цена ясна: процесс браузера в памяти, время загрузки в разы больше, зависимости тяжелее, а скрапер превращается в управление браузером со всеми его капризами — версиями, ожиданиями, таймаутами. Поэтому правило такое: сначала эндпоинт, потом colly, и только затем браузер — как последний аргумент, а не первый инструмент. В этом курсе мы остаёмся на colly: связка с браузерным движком — отдельный мир со своими ошибками и стоит отдельных недель, смешивать слои стоит осознанно и по одному. И заметьте асимметрию: colly управляется одной строкой NewCollector, браузеру нужен отдельный процесс и ритуал запуска — разница в цене поддержки примерно такая же.
Обход капчи и взлом технических блокировок — то, чем этот курс не занимается и что нормой не считает. В сети найдутся сотни сервисов распознавания и рецептов обхода; здесь их не будет. Если сайт активно сопротивляется — ставит капчи, банит адреса, прячет всё за браузерными проверками, — это не задача «победить защиту», это сигнал: данные владельцем раздаются иначе. Ищите партнёрскую выгрузку, прайс-ленту, официальное API или напишите владельцу: письмо дешевле недели войны и работает чаще, чем кажется.
Три вопроса перед запуском: ToS, персональные данные, объём#
Правовая часть складывается из трёх вопросов, и ни один не отменяется тем, что «данные же публичные». Первый: условия использования сайта — ToS. Многие прямо запрещают автоматический сбор; нарушение — риск для отношений с площадкой, а иногда и для дела в целом. Второй: персональные данные. Имена, телефоны, отзывы пользователей, содержимое личных кабинетов — собирать их скрапером самая сомнительная затея из возможных; законодательство о персональных данных различается по странам и везде строже, чем правила про цены. Третий: объём копируемого. Список цен и названий для сравнения — обычная практика; копирование статей, фотографий и каталогов целиком — уже использование чужого контента со всеми последствиями. Это не юридическая консультация: законы и судебная практика меняются, а при серьёзных объёмах вопрос стоит задать юристу, а не поисковику.
Проверка: 403 и colly
Сайт начал отвечать 403. Что по умолчанию произойдёт внутри colly?
Пустой div из SPA
Прочитайте код и выберите, что он выведет:
c := colly.NewCollector()
c.OnHTML(".product", func(e *colly.HTMLElement) {
fmt.Println(e.Text)
})
// сервер вернул:
// <html><body><div id='root'></div></body></html>
c.Visit("https://spa.example.com/")Соберите вежливый коллектор
Восстановите настройку: домены и лимиты темпа.
Скелет вежливого скрапера
Соберите порядок строк: настройки, темп, обработчики, запуск и ожидание.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Карточки: защита и пределы
Если сайт сопротивляется — это ответ#
Соберём позицию курса вместе. Обход капчи и технических блокировок — красная линия, за которой мы не заходим: ни в этом уроке, ни в итоговом проекте. Повторы с задержкой после единичной ошибки — это вежливость, и ей занимается урок про ошибки и повторы; прокси для честного распределения нагрузки обсуждались в уроке про прокси — но всё это про темп, а не про взлом замка. Если же сайт ставит капчи, банит адреса и прячет данные за браузерными проверками, он ответил: здесь автоматическому сбору не рады. Законный ход — спросить данные у владельца: партнёрские программы, выгрузки и официальные API существуют у большинства площадок, и письмо с внятным описанием задачи работает чаще, чем любой обход. Следующий урок — про тестирование скрапера на фикстурах: вернёмся к коду, который не зависит от чужой обороны.
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- robots.txt — файл в корне сайта с Disallow-правилами; colly его не проверяет, решение на совести скрапера.
- Ступени защиты нарастают: лимиты по IP, капчи, JS-рендеринг, поведенческий анализ — каждая следующая дороже для скрапера.
- Colly не исполняет JavaScript: SPA отдаёт пустой контейнер, и OnHTML молчит — инспектор браузера об этом не предупредит.
- Когда без JS никак — chromedp или Rod: настоящий браузер видит скрипты, но стоит памяти и времени.
- По умолчанию ошибочные статусы не доходят до OnHTML: ловите их в OnError, ParseHTTPErrorResponse меняет поведение сознательно.
- Обход капчи и блокировок — красная линия курса; активное сопротивление сайта — повод спросить данные у владельца.
Домашнее задание
Откройте robots.txt трёх сайтов, где бываете, и найдите там Disallow и Crawl-delay. Затем соберите скрапер с AllowedDomains, LimitRule с задержкой не меньше запрошенной и OnError, который логирует статусы. Направьте его на страницу из запрета robots.txt и убедитесь, что ваш код умеет туда не ходить — фильтр по префиксам пишется в двадцать строк.
Личные заметкиПусто
Вопросы и ответы по уроку
Законен ли парсинг сайтов?
Зависит от данных, юрисдикции и способа: публичные страницы с уважением к robots.txt и нагрузке — обычная практика, а обход авторизации, персональные данные и копирование защищённого контента создают правовые риски. Три ориентира из урока: ToS, персональные данные, объём копируемого.
Почему colly не читает robots.txt автоматически?
Colly — HTTP-клиент с колбеками и ничего не решает за вас о допустимости путей. Проверка делается вручную: забрать файл, собрать префиксы Disallow и сверять их перед каждым Visit. Это дисциплина скрапера, а не функция библиотеки.
Как понять, что сайт рендерится на JavaScript?
Откройте исходный код страницы (Ctrl+U), а не инспектор: если нужных элементов в исходнике нет, а в инспекторе есть — данные рисует скрипт. Colly увидит пустой контейнер; ищите JSON-эндпоинт или берите браузерный движок вроде chromedp.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Изучайте дальше
Следующая ступень учебного пути
Testify: тестирование Go с assert и require
Интерактивный курс Testify для Go: assert и require, табличные тесты, suite, mock-объекты, Eventually, HTTP-тесты. 25 уроков с примерами и практикой в браузере.
- Писать читаемые проверки через assert и require, а не лестницы if
- Проверять ошибки, паники и краевые случаи без ручного кода
- Сравнивать структуры, слайсы, карты и числа с плавающей точкой
- Строить табличные тесты и сьюты с хуками подготовки