Парсер — это что такое простыми словами: как работает и какие бывают

Парсер - это что такое простыми словами: как работает и какие бывают Полезное

Парсер — это программа, которая разбирает входные данные по правилам их формата и достает из них нужные части в структурированном виде. В обиходе парсером чаще всего называют программу, которая автоматически собирает данные с сайтов: загружает страницы, находит в них цены, названия или ссылки и складывает в таблицу.

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

Парсер, парсинг, краулер, скрапер: чем отличаются

Эти слова часто используют как синонимы, хотя они описывают разные вещи.

Термин Что означает Пример
Парсинг (parsing) Процесс разбора данных по правилам формата Превратить текст JSON в словарь
Парсер (parser) Программа или ее часть, которая выполняет разбор json.loads в Python, HTML-парсер браузера
Краулер (crawler) Программа, которая обходит страницы по ссылкам Робот поисковой системы
Скрапер (scraper) Программа, которая собирает данные с сайтов: обходит, загружает, разбирает, сохраняет Сборщик цен конкурентов

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

Как работает парсер: четыре этапа

Работа сборщика данных укладывается в цепочку «загрузка -> разбор -> извлечение -> сохранение». Это упрощенная схема: в реальных проектах добавляются очередь адресов, повторы при ошибках и планировщик, но четыре шага есть всегда.

  1. Загрузка. Парсер отправляет HTTP-запрос и получает ответ: HTML-страницу, JSON от API или файл. Если содержимое страницы дорисовывает JavaScript, простого запроса мало — нужен управляемый браузер, который выполнит скрипты.
  2. Разбор. Текст ответа превращается в структуру: HTML — в дерево элементов, JSON — в словари и списки. Без этого шага страница остается просто длинной строкой.
  3. Извлечение. Из структуры выбираются нужные узлы по правилам: CSS-селектор, выражение XPath, имя поля. Затем значения приводятся к типу: строка «1 290 ₽» становится числом 1290.
  4. Сохранение. Результат записывается в CSV, JSON, таблицу или базу данных — туда, где с ним будут работать дальше.

Пример одной записи на каждом шаге: адрес каталога -> строка HTML с тегом <span class="price"> -> узел дерева с текстом «1 290 ₽» -> число 1290 в столбце price_rub.

Минимальный пример: все этапы на одной странице

Ниже не полноценный сборщик, а демонстрация этапов на стандартной библиотеке Python. Страница и файл правил лежат прямо в коде, в сеть пример не ходит. Проверено на Python 3.14.7, 30.09.2026.

import csv
import io
from html.parser import HTMLParser
from urllib.robotparser import RobotFileParser

ROBOTS = """\
User-agent: *
Disallow: /cart/
Crawl-delay: 2
"""

PAGE = """\
<html><body>
<h1>Корма для кошек</h1>
<div class="item"><span class="name">Корм сухой, 2 кг</span><span class="price">1 290 ₽</span></div>
<div class="item"><span class="name">Корм влажный, 85 г</span><span class="price">64 ₽</span></div>
<div class="item"><span class="name">Лакомство</span><span class="price">по запросу</span></div>
</body></html>
"""


class ItemParser(HTMLParser):
    """Разбор: идем по тегам и запоминаем текст нужных элементов."""

    def __init__(self):
        super().__init__()
        self.rows = []
        self.field = None

    def handle_starttag(self, tag, attrs):
        css_class = dict(attrs).get("class")
        if tag == "div" and css_class == "item":
            self.rows.append({"name": "", "price": ""})
        elif tag == "span" and css_class in ("name", "price") and self.rows:
            self.field = css_class

    def handle_data(self, data):
        if self.field:
            self.rows[-1][self.field] += data.strip()

    def handle_endtag(self, tag):
        if tag == "span":
            self.field = None


def to_rub(text):
    """Извлечение: из строки '1 290 ₽' делаем число 1290 или None."""
    digits = "".join(text.split()).removesuffix("₽")
    if digits.isascii() and digits.isdecimal():
        return int(digits)
    return None


