Парсер объявлений о продаже недвижимости с сайта Cian.ru с возможностью анализа и визуализации собранных данных.
Проект позволяет автоматически собирать детальную информацию об объявлениях о продаже квартир на Cian.ru и проводить их последующий анализ. Парсер обходит ограничения пагинации через разбиение на ценовые диапазоны и использует задержки между запросами для предотвращения блокировок.
- Основная информация: заголовок, цена, количество комнат
- Местоположение: адрес, координаты (широта/долгота)
- Транспортная доступность: ближайшие станции метро и время до них
- Характеристики квартиры: площадь, этаж, состояние и другие параметры
- Характеристики дома: год постройки, тип дома, материал стен
- Описание: полный текст объявления
- Python 3.10+
- pip
pip install -r requirements.txtВсе настройки находятся в файле config.py:
# Основные параметры поиска
DEAL_TYPE = "sale" # Тип сделки: "sale" (продажа) или "rent" (аренда)
ROOMS = 1 # Количество комнат
REGION = 1 # Регион (1 = Москва)
# Диапазоны цен для парсинга
LIMITS = tuple(range(10_000_000, 250_000_000 + 1, 1_000_000))
# Задержки между запросами (в секундах)
DELAY_BETWEEN_PAGES = (1, 3) # Между страницами списка
DELAY_BETWEEN_ADS = (1, 2) # Между объявлениями
# Файл для сохранения результатов
OUTPUT_DIRNAME = "trash"
OUTPUT_FILENAME = "test"python main.pyПарсер начнет собирать данные согласно настройкам в config.py и сохранит результаты в JSON-файл.
📁 Данные будут сохранены в файл: trash/test.json
Фильтры: мин. 10000000 макс. 11000000
Всего объявлений по заданным фильтрам: 245
https://www.cian.ru/cat.php?...
🔍 Загружаем страницу 1...
Найдено 28 объявлений
📄 [1] Парсим страницу объявления: https://www.cian.ru/sale/flat/...
В папке analyse/ находятся скрипты для анализа собранных данных:
import_json.py- импорт данных из JSONremove_dublicates.py- удаление дубликатовload_to_ch.py- загрузка данных в ClickHousehistogram.py- построение гистограмм распределения ценboxplot.py- боксплоты для анализа выбросовheatmap.py- тепловая карта объявлений на географической картеdistrict.py- анализ по районам
Примеры собранных данных и визуализаций доступны в папке examples/.
Помимо статических графиков, проект позволяет визуализировать собранные объявления на интерактивной карте. Цены агрегируются по H3-гексагонам, после чего карта отображается с помощью Folium/Leaflet.
Интерактивную версию можно открыть в браузере:
examples/visualizations/heatmap.html
Подробнее см. examples/README.md
cian_parser/
├── parsers/ # Модули парсинга
│ ├── fetcher.py # HTTP-клиент с повторными попытками
│ ├── list_parser.py # Парсинг страниц со списком объявлений
│ └── detail_parser.py # Парсинг детальных страниц объявлений
├── utils/ # Вспомогательные утилиты
│ ├── file_paths.py # Работа с путями к файлам
│ ├── json_writer.py # Запись данных в JSON
│ └── price_ranges.py # Генерация ценовых диапазонов
├── analyse/ # Скрипты анализа данных
├── config.py # Конфигурация парсера
├── main.py # Точка входа
└── requirements.txt # Зависимости проекта
- Разбиение на ценовые диапазоны: Cian ограничивает пагинацию, поэтому парсер разбивает поиск на множество узких ценовых диапазонов
- Ротация User-Agent: используется пул различных User-Agent для имитации разных браузеров
- Задержки между запросами: случайные паузы предотвращают блокировку по частоте запросов
- Повторные попытки: автоматический retry при сетевых ошибках и HTTP 429
- Обработка ошибок на каждом этапе
- Логирование прогресса парсинга
- Сохранение данных в процессе работы (не требуется ждать завершения всего парсинга)
- Соблюдайте robots.txt и условия использования сайта Cian.ru
- Не злоупотребляйте частотой запросов - используйте разумные задержки
- Используйте данные ответственно - только для личных, образовательных или исследовательских целей
- Структура HTML-страниц может измениться, что потребует обновления селекторов
MIT License - см. файл LICENSE
Если вы нашли баг или хотите предложить улучшение:
- Создайте Issue с описанием проблемы
- Сделайте Fork репозитория
- Создайте ветку для ваших изменений
- Отправьте Pull Request
Если у вас есть вопросы или предложения, создайте Issue в репозитории.

