Парсинг на Python: когда хватит своего скрипта, а когда нужна подписка

Опубликовано 26 октября 2026

Парсинг на Python: четыре шага скрипта — robots.txt, запрос с паузой, разбор HTML, запись в CSV — и вопрос, кто будет чинить его, когда сайт поменяет вёрстку

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

Границы разбора. Код ниже рассчитан на открытые страницы, которые видит любой посетитель без входа. Мы не показываем обход защиты, капчи и авторизации, и сами таких задач не берём. Что такое парсинг в целом и чем он отличается от скрапинга, рассказано в статье «Что такое парсинг простыми словами».

Из чего состоит парсер на Python

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

Шаг Инструмент Когда нужен
Проверить robots.txt urllib.robotparser (встроен в Python) всегда, до первого запроса
Получить страницу requests статичные страницы и JSON
Разобрать HTML BeautifulSoup или lxml когда данные в разметке
Разобрать JSON модуль json или response.json() когда сайт отдаёт данные отдельным запросом
Открыть страницу браузером Playwright или Selenium когда данные появляются только после JavaScript
Сохранить модуль csv, pandas, база данных всегда

Браузер без окна заметно медленнее и тяжелее обычного запроса. Поэтому сначала стоит открыть в браузере инструменты разработчика и посмотреть, не приходят ли данные отдельным JSON-запросом: тогда хватает requests.

Схема парсера на Python: четыре шага — проверка robots.txt через urllib.robotparser, запрос requests с паузой, разбор HTML в BeautifulSoup и запись в CSV

Пример: вежливый парсер открытого каталога

Ниже скрипт, который собирает названия и цены из каталога. Адрес и CSS-классы условные: у каждого сайта они свои. Важны три вещи, без которых мы такой код не запускаем: проверка robots.txt, понятный User-Agent и пауза между запросами.

import csv
import time
import urllib.robotparser

import requests
from bs4 import BeautifulSoup

SITE = "https://example.ru"
AGENT = "price-research-bot/1.0 (+mailto:you@example.ru)"

robots = urllib.robotparser.RobotFileParser(SITE + "/robots.txt")
robots.read()
delay = robots.crawl_delay(AGENT) or 5  # секунд между запросами

rows = []
for page in range(1, 6):
    url = f"{SITE}/catalog/?page={page}"
    if not robots.can_fetch(AGENT, url):
        print("Закрыто в robots.txt:", url)
        break
    r = requests.get(url, headers={"User-Agent": AGENT}, timeout=30)
    if r.status_code in (429, 503):  # сайт просит притормозить
        time.sleep(delay * 10)
        continue
    r.raise_for_status()
    soup = BeautifulSoup(r.text, "html.parser")
    for card in soup.select(".product-card"):
        rows.append({
            "name": card.select_one(".title").get_text(strip=True),
            "price": card.select_one(".price").get_text(strip=True),
            "url": url,
        })
    time.sleep(delay)

with open("prices.csv", "w", newline="", encoding="utf-8") as f:
    w = csv.DictWriter(f, fieldnames=["name", "price", "url"])
    w.writeheader()
    w.writerows(rows)

Что здесь стоит пояснить:

  • RobotFileParser читает правила сайта, can_fetch отвечает, разрешён ли адрес для вашего User-Agent, crawl_delay возвращает задержку, если владелец её указал. Всё это есть в стандартной библиотеке, ставить ничего не нужно.
  • Стандарт robots.txt (RFC 9309) прямо говорит, что эти правила не являются защитой доступа. Это просьба владельца, и выполнять её разумно: агрессивный сбор быстрее всего приводит к блокировке.
  • Пять секунд по умолчанию — наше правило для небольших сайтов, закон такой цифры не задаёт. Ответы 429 и 503 означают, что сайт не справляется или ограничивает частоту.
  • В URL записываем адрес, откуда взята строка. Без него через месяц не проверить, откуда цифра.

Если сайт отдаёт JSON

Многие каталоги подгружают товары отдельным запросом. В браузере это видно на вкладке «Сеть» в инструментах разработчика. Тогда разбор HTML не нужен:

r = requests.get(SITE + "/api/catalog?page=1", headers={"User-Agent": AGENT}, timeout=30)
for item in r.json()["items"]:
    print(item["name"], item["price"])

Такой запрос тоже должен быть открытым: без токена из чужой учётной записи и без подделки ключей. Если у сайта есть официальный API, лучше начать с него. Когда что выбрать, мы разбирали в статье «Парсинг или API: что выбрать».

Что ломается после первого запуска

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

  1. Вёрстка меняется. Класс .price переименовали, и скрипт тихо собирает пустые строки. Нужна проверка: если доля пустых полей выросла, сбор должен остановиться и сообщить.
  2. Данные начинает грузить JavaScript. Вчера цена была в HTML, сегодня её подставляет скрипт, и requests её больше не видит.
  3. Цены в разных форматах. «1 290 ₽», «1290 руб.», «от 1 290». Чистка часто занимает больше времени, чем сам сбор.
  4. Нужна история. Одна выгрузка отвечает на вопрос «сколько сейчас». Чтобы видеть динамику, нужен запуск по расписанию, база и сравнение с прошлым снимком.
  5. Сбой в неудобное время. Сервер перезагрузился, сайт отвечал медленно, место на диске кончилось. Кто-то должен заметить и перезапустить.

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

Свой скрипт или подписка: как посчитать

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

Свой скрипт на Python или подписка на сбор данных: когда хватает скрипта, когда считать часы, когда выгоднее отдать сбор — по числу сайтов, частоте и цене сбоя

Ситуация Что обычно выгоднее
Разовая выгрузка с одного сайта, есть разработчик свой скрипт
Учебная задача, исследование, курсовая свой скрипт
1–2 простых сайта раз в неделю, сбой не критичен свой скрипт с проверкой пустых полей
5+ сайтов, ежедневно, данные идут в цены подписка или разработка с сопровождением
Нужна история за месяцы и оповещения подписка
Никто в команде не пишет на Python разовая выгрузка у подрядчика

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

Где проходят границы

Технически Python позволяет собрать почти всё. Юридически и по нашим правилам — нет. Коротко о том, чего мы не делаем и чего не советуем:

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

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

Как с этим работаем мы

Мы в Datamill пишем сборщики на Python и держим их в работе: проверяем пустые поля, сравниваем с прошлым снимком, сообщаем, если источник изменился. Если вам нужен разовый файл, это парсинг сайтов на заказ от 5 000 ₽. Если нужно следить за ценами каждый день, это мониторинг цен конкурентов от 8 000 ₽ в месяц. Если хотите писать сами, код выше — нормальная отправная точка.

Частые вопросы

Какие библиотеки Python нужны для парсинга?

Для статичных страниц обычно хватает requests (запросы) и BeautifulSoup или lxml (разбор HTML). Если сайт отдаёт данные в JSON, достаточно requests и встроенного модуля json. Для страниц, которые собирает JavaScript, нужен браузер без окна, например Playwright или Selenium. Для robots.txt есть встроенный модуль urllib.robotparser.

Обязательно ли соблюдать robots.txt?

Это просьба владельца сайта, защитой доступа по RFC 9309 он не считается. Мы её соблюдаем: закрытый раздел не собираем и ищем другой источник. О том, как это связано с законом, — в статье «Законен ли парсинг сайтов».

Какую паузу ставить между запросами?

Единой нормы нет. Если в robots.txt указан Crawl-delay, мы берём его. Если нет, начинаем с нескольких секунд между запросами к одному сайту и следим за ответами: коды 429 и 503 означают, что нужно замедлиться. Это наше правило, закон такой цифры не задаёт.

Можно ли парсить сайт под своим логином?

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

Сколько стоит, если не писать скрипт самим?

Разовая выгрузка у Datamill стоит от 5 000 ₽, мониторинг цен по подписке — от 8 000 ₽ в месяц. Точная цена зависит от числа сайтов и полей, её называем после разбора задачи. Факторы цены — в разделе «Сколько стоит парсинг сайта».

Источники

Проверено 26 октября 2026 года.

Читайте также

Что такое парсинг простыми словами

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

Облачный парсер, программа или заказ: как выбрать способ сбора данных

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

Парсинг или API: что выбрать для сбора данных

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

Оценка задачи

Опишите, что нужно собрать

Напишите в Telegram или на почту своими словами, можно голосовым. Ответим в течение рабочего дня. Перед оплатой покажем пробную выгрузку на 50–100 строк, чтобы вы увидели формат данных.

Что полезно указать в первом сообщении — на странице контактов.