# 0. Правила сайта: что разрешено и с какой паузой
rules = RobotFileParser()
rules.parse(ROBOTS.splitlines())
for url in ("https://example.com/catalog/cats/", "https://example.com/cart/"):
    print(url, "->", rules.can_fetch("demo-bot", url))
print("пауза, с:", rules.crawl_delay("demo-bot"))

# 1. Загрузка: в примере страница уже лежит в PAGE, сеть не нужна
# 2. Разбор
parser = ItemParser()
parser.feed(PAGE)
parser.close()

# 3. Извлечение и проверка
good, bad = [], []
for row in parser.rows:
    price = to_rub(row["price"])
    if row["name"] and price is not None:
        good.append({"name": row["name"], "price_rub": price})
    else:
        bad.append(row)

# 4. Сохранение: CSV (здесь - в строку, чтобы не создавать файлов)
out = io.StringIO()
writer = csv.DictWriter(out, fieldnames=["name", "price_rub"], lineterminator="\n")
writer.writeheader()
writer.writerows(good)
print(out.getvalue(), end="")
print("не разобрано:", bad)

Вывод программы:

https://example.com/catalog/cats/ -> True
https://example.com/cart/ -> False
пауза, с: 2
name,price_rub
"Корм сухой, 2 кг",1290
"Корм влажный, 85 г",64
не разобрано: [{'name': 'Лакомство', 'price': 'по запросу'}]

Что здесь видно. Каталог обходить можно, корзину — нет, между запросами владелец сайта просит паузу в 2 секунды. Из трех товаров в таблицу попали два: у третьего вместо цены стоит текст «по запросу», и парсер не стал превращать его в ноль или пропускать молча, а отложил в список неразобранного.

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

Виды парсеров

Классификаций несколько, и полезнее выбирать по задаче, чем запоминать списки.

Что нужно Какой парсер подходит Когда этого мало
Прочитать файл или ответ API: JSON, XML, CSV Парсер формата из стандартной библиотеки языка Формат нестандартный — нужен свой разбор
Собрать данные с обычных HTML-страниц Скрипт: HTTP-клиент плюс HTML-парсер Данные подгружает JavaScript
Собрать данные со страниц, которые рисует JavaScript Управляемый браузер (Playwright, Selenium) Объемы большие: браузер медленнее и дороже простых запросов
Обойти тысячи страниц по расписанию Фреймворк для обхода (например, Scrapy) с очередью и повторами Сайт отдает те же данные через API или выгрузку — проще взять их
Разовая выгрузка без программирования Готовый сервис, расширение браузера, функция IMPORTXML в Google Таблицах Нужна сложная логика или регулярность

По назначению парсеры делят на сборщики цен и ассортимента, SEO-парсеры (заголовки, метатеги, битые ссылки на собственном сайте), агрегаторы объявлений и новостей, сборщики данных для аналитики и обучения моделей. Механика у всех одна и та же — четыре этапа выше, различаются источники и правила извлечения.

Если у сайта есть официальный API или товарная выгрузка, начинать стоит с них. Это устойчивее к смене верстки, создает меньше нагрузки и обычно снимает вопрос о разрешении: условия использования API описаны явно.

Законность и ограничения

Сам по себе автоматический сбор открытых данных законом не запрещен, но законность зависит от трех вещей: какие данные собираются, как парсер получает доступ и что с данными делают потом. Перечень ниже не исчерпывающий и не заменяет консультацию юриста; нормы приведены для России.

