Как парсить сайт Циан на Python

Как парсить циан на python

Как парсить циан на python

Циан предоставляет детализированные данные о недвижимости: стоимость объектов, параметры квартир, описание жилых комплексов, контактные данные агентов. Однако прямого 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

Для загрузки исходного 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

Извлечение данных о квартирах с помощью 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

Парсинг динамически подгружаемого контента с использованием 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 и т.д.

Алгоритм работы:

  1. Определить базовый URL поисковой выдачи (например, https://www.cian.ru/cat.php?deal_type=sale&engine_version=2&offer_type=flat&region=1).
  2. Сделать первый запрос и извлечь общее количество страниц из блока пагинации.
  3. Сформировать цикл по диапазону страниц и подставлять номер в параметр p.
  4. Для каждой страницы отправлять 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-запросы, можно дополнительно получить координаты на карте, дату публикации и другие технические детали, которые не всегда отображаются на основной странице.

Ссылка на основную публикацию