Граббер (grabber): что это такое и как он работает

Граббер (grabber): что это такое и как он работает Полезное

Граббер (англ. grabber, от grab — «захватывать») — это скрипт или программа, которая автоматически скачивает данные с веб-страниц: тексты, цены, изображения, ссылки. Проще говоря, граббер делает за вас рутину «зайти на страницу и сохранить нужное», только на сотнях и тысячах страниц подряд.

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

Что делает граббер

Задача граббера — собрать сырые данные из открытого источника и сложить их в удобное место: файл, таблицу, базу данных или прямо в другой сайт. Он не думает о смысле данных, его дело — быстро и без ручного труда «захватить» то, что вы указали.

Типовые сценарии, где граббер экономит время:

  • наполнение интернет-магазина: перенести карточки товаров с описаниями и фото, когда их тысячи;
  • сбор цен и ассортимента конкурентов для анализа (мониторинг цен);
  • агрегация: собрать новости, вакансии или объявления из нескольких источников в одном месте;
  • сбор данных для аналитики и обучения моделей: отзывы, характеристики, статистика;
  • регулярное обновление меняющихся данных — например, курсов валют или прогноза погоды.

Важная оговорка: граббер копирует данные «как есть». Если в источнике опечатки, лишние пробелы или ошибки разметки — все это переедет к вам без изменений. Поэтому собранные данные почти всегда нужно чистить и проверять, а не выкладывать напрямую.

Граббер, парсер и краулер: в чем разница

Эти три слова постоянно смешивают, потому что в реальных инструментах они работают вместе. Но задачи у них разные, и их полезно развести.

Инструмент Задача Что на входе Что на выходе
Краулер (crawler, «паук») Обойти сайт по ссылкам и найти адреса страниц Стартовый URL Список URL для обработки
Граббер (grabber) Скачать содержимое страниц по известным адресам Список URL Сырой HTML, файлы, картинки
Парсер (parser) Разобрать скачанное и извлечь нужные поля Сырой HTML/текст Структурированные данные (цена, название)

Проще всего запомнить по цепочке одной задачи «собрать каталог товаров»: краулер находит адреса всех карточек, граббер скачивает их HTML, парсер достает из этого HTML цену и название и складывает в таблицу.

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

Как устроен граббер: этапы работы

Работу почти любого граббера можно разложить на четыре шага. Это не жесткий стандарт, а удобная модель — в конкретных инструментах шаги могут сливаться или менять порядок.

  1. Запрос страницы. Граббер отправляет HTTP-запрос по адресу и получает ответ сервера — обычно HTML-код страницы. На этом шаге задают заголовки запроса и паузы между обращениями.
  2. Получение и сохранение сырых данных. Ответ сохраняется целиком: HTML, а при необходимости — картинки, файлы, медиа по ссылкам со страницы.
  3. Извлечение нужного. Из сырого HTML выбирают только целевые элементы: заголовки, цены, описания, ссылки. Формально это уже работа парсера, но в большинстве инструментов она встроена в тот же процесс.
  4. Выгрузка результата. Отобранные данные сохраняют в нужном формате — CSV, JSON, таблица базы данных или запись на другой сайт.

Отдельный нюанс — страницы, которые подгружают контент через JavaScript уже в браузере. Обычный HTTP-запрос вернет пустой «каркас» без данных. Для таких сайтов нужен инструмент, который умеет выполнять JavaScript (об этом ниже).

Пример: граббер на Python

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

  • requests — отправка HTTP-запросов и загрузка страниц;
  • BeautifulSoup (пакет beautifulsoup4) — разбор HTML и выборка элементов;
  • lxml — быстрый движок разбора для больших объемов;
  • Scrapy — каркас для крупных проектов, где нужны краулер, граббер и парсер вместе;
  • Selenium или Playwright — управление настоящим браузером для страниц с JavaScript.

Начну с полного примера, который можно скопировать и запустить без установки библиотек и без интернета: он разбирает готовый фрагмент HTML средствами стандартной библиотеки Python. Так виден сам принцип извлечения данных.

from html.parser import HTMLParser

# Фрагмент HTML, который граббер получил бы со страницы каталога
html_doc = (
    '<div class="card"><h2 class="name">Клавиатура</h2>'
    '<span class="price">2490</span></div>'
    '<div class="card"><h2 class="name">Мышь</h2>'
    '<span class="price">990</span></div>'
)

class CardGrabber(HTMLParser):
    def __init__(self):
        super().__init__()
        self.items = []
        self.cur = {}
        self.grab = None

    def handle_starttag(self, tag, attrs):
        cls = dict(attrs).get("class", "")
        if cls == "name":
            self.grab = "name"
        elif cls == "price":
            self.grab = "price"

    def handle_data(self, data):
        if self.grab:
            self.cur[self.grab] = data.strip()
            if self.grab == "price":
                self.items.append(self.cur)
                self.cur = {}
            self.grab = None

g = CardGrabber()
g.feed(html_doc)
for it in g.items:
    print(it["name"], "-", it["price"], "руб.")

