Содержание урока · 11 разделов
- Что такое веб-скрапинг и где его границы
- Ручной путь: net/http и goquery
- Colly golang: фреймворк обхода, а не просто HTTP-клиент
- Подход против задачи: что выбрать
- chromedp: когда страницу рисует JavaScript
- Пять проверок перед тем, как писать скрапер
- Карта курса: от первого Visit до монитора цен
- Что дальше
- Песочница урока
- Коротко: что запомнить
- Вопросы и ответы
Пятница, шесть вечера. Отдел данных пишет в общий чат: поставщик опять не прислал выгрузку, а прайс нужен к понедельнику — триста позиций, и карточка каждой лежит в открытом каталоге на сайте. В чате два предложения: посадить стажёра копировать в Excel или написать скрипт. Первый вариант уже пробовали в прошлом квартале, и он кончился предсказуемо: к вечеру субботы у стажёра съезжают колонки, в понедельник выясняется, что в двух сотнях строк перепутаны цена и старая цена, а тридцать позиций просто забыты. Второй вариант — это и есть веб-скрапинг: программа скачивает страницы каталога, вынимает из разметки название, цену и наличие, складывает всё в файл, который открывается без слёз. В Go-мире для таких задач есть готовый фреймворк — colly, и весь этот курс про то, как им пользоваться: от первого запроса до обходчика с прокси, задержками и базой данных. Но прежде чем открывать редактор, надо честно ответить на один вопрос, который экономит недели работы.
Что такое веб-скрапинг и где его границы#
Веб-скрапинг — автоматическое скачивание страниц сайта и извлечение из них данных: программа делает то же самое, что браузер и человек, только быстрее и без усталости. По устройству это три шага: скачать HTML-ответ, найти в разметке нужные узлы и вытащить из них значения, затем перейти по ссылке на следующую страницу и повторить. Всё усложнение живёт в деталях: сайт может прятать данные за формой входа, отдавать разные страницы под разными адресами, ограничивать темп запросов, а разметка может менять классы при каждом релизе. Границы темы тоже лежат здесь. Скрапят публичные данные — каталоги, карточки товаров, рейтинги, цены; это обычная практика, от агрегаторов до исследовательских проектов. Но обходить авторизацию под чужими учётками, собирать персональные данные или тянуть защищённый контент — уже не технический, а правовой вопрос, и colly тут не помощник. Отдельная строчка — вежливость: скрипт, лупящий сто запросов в секунду, для сайта ничем не отличается от атаки, и нагрузки стоит держать под контролем всегда. В курсе этому посвящён отдельный урок про пределы библиотеки и защиту от скрапинга.
Скрапинг — последний вариант, а не первый. У многих сайтов есть официальный API, RSS, выгрузка CSV в личном кабинете или страница для партнёров: один запрос к поддержке экономит парсер, который придётся чинить после каждого релиза чужого сайта. API стабильнее разметки: JSON-поля меняются редко, а классы в HTML — при каждом редизайне. Правило простое: сначала письмо менеджеру и страница документации, и только когда официального пути нет — colly.
Ручной путь: net/http и goquery#
Скрапер на Go можно написать и без всяких фреймворков, на голой стандартной библиотеке. Схема известная: http.Get или клиент с настройками из урока про HTTP-клиент, чтение тела ответа, а дальше — разбор HTML. Для разбора в Go-мире используют goquery: библиотеку с jQuery-подобными выборками, которая превращает HTML-строку в дерево и позволяет искать узлы CSS-селекторами. Для одной страницы этого хватает с запасом: двадцать строк, и данные на экране. Проблемы начинаются с масштабом. Очередь адресов — ваша, лимит частоты запросов — ваш, повтор при таймауте — ваш, кэш, чтобы не качать одно и то же при отладке, — тоже ваш, cookies между страницами — снова ваши. Каждая из этих вещей по отдельности пишется за час, но вместе это получается второй проект рядом с первым, и в нём столько же ошибок, сколько в самом парсинге. Именно эту обвязку colly и берёт на себя — тем и ценна.
Colly golang: фреймворк обхода, а не просто HTTP-клиент#
colly golang — это фреймворк для обхода сайтов: центральный объект, который называется коллектором, скачивает страницы, разбирает их в DOM и вызывает ваши функции-колбэки на каждом элементе, найденном по CSS-селектору. Вы описываете, на что реагировать — colly делает остальное: держит очередь посещённых адресов, следит за глубиной обхода, умеет ограничивать частоту правилами LimitRule, кэшировать ответы на диск, ходить через прокси, таскать cookies между запросами и отправлять формы. При этом фреймворк остаётся тонкой обвязкой: под капотом всё тот же net/http и goquery, поэтому ничего экзотического внутри нет, а из колбэка доступен и запрос, и ответ целиком. Плата за удобство — абстракция: часть поведения скрыта внутри коллектора, и в редких случаях её приходится вскрывать. На практике это выглядит так: типовой сборщик каталога с пагинацией на colly — несколько десятков строк, а та же программа на голом net/http и goquery — пара сотен, и большую часть из них составляет не парсинг, а обвязка.
Подход против задачи: что выбрать#
| Подход | Что умеет | Когда брать |
|---|---|---|
| Ручное копирование | то, что успеет человек | разовая задача на десять строк, повторять не придётся |
| net/http + goquery | полный контроль над HTTP и DOM, всю обвязку пишете сами | одна-две страницы, нестандартный протокол, жёсткие требования к коду |
| colly | обход, колбэки по селекторам, лимиты, кэш, прокси, cookies, формы | каталоги, пагинация, регулярный сбор — большинство типовых задач |
| chromedp | настоящий браузер: исполняет JavaScript, кликает, ждёт рендер | SPA и витрины, где данных нет в исходном HTML-ответе |
chromedp: когда страницу рисует JavaScript#
У colly есть жёсткий предел, о котором стоит знать в первый же день: она работает с HTML-ответом сервера и не исполняет JavaScript. Для классических серверных страниц этого достаточно — разметка уже содержит данные. Но если сайт собран на фреймворке вроде React или Vue и карточки товаров рисуются в браузере, в исходном ответе будет пустой каркас из пары div-ов, и селекторам нечего ловить. Диагностика простая: откройте исходный код страницы через меню браузера, а не вкладку Elements — инспектор показывает DOM после выполнения скриптов и врёт о том, что реально приехало по сети. Если данных в исходнике нет, берут браузерный движок: chromedp управляет настоящим Chrome, умеет ждать элементы, кликать и забирать результат после рендера, но стоит дороже — тяжёлый процесс, медленный обход, больше памяти. Умная стратегия часто гибридная: браузер один раз вытаскивает адреса реальных запросов данных, а дальше по ним ходит быстрый colly-обходчик. Этой границе посвящён отдельный урок курса — про то, где заканчивается colly.
Пять проверок перед тем, как писать скрапер#
- у сайта есть официальный API, RSS или выгрузка — тогда скрапинг отменяется
- данные публичные: без обхода авторизации и без чужих учётных записей
- robots.txt и правила сайта не запрещают автоматический доступ к нужному разделу
- объём понятен: сколько страниц, как часто, и не ляжет ли сайт от такого темпа
- селектор проверен минимум на двух страницах — разметка редко одинакова до конца каталога
Карта курса: от первого Visit до монитора цен#
Двадцать пять уроков идут по нарастанию сложности, и каждый опирается на предыдущие. Сначала фундамент: во втором уроке — установка и первый скрапер, в третьем и четвёртом — HTML и CSS-селекторы, в пятом — механика колбэков OnHTML. Дальше данные: извлечение значений и структуры Go для них. Потом движение по сайту: обход ссылок, перехват запросов через OnRequest и OnResponse, темп через LimitRule, параллельный режим. Отдельная линия — капризные сайты: пагинация, формы и вход по cookies, заголовки и User-Agent, прокси. Затем устойчивость: обработка ошибок и повторы, кэш на диске, URL-фильтры, чтобы обходчик не разбежался по всему интернету. И склад: JSON, CSV, SQLite — спарсенное должно переживать перезапуск. Финал — итоговый проект: монитор цен, где обходчик пишёт историю в базу, логирует ход через zap и управляется из командной строки через Cobra — если вы проходили курс Cobra, тот материал ляжет сюда напрямую. К этому моменту каждый блок пайплайна вы соберёте руками в уроках, проект только склеит их.
Проверка: с чего начинается задача
Отдел попросил собрать данные с сайта поставщика. С какого шага правильно начинать?
Проверка: возможности фреймворка
Что из перечисленного colly делает сама, без дополнительных библиотек?
Что окажется в исходном HTML-ответе
Прочитайте код и выберите, что он выведет:
// Сайт-витрина на React: карточки товаров рисуются в браузере.
// Скрапер на colly запускает OnHTML(".product-card", ...) и Visit.Соберите скелет первого скрапера
Восстановите минимальную программу: путь импорта colly второй версии, создание коллектора, селектор текстов цитат и запуск обхода.
Расставьте строки программы
Соберите первый скрапер по порядку: от объявления пакета до запуска обхода.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Карточки: словарь скрапера
Что дальше#
В следующем уроке появится первая работающая программа: установка через go get, коллектор, правило OnHTML и десять цитат в терминале — первый скрапер на colly разбирается построчно. Если разметка для вас тёмный лес, третий урок даст необходимый минимум: HTML для скрапера — дерево документа, классы и атрибуты. А если уже хочется понять, зачем нужны все двадцать пять тем, карта курса из блока выше — это она и есть.
Интерпретатор в браузере исполняет только чистый Go без сети и сторонних модулей, а скрапер ходит по сети — поэтому блоков с запуском в песочнице в курсе не будет. Понадобится локальный Go и go get github.com/gocolly/colly/v2: настройка занимает минуты, зато все примеры запускаются в вашем терминале на настоящих сайтах.
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- Веб-скрапинг — автоматическое извлечение данных из HTML-страниц: скачать, найти узлы, вытащить значения, перейти по ссылке.
- Перед скрапингом проверяют официальные пути до данных: API, выгрузка, RSS; скрапер — последний вариант, а не первый.
- Ручной путь net/http + goquery даёт контроль, но очередь, лимиты, повторы и кэш пишутся руками — это второй проект рядом с парсером.
- colly — фреймворк обхода: коллектор с колбэками по CSS-селекторам, лимитами, кэшем, прокси и cookies из коробки.
- colly не исполняет JavaScript: для SPA нужен chromedp или поиск скрытого JSON-эндпоинта.
- Границы темы — публичные данные, robots.txt и вежливый темп; обход авторизации и персональные данные — не про это.
- Курс: 25 уроков от первого Visit до монитора цен с базой, логами zap и CLI на Cobra.
Домашнее задание
Выберите любой сайт с публичным каталогом, который вам действительно интересен. Найдите, есть ли у него официальный API, RSS или выгрузка — начните с подвала страницы и раздела для партнёров. Выпишите три проверки из урока: источник данных, robots.txt и примерный объём страниц. Если официального пути нет — просто зафиксируйте, какой раздел и какие поля вы будете собирать во втором уроке.
Личные заметкиПусто
Вопросы и ответы по уроку
Чем colly отличается от обычного HTTP-клиента на Go?
Клиент только качает ответ. Colly — фреймворк обхода: она следит за очередью и глубиной адресов, разбирает HTML в DOM и вызывает ваши функции на каждом элементе по селектору, плюс даёт лимиты частоты, кэш, прокси и cookies без самописной обвязки.
Можно ли скрапить любой сайт?
Нет. Публичные данные с уважением к robots.txt и нагрузке — обычная практика. Обход авторизации, персональные данные и защищённый контент — правовые риски вне зависимости от технологии. А официальные API всегда предпочтительнее скрапинга.
Colly не видит данные, которые есть в браузере. Что не так?
Скорее всего, страницу дорисовывает JavaScript: colly работает с исходным HTML-ответом и скрипты не исполняет. Сравните исходный код страницы с вкладкой Elements; если данных в исходнике нет — нужен chromedp или поиск JSON-эндпоинта, откуда браузер берёт данные.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Изучайте дальше
Следующая ступень учебного пути
Testify: тестирование Go с assert и require
Интерактивный курс Testify для Go: assert и require, табличные тесты, suite, mock-объекты, Eventually, HTTP-тесты. 25 уроков с примерами и практикой в браузере.
- Писать читаемые проверки через assert и require, а не лестницы if
- Проверять ошибки, паники и краевые случаи без ручного кода
- Сравнивать структуры, слайсы, карты и числа с плавающей точкой
- Строить табличные тесты и сьюты с хуками подготовки