Парсинг сайтов: что это, как работает и как защитить данные

Автор: Опубликовано: 9 минут чтения

Разбираем, что такое парсинг сайтов, какие данные собирают и какие ограничения действуют по закону. Сравниваем готовые сервисы, программы и код на Python, показываем практические примеры для товаров, цен и контактов и объясняем, как защитить сайт от автоматического сбора.

Парсинг сайтов: что это, как работает и как защитить данные
Содержание
  1. Что такое парсинг сайтов
  2. Как устроен парсинг: этапы
  3. Законно ли парсить сайты
  4. Способы парсинга: сервисы, программы и код
  5. Парсинг сайтов на Python: практический пример
  6. Парсинг товаров и цен
  7. Парсинг контактов и номеров телефонов
  8. Защита сайта от парсинга
  9. Сколько стоит парсинг и когда его заказывают

Коротко: как собрать данные с сайта: пошаговый порядок

  1. Определите цель и перечень полей. Запишите, какие именно данные нужны (название, цена, артикул, телефон) и в каком виде вы хотите их получить — таблица, CSV, JSON или загрузка в CMS. Без точного списка полей сборщик быстро превращается в набор случайных данных.
  2. Разберите структуру сайта. Пройдите путь от категории до карточки, отметьте пагинацию, фильтры и варианты сортировки. Проверьте sitemap.xml — в нём часто перечислены адреса всех страниц каталога.
  3. Выясните, откуда берутся данные. Откройте исходный код страницы: если нужных значений там нет, включите панель разработчика, вкладку Network и найдите запрос, который возвращает JSON. От этого зависит выбор инструмента.
  4. Выберите инструмент и настройте сбор. Для разовой задачи хватит онлайн-сервиса или расширения браузера, для регулярной — скрипта на Python. Обязательно задайте задержки между запросами и корректный User-Agent.
  5. Проверьте результат и настройте обновление. Сверьте несколько позиций вручную, проверьте пропуски и дубли, убедитесь, что цены и единицы измерения приведены к одному формату. Если данные нужны регулярно, запустите сбор по расписанию с логированием ошибок.

Что такое парсинг сайтов

Парсинг сайтов (скрейпинг, извлечение данных) — это автоматический сбор информации со страниц по заданным правилам с сохранением результата в структурированном виде: в таблицу, файл CSV или JSON, базу данных или карточки товаров в CMS. Вместо того чтобы открывать десятки страниц вручную, программу один раз учат, где на странице лежат нужные значения, и дальше она повторяет это на всём каталоге.

Что обычно собирают:

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

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

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

  1. Цель и поля. Запишите, какие данные нужны и в каком формате вы хотите их получить. Это определяет всё остальное.
  2. Структура сайта. Пройдите путь от категории до карточки, отметьте пагинацию, фильтры, варианты сортировки. Отдельная задача — парсинг структуры сайта: карта разделов, их вложенность и число страниц в каждой категории. Она нужна, чтобы оценить объём работы. Список адресов часто уже есть в sitemap.xml.
  3. Источник данных. Откройте исходный код страницы. Если значения видны в HTML — достаточно обычного HTTP-запроса. Если нет — включите панель разработчика, вкладку Network (Fetch/XHR) и найдите запрос, который возвращает JSON: часто это внутренний API сайта, и работать с ним проще и легче для сервера.
  4. Схема данных. Определите типы полей, единицы измерения, правила нормализации цен и телефонов, поведение при отсутствии значения.
  5. Сборщик. Напишите или настройте инструмент: обход категорий, задержки между запросами, повторы при ошибках, сохранение результата.
  6. Проверка и обновление. Сверьте выборку вручную, найдите пропуски и дубли, настройте регулярный запуск.

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

Законно ли парсить сайты

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

Что учитывать Как это работает на практике
Правила сайта и robots.txt Не закон, но пользовательское соглашение и директива для роботов выражают волю владельца. Их игнорирование может нарушать договор и приводит к блокировкам
Права на базу данных Статья 1334 ГК РФ охраняет исключительное право изготовителя базы данных: извлечение существенной части содержимого без разрешения недопустимо
Персональные данные 152-ФЗ относит ФИО, телефон, email и адрес физлица к персональным данным; для обработки нужны законное основание и согласие
Реклама Статья 18 ФЗ «О рекламе»: звонки и письма рекламного характера только с согласия адресата. Сама по себе собранная база права на рассылку не даёт
Технические средства защиты Обход авторизации, платного доступа, капчи может квалифицироваться как неправомерный доступ к информации

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