Вывод в консоли:

Клавиатура - 2490 руб.
Мышь - 990 руб.

В реальном проекте так вручную обычно не разбирают — берут requests для загрузки и BeautifulSoup для выборки по CSS-селекторам. Тот же результат получается короче и читаемее:

import requests
from bs4 import BeautifulSoup

# Скачиваем страницу каталога и достаем карточки товаров
url = "https://example.com/catalog"
headers = {"User-Agent": "MyGrabber/1.0 (+https://example.com/contact)"}
resp = requests.get(url, headers=headers, timeout=10)
resp.raise_for_status()  # прервет выполнение, если сервер вернул ошибку

soup = BeautifulSoup(resp.text, "html.parser")
for card in soup.select("div.card"):
    name = card.select_one(".name").get_text(strip=True)
    price = card.select_one(".price").get_text(strip=True)
    print(name, "-", price, "руб.")

Этот вариант требует установки библиотек (pip install requests beautifulsoup4) и доступа в интернет, а адрес example.com/catalog — условный, замените на реальный. Логика та же: загрузить страницу, найти нужные элементы, вывести данные.

Правовые и этичные рамки сбора данных

Технически граббер написать несложно, но сбор чужих данных — это зона, где легко нарушить правила. Автоматический доступ к сайту не делает данные «ничьими». Перед запуском стоит проверить несколько вещей.

Файл robots.txt. Это рекомендация владельца сайта о том, какие разделы можно обходить роботам. Юридической силы у него нет, но игнорировать его — плохой тон, а иногда и повод для блокировки. Проверить правила можно стандартной библиотекой Python:

from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
rp.parse([
    "User-agent: *",
    "Disallow: /admin/",
    "Allow: /catalog/",
])
print(rp.can_fetch("*", "https://example.com/catalog/item1"))
print(rp.can_fetch("*", "https://example.com/admin/users"))

Вывод:

True
False

Условия использования сайта (Terms of Service). Многие сайты прямо запрещают автоматический сбор данных в пользовательском соглашении. Нарушение ToS — это уже договорный, а не только этичный вопрос.

Персональные данные. Имена, телефоны, email, адреса подпадают под закон о персональных данных (в России — 152-ФЗ). Собирать и хранить их без законного основания нельзя, даже если технически они доступны.

Авторские права. Тексты, фотографии и другой контент защищены авторским правом. Скопировать их граббером и разместить у себя — нарушение, отдельная история от самого факта сбора.

Нагрузка на сайт. Поток запросов без пауз похож на атаку и может положить чужой сервер. Этичный граббер делает паузы между запросами, представляется в заголовке User-Agent и не собирает больше, чем нужно.

Хорошая практика — вместо парсинга проверить, нет ли у источника официального API: он отдает данные легально, в готовом формате и без риска блокировки. Например, погоду или курсы валют почти всегда лучше брать через API, а не собирать со страниц.

Выводы

Граббер — это инструмент автоматического сбора данных с сайтов, который экономит часы ручной работы там, где нужно собрать много однотипной информации. Он отвечает за скачивание содержимого; поиск адресов — задача краулера, а извлечение конкретных полей — парсера, и в реальных инструментах эти роли обычно совмещены.

Собранные данные почти всегда требуют проверки и очистки. А главное — сбор чужих данных ограничен законом и правилами сайтов: robots.txt, условиями использования, защитой персональных данных и авторских прав. Технически простой граббер быстро превращается в проблему, если игнорировать эти рамки.

Где применить на практике

Освойте тему на практике

Чтобы написать собственный граббер, нужна база Python: работа с HTTP-запросами, обработка текста, структуры данных, установка библиотек. С этого фундамента дальше легко перейти к requests, BeautifulSoup и Scrapy. Освоить основы с нуля и на практике помогает базовый курс Python-разработки в Otus — от синтаксиса до первых работающих скриптов.

Освойте тему на практике

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

Смежные темы: сетевые протоколы и HTTP, работа с XML, сбор данных через погодный API.

FAQ

Граббер — это легально?
Сам инструмент законен. Незаконным сбор делают конкретные действия: обход прямого запрета в условиях сайта, сбор персональных данных без основания, копирование защищенного авторским правом контента. Открытые обезличенные данные при соблюдении robots.txt и разумной нагрузки собирать обычно допустимо, но спорные случаи стоит проверять с юристом.

Чем граббер отличается от парсера простыми словами?
Граббер отвечает на вопрос «скачать страницу целиком», парсер — «достать из скачанного конкретные поля». Граббер приносит сырье, парсер превращает его в структурированную таблицу. В большинстве библиотек обе роли выполняет один и тот же код.

Почему граббер не видит данные, которые есть на странице в браузере?
Скорее всего, сайт подгружает эти данные через JavaScript уже после загрузки HTML. Обычный HTTP-запрос получает только исходный «каркас» без них. В таких случаях используют Selenium или Playwright — они управляют настоящим браузером и дожидаются, пока скрипты отрисуют контент.

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)