Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 1 из 25 ~16 мин +50 XP

Знакомство с Colly: зачем скрапить на Go

Пятница, шесть вечера: у отдела данных нет прайса поставщика, и триста позиций никто не будет копировать руками — значит, пора вспомнить про веб-скрапинг на Go и colly golang. Colly — самый известный фреймворк обхода в Go-мире: сам ходит по страницам и отдаёт данные из разметки. Разберём, что это за подход, где у него границы и из каких уроков собран курс.

Содержание урока · 11 разделов

Пятница, шесть вечера. Отдел данных пишет в общий чат: поставщик опять не прислал выгрузку, а прайс нужен к понедельнику — триста позиций, и карточка каждой лежит в открытом каталоге на сайте. В чате два предложения: посадить стажёра копировать в Excel или написать скрипт. Первый вариант уже пробовали в прошлом квартале, и он кончился предсказуемо: к вечеру субботы у стажёра съезжают колонки, в понедельник выясняется, что в двух сотнях строк перепутаны цена и старая цена, а тридцать позиций просто забыты. Второй вариант — это и есть веб-скрапинг: программа скачивает страницы каталога, вынимает из разметки название, цену и наличие, складывает всё в файл, который открывается без слёз. В Go-мире для таких задач есть готовый фреймворк — colly, и весь этот курс про то, как им пользоваться: от первого запроса до обходчика с прокси, задержками и базой данных. Но прежде чем открывать редактор, надо честно ответить на один вопрос, который экономит недели работы.

Что такое веб-скрапинг и где его границы#

Веб-скрапинг — автоматическое скачивание страниц сайта и извлечение из них данных: программа делает то же самое, что браузер и человек, только быстрее и без усталости. По устройству это три шага: скачать 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 второй версии, создание коллектора, селектор текстов цитат и запуск обхода.

package main import ( "fmt" "github.com/gocolly/colly/" ) func main() { c := colly.() c.OnHTML("", func(e *colly.HTMLElement) { fmt.Println(e.Text) }) c.("https://quotes.toscrape.com/") }

Расставьте строки программы

Соберите первый скрапер по порядку: от объявления пакета до запуска обхода.

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Карточки: словарь скрапера

Термин

Веб-скрапинг

нажмите, чтобы перевернуть
Определение

Автоматическое скачивание страниц и извлечение из них данных: скачать HTML, найти узлы разметки, вытащить значения, перейти дальше.

1 / 6

Что дальше#

В следующем уроке появится первая работающая программа: установка через go get, коллектор, правило OnHTML и десять цитат в терминале — первый скрапер на colly разбирается построчно. Если разметка для вас тёмный лес, третий урок даст необходимый минимум: HTML для скрапера — дерево документа, классы и атрибуты. А если уже хочется понять, зачем нужны все двадцать пять тем, карта курса из блока выше — это она и есть.

Песочница урока

Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +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 · Знакомство с Colly: зачем скрапить на Go)

Вопросы и ответы по уроку

Чем colly отличается от обычного HTTP-клиента на Go?

Клиент только качает ответ. Colly — фреймворк обхода: она следит за очередью и глубиной адресов, разбирает HTML в DOM и вызывает ваши функции на каждом элементе по селектору, плюс даёт лимиты частоты, кэш, прокси и cookies без самописной обвязки.

Можно ли скрапить любой сайт?

Нет. Публичные данные с уважением к robots.txt и нагрузке — обычная практика. Обход авторизации, персональные данные и защищённый контент — правовые риски вне зависимости от технологии. А официальные API всегда предпочтительнее скрапинга.

Colly не видит данные, которые есть в браузере. Что не так?

Скорее всего, страницу дорисовывает JavaScript: colly работает с исходным HTML-ответом и скрипты не исполняет. Сравните исходный код страницы с вкладкой Elements; если данных в исходнике нет — нужен chromedp или поиск JSON-эндпоинта, откуда браузер берёт данные.

Термины урока

Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.

Следующая ступень учебного пути

Testify25 уроков~9 чпрактика25 уроков уже доступны

Testify: тестирование Go с assert и require

Интерактивный курс Testify для Go: assert и require, табличные тесты, suite, mock-объекты, Eventually, HTTP-тесты. 25 уроков с примерами и практикой в браузере.

  • Писать читаемые проверки через assert и require, а не лестницы if
  • Проверять ошибки, паники и краевые случаи без ручного кода
  • Сравнивать структуры, слайсы, карты и числа с плавающей точкой
  • Строить табличные тесты и сьюты с хуками подготовки