Способы парсинга: сервисы, программы и код

Способ Когда подходит Плюсы Минусы
Онлайн-сервисы (Octoparse, ParseHub, Apify, Zyte) Разовая или регулярная задача без разработки Визуальные селекторы, расписание, прокси, выгрузка в таблицу Подписка, лимиты, данные уходят стороннему сервису
Расширения и таблицы (Data Miner, Web Scraper, IMPORTXML в Google Таблицах) Небольшие объёмы, быстрая проверка гипотезы Работает в браузере, ничего не нужно устанавливать Плохо масштабируется, ломается на сложной вёрстке
Готовые программы (Scrapy-проекты, десктопные сборщики) Повторяющиеся задачи на одном сайте Скорость, локальное хранение Требует настройки и обновления при смене вёрстки
Свой код на Python, Node.js, PHP Большие объёмы, нестандартная логика Полный контроль, интеграция с базой и CMS Нужен разработчик

Готовые сервисы и программы

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

Python и другие языки

Классический набор: requests для загрузки страниц, BeautifulSoup или lxml для разбора HTML, pandas для таблиц. Для больших проектов берут Scrapy — он умеет очереди, паузы, повторы и параллельные запросы. Для сайтов, которые собираются скриптами, нужен браузерный движок: Playwright или Selenium.

Нейросети

Языковые модели помогают написать CSS- или XPath-селектор, разобрать неструктурированный текст описания и привести характеристики к единому виду. Но полноценный сборщик они не заменяют: результат нужно проверять, а массовая обработка страниц через модель дорога и нестабильна.

Парсинг сайтов на Python: практический пример

Минимальный сборщик каталога выглядит так:

import requests
from bs4 import BeautifulSoup

url = "https://example.com/catalog"
headers = {"User-Agent": "Mozilla/5.0 (compatible; DataCollector/1.0)"}

resp = requests.get(url, headers=headers, timeout=20)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")

for card in soup.select(".product-card"):
    title = card.select_one(".product-card__title")
    price = card.select_one(".product-card__price")
    link = card.select_one("a")
    print({
        "name": title.get_text(strip=True) if title else None,
        "price": price.get_text(strip=True) if price else None,
        "url": link.get("href") if link else None,
    })

Если данные подгружаются скриптом, тот же цикл выполняется в браузере:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()
    page.goto("https://example.com/catalog", wait_until="networkidle")
    page.wait_for_selector(".product-card")
    cards = page.query_selector_all(".product-card")
    for card in cards:
        print(card.inner_text())
    browser.close()

Для тренировки удобно использовать специально сделанные для этого площадки — например, books.toscrape.com и quotes.toscrape.com: там нет защиты, а вёрстка простая.

Основные правила аккуратного сборщика:

  • пауза между запросами (0,5–2 секунды) и ограничение параллельных соединений;
  • повтор запроса при ошибке 5xx и остановка при 403 вместо штурма сервера;
  • понятный User-Agent с контактом;
  • сохранение промежуточных результатов, чтобы обход можно было продолжить;
  • логирование адресов, которые не удалось разобрать.

Парсинг товаров и цен

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

Что усложняет работу:

  • Варианты товара. Один товар может иметь размеры, цвета и комплектации со своими артикулами и ценами — их нужно различать.
  • Цена в разных видах. Старая и новая цена, цена «от», наценка за опцию, стоимость доставки — всё это разные поля.
  • Характеристики. Обычно таблица «ключ — значение», где у разных категорий разный набор ключей. Перед сбором стоит зафиксировать справочник атрибутов.
  • Изображения. Ссылки на фото собираются отдельно, файлы скачиваются с задержкой и проверкой размера.
  • Регион и валюта. Цены могут зависеть от выбранного города — это нужно учитывать при сравнении.

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

Парсинг контактов и номеров телефонов

Сбор телефонов и адресов с открытых страниц компаний — распространённая задача для отделов продаж. Технически это простой парсинг: находим блок с контактами, вытаскиваем номера по шаблону, приводим к формату +7, убираем дубли, определяем регион по коду.

Что важно помнить:

  • контакты организации в открытом доступе и персональные данные конкретного человека — не одно и то же; для вторых нужно основание по 152-ФЗ;
  • массовая рассылка или обзвон по собранной базе требует согласия адресата;
  • скрытые разделы, страницы после авторизации и данные из личных кабинетов собирать нельзя;
  • полезно сразу проверять валидность номеров и email, иначе база быстро заполняется мусором.

Защита сайта от парсинга

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

  1. Правила для роботов. Файл robots.txt задаёт запреты для добросовестных краулеров. Это не техническая защита, а декларация намерений.
  2. Ограничение частоты. На уровне nginx это делается директивой limit_req, на уровне приложения — счётчиками по IP и сессии. Превышение отдаёт код 429 или 403.
  3. Фильтрация по признакам. Проверка User-Agent, отсутствие Referer, подозрительно ровные интервалы между запросами, отсутствие загрузки статики — типичные сигнатуры ботов.
  4. Данные через API. Если цены и наличие отдаются отдельным запросом с токеном и ограничением по частоте, копировать их становится сложнее.
  5. Капча на формы и поиск. reCAPTCHA или hCaptcha на частых действиях отсекают автоматические обходы.
  6. Ловушки. Скрытые ссылки и поля, невидимые для человека, но доступные боту, помогают вычислить источник утечки.
  7. Анализ логов. Всплеск однотипных запросов с одного адреса или подсети — повод для временной блокировки.

Пример ограничения частоты в nginx:

limit_req_zone $binary_remote_addr zone=catalog:10m rate=5r/s;

server {
    location /catalog/ {
        limit_req zone=catalog burst=10 nodelay;
        limit_req_status 429;
    }
}

Отдельно важно не заблокировать поисковых роботов: ограничения для Googlebot и YandexBot проверяют по обратному DNS, иначе сайт рискует выпасть из индекса.

Сколько стоит парсинг и когда его заказывают

Стоимость зависит от объёма, сложности сайта (динамическая подгрузка, капча, защита), требований к регулярности и формата выгрузки. Разовые задачи на несколько тысяч страниц и постоянный мониторинг цен — принципиально разные по трудоёмкости проекты.

На фриланс-площадках и в агентствах цену обычно считают от числа позиций и количества источников, поэтому в задании стоит указать:

  • список сайтов и разделов;
  • перечень полей и требуемый формат (Excel, CSV, JSON, загрузка в CMS);
  • частоту обновления;
  • необходимость скачивать изображения;
  • требования к дедупликации и нормализации данных.

Когда парсинг не нужен: если требуется выбрать 10–20 позиций, быстрее сделать это вручную. Если у площадки есть официальный API или фид — берите их: это дешевле в поддержке и не создаёт конфликтов с владельцем сайта. Самостоятельный путь без кода — визуальный сервис; с кодом — Python и библиотеки из примеров выше.

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

Чем парсинг отличается от работы с API?

API — официальный канал, который владелец сайта открывает сам: он отдаёт данные в готовом виде по правилам и с ограничениями. Парсинг разбирает обычные страницы, которые предназначены для людей. Если у сайта есть API или выгрузка в формате XML/YML, начинать стоит с них: это быстрее, стабильнее и не создаёт рисков.

Законно ли парсить сайты конкурентов?

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

Можно ли парсить сайт без программирования?

Да. Визуальные сервисы вроде Octoparse, ParseHub или Apify позволяют указать элементы на странице мышью и выгрузить результат в таблицу. Простые задачи решаются расширениями браузера и функциями Google Таблиц IMPORTXML и IMPORTHTML. Ограничения — подписка, лимиты по объёму и сложность работы с сайтами, где данные подгружаются скриптами.

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

Сначала снизить частоту: увеличить паузы, уменьшить число параллельных соединений, поставить понятный User-Agent с контактом. Если данные отдаются только после выполнения JavaScript, нужен браузерный движок (Playwright, Selenium). Обход капчи и авторизации применять не следует — это прямо противоречит правилам сайта и создаёт юридические риски.

Сколько времени занимает парсинг каталога на сотни тысяч позиций?

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

Как часто нужно обновлять спарсенные цены?

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

Материал подготовлен редакцией справочника Торох и носит справочный характер: интерфейсы программ и настройки серверов зависят от версии. Нашли неточность? Напишите нам.

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

Другие разделы