Разработка · 6 мин чтения

Как спарсить сайт: порядок действий и типовые препятствия

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

С чего начать, если нужно спарсить сайт

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

Дальше смотрю robots.txt целевого сайта, он лежит по адресу вида site.ru/robots.txt и показывает, какие разделы владелец просит не индексировать и не обходить автоматическими средствами. Игнорировать эти указания не стоит, особенно если планируется регулярный сбор с одного и того же сайта, а не разовый запрос. Заодно проверяю, нет ли у сайта открытого API или выгрузки в XML/CSV, иногда нужные данные уже отдаются в удобном формате без парсинга HTML вообще.

Если среди собираемых данных есть контакты людей, email или телефоны, сразу закладываю, что хранить такую базу нужно на серверах в России, это требование 152-ФЗ, и «удобный» зарубежный сервис для таблиц тут не вариант.

Как устроен сайт: HTML или JavaScript-рендеринг

Открываю страницу, нажимаю Ctrl+U и смотрю исходный HTML. Если нужные данные, например цена товара или список отзывов, видны прямо в этом исходном коде, сайт отдаёт их сразу с сервера, и для парсинга хватит обычного HTTP-запроса.

Если в исходном коде вместо данных пустые блоки или плейсхолдеры, а цифры появляются только после загрузки страницы в браузере, значит контент подгружается через JavaScript. В этом случае открываю вкладку Network в инструментах разработчика, обновляю страницу и смотрю, какие запросы уходят к серверу. Часто данные приходят отдельным JSON-запросом к внутреннему API сайта, и проще обращаться напрямую к этому эндпоинту, чем эмулировать полноценный браузер. Это экономит время и снижает нагрузку на сайт, потому что один JSON-запрос легче десятка запросов с полной отрисовкой страницы.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Инструменты для парсинга сайта: от requests до Playwright

Под разные ситуации беру разные библиотеки Python, для парсинга это стандартный выбор из-за готовых инструментов разбора HTML и работы с браузером.

Инструмент Для чего подходит Порог входа
requests + BeautifulSoup Статичные страницы, простые каталоги, где данные видны в исходном HTML Низкий, пары функций хватает для старта
Scrapy Массовый сбор с сотен и тысяч страниц, встроенная очередь запросов и повторные попытки Средний, свой синтаксис пауков и настроек
Playwright или Selenium Страницы с JavaScript-рендерингом, бесконечной прокруткой, формами и кликами Средний, нужно понимать автоматизацию браузера

Для разовой выгрузки каталога из сотни товаров хватает requests и BeautifulSoup. Для регулярного мониторинга крупного маркетплейса удобнее Scrapy с его очередями и встроенной обработкой повторных запросов. Playwright беру, когда без полноценного браузера данные не получить, например если сайт подгружает карточки товаров при прокрутке страницы.

Пошаговый процесс: как спарсить сайт от запроса до сохранения данных

Здесь всего 5 шагов, но именно на них ловится большинство ошибок:

  1. Проверяю robots.txt и структуру сайта, фиксирую, какие страницы и поля нужны.
  2. Смотрю в DevTools, как страница получает данные, через серверный HTML или через отдельные JSON-запросы.
  3. Пишу скрипт на Python: запрос страницы, разбор HTML или JSON, извлечение нужных полей.
  4. Прогоняю скрипт на небольшой выборке страниц и сверяю данные вручную, чтобы не тащить мусор в таблицу.
  5. Настраиваю сохранение в файл или базу и, если сбор регулярный, запускаю по расписанию.

Простой пример на третьем шаге, разбор карточек товара на статичной странице:

import requests
from bs4 import BeautifulSoup

response = requests.get(
    "https://example.com/catalog",
    headers={"User-Agent": "Mozilla/5.0"},
    timeout=10,
)
response.raise_for_status()

soup = BeautifulSoup(response.text, "html.parser")
for item in soup.select(".product-card"):
    title = item.select_one(".product-title").get_text(strip=True)
    price = item.select_one(".product-price").get_text(strip=True)
    print(title, price)

Селекторы вроде .product-card условные, у каждого сайта своя вёрстка, и перед запуском их нужно посмотреть в DevTools конкретной страницы.

Типовые препятствия и как их проходить без нарушения правил

Пагинация с нестандартными параметрами. У части сайтов номер страницы передаётся не через ?page=2, а через курсор или токен в запросе, тогда логику постраничного перехода приходится разбирать по запросам в Network, а не угадывать по шаблону URL.

Бесконечная прокрутка. Если товары подгружаются при скролле, ищу тот самый JSON-запрос, который уходит при прокрутке, и обращаюсь к нему напрямую вместо эмуляции скролла в браузере.

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

Изменение вёрстки сайта. Селекторы CSS ломаются при любом редизайне, поэтому в регулярных скриптах добавляю проверку, что нужные поля вообще найдены, и логирую случаи, когда парсер вернул пустоту.

Данные за авторизацией. Если нужные страницы доступны только в личном кабинете, я обсуждаю с заказчиком, на каком основании собираются эти данные, прежде чем писать скрипт.

Куда сохранять данные и как автоматизировать сбор

Для разовой выгрузки достаточно CSV или Excel, pandas сохраняет DataFrame в файл одной строкой. Для регулярного сбора с историей изменений цен удобнее база данных, SQLite для небольших объёмов или PostgreSQL, если данных много и с ними работает не только сам скрипт, но и отчёты или дашборд.

Если парсинг нужно гонять по расписанию, вариантов два. Первый, cron-задача на отдельном сервере, это отдельная арендованная машина, которую нужно настраивать, обновлять и оплачивать помесячно, обычный хостинг сайта для таких фоновых задач не подходит. Второй вариант, собрать цепочку в n8n: HTTP-запрос к сайту или к его API, обработка ответа, запись в таблицу и уведомление в Telegram при изменении цены, без необходимости писать и поддерживать отдельный python-сервис. Я такие сценарии собираю через автоматизацию в n8n, когда клиенту нужен не разовый скрипт, а рабочий процесс с уведомлениями и повторными попытками при сбоях.

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

Легально ли парсить чужой сайт

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

Что делать, если сайт часто блокирует запросы по IP

Сначала снижаю частоту запросов и добавляю паузы между обращениями, это решает проблему в большинстве случаев. Если объём сбора большой и с одного IP всё равно не хватает лимита, распределяю запросы во времени или через сервис ротации IP, не превышая разумную нагрузку на сайт.

Как спарсить сайт, если данные подгружаются через JavaScript

Сначала проверяю Network в DevTools, часто данные приходят отдельным JSON-запросом к API сайта, и его можно вызвать напрямую без браузера. Если такого запроса нет и рендеринг завязан на сложную логику в браузере, использую Playwright, он открывает страницу как настоящий браузер и отдаёт готовый HTML после выполнения скриптов.

Сколько стоит парсинг сайта под заказ

Парсинг и автоматизация на Python у меня стоит от 20 000 ₽, итоговая цена зависит от объёма страниц, сложности вёрстки и того, нужен ли регулярный запуск по расписанию с уведомлениями или разовая выгрузка в файл.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно