Парсер — это программа, которая разбирает входные данные по правилам их формата и достает из них нужные части в структурированном виде. В обиходе парсером чаще всего называют программу, которая автоматически собирает данные с сайтов: загружает страницы, находит в них цены, названия или ссылки и складывает в таблицу.
Содержание
Это два значения одного слова, и второе включает первое: сборщик данных с сайтов сначала скачивает страницу, а потом разбирает ее. Ниже — как устроена работа парсера по этапам, какие парсеры бывают, и где проходят границы: robots.txt, нагрузка на чужой сайт и закон.
Парсер, парсинг, краулер, скрапер: чем отличаются
Эти слова часто используют как синонимы, хотя они описывают разные вещи.
| Термин | Что означает | Пример |
|---|---|---|
| Парсинг (parsing) | Процесс разбора данных по правилам формата | Превратить текст JSON в словарь |
| Парсер (parser) | Программа или ее часть, которая выполняет разбор | json.loads в Python, HTML-парсер браузера |
| Краулер (crawler) | Программа, которая обходит страницы по ссылкам | Робот поисковой системы |
| Скрапер (scraper) | Программа, которая собирает данные с сайтов: обходит, загружает, разбирает, сохраняет | Сборщик цен конкурентов |
В строгом смысле парсер — только разбор. Парсер JSON, XML или исходного кода вообще не связан с интернетом: компилятор тоже начинает работу с парсера, который превращает текст программы в дерево. В русскоязычной практике «парсером сайтов» называют весь сборщик целиком, то есть скрапер. Дальше в статье «парсер» — именно сборщик данных с сайтов, если не сказано иное.
Как работает парсер: четыре этапа
Работа сборщика данных укладывается в цепочку «загрузка -> разбор -> извлечение -> сохранение». Это упрощенная схема: в реальных проектах добавляются очередь адресов, повторы при ошибках и планировщик, но четыре шага есть всегда.
- Загрузка. Парсер отправляет HTTP-запрос и получает ответ: HTML-страницу, JSON от API или файл. Если содержимое страницы дорисовывает JavaScript, простого запроса мало — нужен управляемый браузер, который выполнит скрипты.
- Разбор. Текст ответа превращается в структуру: HTML — в дерево элементов, JSON — в словари и списки. Без этого шага страница остается просто длинной строкой.
- Извлечение. Из структуры выбираются нужные узлы по правилам: CSS-селектор, выражение XPath, имя поля. Затем значения приводятся к типу: строка «1 290 ₽» становится числом 1290.
- Сохранение. Результат записывается в 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-парсер, который строит дерево.