Что собирается или делается Что нужно учитывать
Персональные данные: имена, телефоны, профили Закон 152-ФЗ. То, что данные видны всем, не дает права их обрабатывать: для данных, разрешенных к распространению, действует отдельное согласие с условиями (ст. 10.1). С 11 декабря 2024 года сбор и хранение компьютерной информации с персональными данными, полученной незаконным путем, уголовно наказуемы (ст. 272.1 УК РФ)
Копирование текстов, фотографий, описаний Авторское право (часть четвертая ГК РФ): публикация чужого контента у себя требует разрешения правообладателя
Выгрузка существенной части чужого каталога Право изготовителя базы данных, создание которой потребовало существенных затрат (п. 1 ст. 1334 ГК РФ)
Обход авторизации, капчи, технических блокировок Риск квалификации как неправомерного доступа к охраняемой законом компьютерной информации (ч. 1 ст. 272 УК РФ) и нарушение пользовательского соглашения сайта
Слишком частые запросы Сайт замедляется или падает; владелец вправе блокировать, а ущерб может стать основанием для претензий

Что такое robots.txt и чего он не делает

robots.txt — текстовый файл в корне сайта, в котором владелец сообщает роботам, какие разделы не нужно обходить. Формат описан в стандарте RFC 9309 (2022 год).

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

Директива Crawl-delay из примера в RFC 9309 не входит: одни роботы ее учитывают, другие нет. Для собственного парсера разумно соблюдать ее, если она указана.

Нагрузка: как не навредить сайту

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

  • пауза между запросами и небольшое число параллельных соединений;
  • честный User-Agent с названием робота и контактом;
  • реакция на ответы 429 (слишком много запросов) и 503: остановиться и подождать, учитывая заголовок Retry-After, если сервер его прислал;
  • кеширование: не скачивать повторно то, что не менялось;
  • сбор только тех страниц и полей, которые действительно нужны.

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

Выводы

  • Парсер в строгом смысле — программа разбора данных по правилам формата; в обиходе так называют сборщик данных с сайтов, который точнее называть скрапером.
  • Работа сборщика состоит из четырех этапов: загрузка, разбор, извлечение, сохранение. Надежный парсер еще и фиксирует то, что разобрать не удалось.
  • Вид парсера выбирают по источнику: файл или API, обычный HTML, страницы на JavaScript, массовый обход. Официальный API или выгрузка предпочтительнее разбора страниц.
  • Законность определяется не инструментом, а данными, способом доступа и дальнейшим использованием: персональные данные, чужой контент и обход защиты — зоны риска.
  • robots.txt — просьба владельца сайта, а не техническая защита; ее соблюдение и умеренная частота запросов — базовая вежливость парсера.

Где применяется / связь с практикой

Парсеры используют аналитики и маркетологи для мониторинга цен, SEO-специалисты — для аудита собственных сайтов, разработчики — для интеграций там, где нет API, дата-инженеры — для сбора наборов данных. Небольшой сборщик данных — частый первый самостоятельный проект на Python: в нем встречаются HTTP-запросы, работа со строками и структурами данных, файлы и обработка ошибок.

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

Эти основы последовательно разбираются на курсе «Python-разработчик. Базовый уровень». Посмотреть формат занятий до записи можно на открытых уроках Otus.

Смежные темы: парсинг в PHP для новичков.

FAQ

Кто такой парсер — это программа или человек?
Программа. В разговорной речи так иногда называют и специалиста, который пишет сборщики данных, но отдельной профессии с таким названием нет: этим занимаются разработчики, аналитики и дата-инженеры.

Что значит «автоматизированный парсер»?
Парсер, который запускается без участия человека: по расписанию или по событию, сам обходит список адресов и сохраняет результат. Парсер автоматизирован по своей сути, слово лишь подчеркивает регулярный запуск.

Можно ли разбирать HTML регулярными выражениями?
Для одного значения в предсказуемом фрагменте — иногда можно. Для страницы целиком — нет: HTML допускает вложенность, необязательные закрывающие теги и разный порядок атрибутов, поэтому нужен HTML-парсер, который строит дерево.

OTUS Журнал
Распродажа ноябрьских курсов (поп-ап)
Бесплатные открытые уроки (поп-ап)