Парсинг сайтов: что это, как работает и как защитить данные
Разбираем, что такое парсинг сайтов, какие данные собирают и какие ограничения действуют по закону. Сравниваем готовые сервисы, программы и код на Python, показываем практические примеры для товаров, цен и контактов и объясняем, как защитить сайт от автоматического сбора.
Содержание
Коротко: как собрать данные с сайта: пошаговый порядок
- Определите цель и перечень полей. Запишите, какие именно данные нужны (название, цена, артикул, телефон) и в каком виде вы хотите их получить — таблица, CSV, JSON или загрузка в CMS. Без точного списка полей сборщик быстро превращается в набор случайных данных.
- Разберите структуру сайта. Пройдите путь от категории до карточки, отметьте пагинацию, фильтры и варианты сортировки. Проверьте sitemap.xml — в нём часто перечислены адреса всех страниц каталога.
- Выясните, откуда берутся данные. Откройте исходный код страницы: если нужных значений там нет, включите панель разработчика, вкладку Network и найдите запрос, который возвращает JSON. От этого зависит выбор инструмента.
- Выберите инструмент и настройте сбор. Для разовой задачи хватит онлайн-сервиса или расширения браузера, для регулярной — скрипта на Python. Обязательно задайте задержки между запросами и корректный User-Agent.
- Проверьте результат и настройте обновление. Сверьте несколько позиций вручную, проверьте пропуски и дубли, убедитесь, что цены и единицы измерения приведены к одному формату. Если данные нужны регулярно, запустите сбор по расписанию с логированием ошибок.
Что такое парсинг сайтов
Парсинг сайтов (скрейпинг, извлечение данных) — это автоматический сбор информации со страниц по заданным правилам с сохранением результата в структурированном виде: в таблицу, файл CSV или JSON, базу данных или карточки товаров в CMS. Вместо того чтобы открывать десятки страниц вручную, программу один раз учат, где на странице лежат нужные значения, и дальше она повторяет это на всём каталоге.
Что обычно собирают:
- карточки товаров: название, артикул, бренд, цена, наличие, характеристики, ссылки на фотографии;
- цены, скидки и акции — чаще всего для мониторинга конкурентов;
- контакты компаний: телефоны, адреса, email, часы работы;
- вакансии, объявления, отзывы и рейтинги;
- тексты описаний, структуру каталога, перечни категорий.
Краулинг и парсинг — две части одного процесса. Краулер переходит по ссылкам и собирает список страниц, парсер извлекает из каждой страницы нужные поля. Каталоги на сотни тысяч позиций обрабатываются технически, но требуют продуманной схемы хранения и аккуратной работы с нагрузкой на чужой сервер.
Как устроен парсинг: этапы
- Цель и поля. Запишите, какие данные нужны и в каком формате вы хотите их получить. Это определяет всё остальное.
- Структура сайта. Пройдите путь от категории до карточки, отметьте пагинацию, фильтры, варианты сортировки. Отдельная задача — парсинг структуры сайта: карта разделов, их вложенность и число страниц в каждой категории. Она нужна, чтобы оценить объём работы. Список адресов часто уже есть в sitemap.xml.
- Источник данных. Откройте исходный код страницы. Если значения видны в HTML — достаточно обычного HTTP-запроса. Если нет — включите панель разработчика, вкладку Network (Fetch/XHR) и найдите запрос, который возвращает JSON: часто это внутренний API сайта, и работать с ним проще и легче для сервера.
- Схема данных. Определите типы полей, единицы измерения, правила нормализации цен и телефонов, поведение при отсутствии значения.
- Сборщик. Напишите или настройте инструмент: обход категорий, задержки между запросами, повторы при ошибках, сохранение результата.
- Проверка и обновление. Сверьте выборку вручную, найдите пропуски и дубли, настройте регулярный запуск.
Что спарсить не получится: посещаемость и источники трафика — эти сведения не отдаются в 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, иначе база быстро заполняется мусором.
Защита сайта от парсинга
Полностью запретить сбор данных с публичных страниц невозможно, но можно сделать его дорогим и невыгодным.
- Правила для роботов. Файл robots.txt задаёт запреты для добросовестных краулеров. Это не техническая защита, а декларация намерений.
- Ограничение частоты. На уровне nginx это делается директивой
limit_req, на уровне приложения — счётчиками по IP и сессии. Превышение отдаёт код 429 или 403. - Фильтрация по признакам. Проверка User-Agent, отсутствие Referer, подозрительно ровные интервалы между запросами, отсутствие загрузки статики — типичные сигнатуры ботов.
- Данные через API. Если цены и наличие отдаются отдельным запросом с токеном и ограничением по частоте, копировать их становится сложнее.
- Капча на формы и поиск. reCAPTCHA или hCaptcha на частых действиях отсекают автоматические обходы.
- Ловушки. Скрытые ссылки и поля, невидимые для человека, но доступные боту, помогают вычислить источник утечки.
- Анализ логов. Всплеск однотипных запросов с одного адреса или подсети — повод для временной блокировки.
Пример ограничения частоты в 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). Обход капчи и авторизации применять не следует — это прямо противоречит правилам сайта и создаёт юридические риски.
Сколько времени занимает парсинг каталога на сотни тысяч позиций?
Зависит от числа запросов в секунду, размера страниц и того, нужно ли скачивать изображения. При вежливом темпе в несколько запросов в секунду обход такого каталога занимает от нескольких часов до суток и более. На практике сбор разбивают на очереди по категориям, сохраняют промежуточные результаты и дособирают только изменившиеся страницы.
Как часто нужно обновлять спарсенные цены?
Для мониторинга конкурентов обычно достаточно одного обхода в сутки, для акционных товаров — нескольких раз в день. Слишком частый сбор повышает риск блокировки и создаёт нагрузку на чужой сервер. Практичный подход — хранить историю цен и сравнивать только те карточки, где изменилась дата обновления или наличие.
Материал подготовлен редакцией справочника Торох и носит справочный характер: интерфейсы программ и настройки серверов зависят от версии. Нашли неточность? Напишите нам.