
Циан предоставляет детализированные данные о недвижимости: стоимость объектов, параметры квартир, описание жилых комплексов, контактные данные агентов. Однако прямого API для полноценного доступа к этим данным сервис не предлагает, поэтому извлечение информации выполняется через парсинг HTML-страниц или сетевых запросов.
При работе с Цианом важно учитывать динамическую подгрузку данных. Значительная часть информации отдается в формате JSON внутри сетевых запросов к внутренним API, а не сразу в исходном HTML. Это означает, что простой парсинг через BeautifulSoup не всегда достаточен: потребуется анализировать запросы в браузерных инструментах разработчика и использовать requests или httpx для их воспроизведения.
Чтобы избежать блокировок, необходимо имитировать поведение реального пользователя: задавать headers с актуальными User-Agent, работать с cookies, а при большом объеме запросов подключать прокси. Эти меры позволяют получать стабильный доступ к данным даже при регулярном запуске скрипта.
Базовый стек инструментов для задачи: requests для сетевых обращений, BeautifulSoup или lxml для разбора HTML, а также json для обработки API-ответов. При правильной конфигурации запросов можно собирать такие данные, как список объявлений с фильтрами по цене и району, полные характеристики объектов, а также динамически обновляемые параметры, например, изменения стоимости.
Настройка окружения и выбор библиотек для парсинга Циан

Для стабильной работы рекомендуется использовать Python 3.10+, так как многие современные библиотеки для сетевых запросов и обработки HTML оптимизированы под новые версии. Создавайте отдельное виртуальное окружение через python -m venv venv, чтобы изолировать зависимости.
Для HTTP-запросов оптимально применять httpx или aiohttp, так как Циан активно использует динамическую подгрузку и асинхронный подход повышает скорость парсинга. Если требуется эмуляция браузера для работы с JavaScript-данными, лучше использовать Playwright, а не Selenium: он быстрее, поддерживает работу без графического интерфейса и меньше детектируется.
Для обработки HTML-структуры удобнее всего parsel или selectolax. В отличие от BeautifulSoup, они работают быстрее и позволяют строить XPath-запросы, что полезно при разборе сложных DOM-деревьев Циана. Для анализа JSON-ответов API используйте встроенный модуль json или библиотеку orjson для высокой скорости десериализации.
Рекомендуется также установить fake-useragent или заранее подготовленный список User-Agent заголовков, а для обхода банов применять httpx-socks или прокси-пулы. Логи запросов удобно собирать через loguru для отслеживания ошибок и статуса блокировок.
Получение HTML-кода страницы объявлений через requests

Для загрузки исходного HTML-кода страницы объявлений Циан удобно использовать библиотеку requests. Этот способ позволяет получать структуру документа для дальнейшего анализа и извлечения данных.
Минимальный пример запроса:
import requests
url = "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat®ion=1"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/117.0 Safari/537.36"
}
response = requests.get(url, headers=headers)
html_code = response.text
print(html_code[:1000])
Рекомендации для стабильной работы:
- Всегда указывайте
User-Agent, так как запросы без заголовков часто блокируются. - Используйте параметр
timeout, чтобы избежать зависания при сетевых сбоях. - Проверяйте
response.status_codeи обрабатывайте коды ошибок 403 и 429. - Добавляйте паузы между запросами с помощью
time.sleep(), чтобы снизить риск временной блокировки.
После получения HTML-кода его можно передать в парсер, например, BeautifulSoup или lxml, для извлечения нужных элементов.
Извлечение данных о квартирах с помощью BeautifulSoup

После загрузки HTML-кода страницы с помощью библиотеки requests следующий шаг – разбор структуры документа. Для этого используется BeautifulSoup, который позволяет находить конкретные элементы по тегам, классам или атрибутам.
Например, для получения списка объявлений удобно искать контейнеры карточек по классу, в котором содержатся данные о квартире. Внутри каждой карточки можно извлечь заголовок (div с названием), цену (span или div с соответствующим атрибутом), адрес и метраж. Важно учитывать, что названия классов могут изменяться, поэтому стоит проверять структуру кода страницы через инструменты разработчика.
Чтобы извлечь цену, можно использовать выражение:
soup.find("span", {"data-mark": "MainPrice"}). Для площади и количества комнат подойдут элементы с data-mark вроде "OfferTitle". Адрес обычно расположен в блоке с атрибутом data-name="GeoLabel".
Рекомендуется сразу приводить текст к числовому виду: удалять пробелы, символы валюты и единицы измерения. Это упростит дальнейшую обработку и сохранение данных.
Чтобы ускорить работу с большим количеством объявлений, вместо find лучше использовать find_all для выборки всех карточек, а затем проходить по каждой из них циклом. Такой подход позволяет структурировать данные в словарь или DataFrame и легко сохранять их в CSV или базу данных.
Парсинг динамически подгружаемого контента с использованием Selenium

Сайт Циан подгружает объявления через JavaScript, поэтому стандартные библиотеки вроде requests не видят итоговый HTML. Для получения реального DOM применяется Selenium, который эмулирует поведение браузера и дожидается полной загрузки элементов.
Минимальный рабочий пример на Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
service = Service("chromedriver.exe")
driver = webdriver.Chrome(service=service)
driver.get("https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat®ion=1")
# Явное ожидание загрузки блока с объявлениями
wait = WebDriverWait(driver, 10)
ads = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "_93444fe79c")))
for ad in ads:
title = ad.text
print(title)
driver.quit()
Ключевой момент – использование WebDriverWait и expected_conditions. Без этого Selenium может вернуть пустой список, так как элементы подгружаются асинхронно. Конкретный селектор (например, _93444fe79c) нужно брать из актуального HTML, так как Циан периодически меняет классы.
Для ускорения рекомендуется запускать браузер в режиме --headless, отключать лишние расширения и задавать окно меньшего размера. Это уменьшает потребление ресурсов и снижает вероятность блокировки.
Если требуется обработка пагинации, можно находить кнопку «Следующая страница» через By.XPATH и вызывать click(), дожидаясь появления новых карточек. Такой подход позволяет собирать тысячи объявлений без потерь данных.
Обработка пагинации и сбор объявлений с нескольких страниц

На Циан каждая страница результатов содержит ограниченное число объявлений, поэтому необходимо учитывать параметр пагинации. В URL присутствует GET-параметр p, отвечающий за номер страницы: ?p=2, ?p=3 и т.д.
Алгоритм работы:
- Определить базовый URL поисковой выдачи (например,
https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat®ion=1). - Сделать первый запрос и извлечь общее количество страниц из блока пагинации.
- Сформировать цикл по диапазону страниц и подставлять номер в параметр
p. - Для каждой страницы отправлять HTTP-запрос и собирать ссылки на карточки.
При обходе необходимо учитывать:
- Использовать задержки между запросами (
time.sleep()) во избежание блокировок. - Проверять статус-код ответа и наличие капчи.
- Фильтровать дублирующиеся объявления по идентификатору
offer_id, который есть в HTML.
Пример кода на Python с использованием requests и BeautifulSoup:
import requests
from bs4 import BeautifulSoup
import time
base_url = "https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat®ion=1"
ads = []
for page in range(1, 6): # пример обхода первых 5 страниц
url = f"{base_url}&p={page}"
r = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(r.text, "html.parser")
for item in soup.select("article[data-name='CardComponent']"):
ad_id = item.get("data-id")
link = item.select_one("a").get("href")
ads.append((ad_id, link))
time.sleep(2)
Такой подход позволяет собирать все объявления из выдачи, избегая потерь информации при переключении страниц.
Сохранение полученных данных в CSV или базу данных
После успешного парсинга сайта Циан необходимо сохранить данные для дальнейшего анализа. Наиболее удобные форматы – CSV и реляционные базы данных, например SQLite или PostgreSQL.
Для сохранения в CSV используйте встроенный модуль csv. Пример сохранения списка словарей с информацией о квартирах:
import csv
data = [
{"адрес": "Москва, ул. Пушкина, 10", "цена": 12000000, "площадь": 55},
{"адрес": "Москва, ул. Лермонтова, 5", "цена": 9500000, "площадь": 48}
]
with open('cian_data.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=["адрес", "цена", "площадь"])
writer.writeheader()
writer.writerows(data)
CSV удобно использовать для экспорта в Excel, анализа в Pandas или передачи коллегам. При больших объемах данных предпочтительнее база данных.
Для SQLite достаточно встроенного модуля sqlite3:
import sqlite3
conn = sqlite3.connect('cian.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS apartments (
id INTEGER PRIMARY KEY,
address TEXT,
price INTEGER,
area REAL
)
''')
for item in data:
cursor.execute('''
INSERT INTO apartments (address, price, area) VALUES (?, ?, ?)
''', (item["адрес"], item["цена"], item["площадь"]))
conn.commit()
conn.close()
Для PostgreSQL или MySQL используйте библиотеки psycopg2 или mysql-connector-python соответственно. Важно применять пакетную вставку данных через executemany, чтобы ускорить обработку тысяч записей.
Табличное представление структуры базы данных:
| Поле | Тип | Описание |
|---|---|---|
| id | INTEGER PRIMARY KEY | Уникальный идентификатор записи |
| address | TEXT | Адрес объекта недвижимости |
| price | INTEGER | Цена квартиры в рублях |
| area | REAL | Площадь квартиры в квадратных метрах |
Рекомендация: храните оригинальные URL объявлений и дату парсинга для возможности обновления данных и отслеживания изменений цен.
Вопрос-ответ:
Можно ли получить данные о квартирах с Циана без авторизации?
Да, часть информации на сайте доступна публично, и её можно получить без входа в аккаунт. Обычно это объявления с базовыми данными: цена, площадь, адрес, тип недвижимости. Однако для некоторых разделов, например, просмотра подробных контактов владельцев или полного списка фотографий, требуется авторизация.
Какие библиотеки Python лучше использовать для получения данных с Циана?
Для парсинга HTML-страниц часто используют библиотеку BeautifulSoup совместно с requests для получения страниц. Если сайт использует динамическую подгрузку данных через JavaScript, помогает Selenium или Playwright, которые имитируют поведение браузера и позволяют получить содержимое после загрузки всех элементов. Также полезен модуль json для обработки данных в формате JSON, если сайт отдаёт информацию через API.
Как обходятся ограничения по количеству запросов к сайту Циан?
Сайт может ограничивать частоту запросов с одного IP, поэтому слишком быстрый парсинг может привести к временной блокировке. Для снижения риска используют задержки между запросами с помощью time.sleep(), случайные интервалы, а также прокси-серверы. Важно не перегружать сайт и следить за его правилами использования данных.
Можно ли получать данные о новых объявлениях в реальном времени?
Прямого доступа к обновлениям в реальном времени нет. Можно организовать периодический сбор данных через парсинг страниц или API-запросы с определённым интервалом, например, каждые несколько минут или часов. После получения данных можно сравнивать их с предыдущими результатами и определять новые объявления.
Какие данные обычно извлекают из объявлений Циана?
Из объявлений обычно собирают такие данные, как цена, адрес, площадь, количество комнат, этаж, тип недвижимости, описание объекта и ссылки на фотографии. Если использовать API или анализировать JSON-запросы, можно дополнительно получить координаты на карте, дату публикации и другие технические детали, которые не всегда отображаются на основной странице.
