Cianparser - это библиотека Python 3 (версии 3.8 и выше) для парсинга сайта Циан. С его помощью можно получить достаточно подробные и структурированные данные по краткосрочной и долгосрочной аренде, продаже квартир, домов, танхаусов итд.
pip install cianparser
import cianparser
data = cianparser.parse(
deal_type="rent_long",
accommodation_type="flat",
location="Москва",
rooms=(2, 3),
start_page=1,
end_page=2,
is_saving_csv=True,
)
print(data[0])
Preparing to collect information from pages..
The absolute path to the file:
/Users/macbook/some_project/cian_parsing_result_rent_long_1_2_moskva_04_Feb_2023_06_58_21_765479.csv
The page from which the collection of information begins:
https://cian.ru/cat.php?engine_version=2&p=1®ion=1&offer_type=flat&deal_type=rent&room2=1&room3=1&with_neighbors=0&type=4
Collecting information from pages with list of announcements
1 | 1 page with list: [=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>] 100% | Count of parsed: 28. Progress ratio 50 %. Average price: 204 642 rub
2 | 2 page with list: [=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>] 100% | Count of parsed: 56. Progress ratio 100 %. Average price: 236 426 rub
{ 'accommodation_type': 'flat',
'deal_type': 'rent',
'city': 'Москва',
'district': 'Замоскворечье',
'underground': 'Новокузнецкая',
'street': 'Космодамианская набережная',
'house_number': 25,
'floor': 5,
'floors_count': 12,
'total_meters': 85.0,
'living_meters': 55.0,
'kitchen_meters': 11.0,
'rooms_count': 3,
'year_of_construction': '1954',
'price_per_month': 93000,
'price_per_m2': 1094,
'commissions': 50,
'author': 'Apple Real Estate',
'author_type': 'real_estate_agent',
'phone': '+79057145354',
'link': 'https://www.cian.ru/rent/flat/282487326/',
}
The collection of information from the pages with list of announcements is completed
Total number of parced announcements: 56. Average price per month: 236 426 rub
Функция parse имеет следующий аргументы:
- deal_type - тип объявления, к примеру, долгосрочная, краткосрочная аренда, продажа ("rent_long", "rent_short", "sale")
- accommodation_type - вид жилья, к примеру, квартира, комната, дом, часть дома, таунхаус ("flat", "room", "house", "house-part", "townhouse")
- location - локация объявления, к примеру, Казань (для просмотра доступных мест используйте cianparser.list_cities())
- rooms - количество комнат, к примеру, 1, (1,3, "studio"), "studio, "all"; по умолчанию любое ("all")
- start_page - страница, с которого начинается сбор данных, по умолчанию, 1
- end_page - страница, с которого заканчивается сбор данных, по умолчанию, 100
- is_saving_csv - необходимо ли сохранение собираемых данных (в реальном времени в процессе сбора данных) или нет, по умолчанию False
- is_latin - необходимо ли преобразывание любой встрещающейся кириллицы в латиницу, по умолчанию False
- is_express_mode - необходимо ли ускорение (в 5-10 раз) сбор данных (но без трех полей, см примечание), по умолчанию True
- additional_settings - дополнительные фильтры поиска (см. ниже в Дополнительные фильтры поиска), по умолчанию None
- proxies - прокси (см раздел Cloudflare, CloudScraper, Proxy), по умолчанию None
Если имеется желание собрать данные со всех страниц, то можно пропустить аргументы start_page и end_page. В проекте предусмотрен функционал корректного завершения в случае окончания страниц. По данному моменту, следует изучить раздел Ограничения
В настоящее время функционал доступен только по продажам (sale) и долгосрочном арендам (rent_long) квартир и студий (flat).
Пример:
additional_settings = {
"is_by_homeowner": True,
"min_price": 1000000,
"max_price": 10000000,
"have_balconies": True,
"have_loggia": True,
"min_house_year": 1990,
"max_house_year": 2023,
"min_floor": 3,
"max_floor": 4,
"min_total_floor": 5,
"max_total_floor": 10,
"house_material_type": 1,
"metro": "Московский",
"metro_station": "ВДНХ",
"metro_foot_minute": 45,
"sort_by": "price_from_min_to_max",
}
- is_by_homeowner - объявления, созданных только собственниками
- min_price - цена от
- max_price - цена до
- have_balconies - наличие балкона
- have_loggia - наличия лоджи
- min_house_year - год постройки дома от
- max_house_year - год постройки дома до
- min_floor - этаж от
- max_floor - этаж до
- min_total_floor - этажей в доме от
- max_total_floor - этажей в доме до
- house_material_type - тип дома
- metro - название метрополитена
- metro_station - станция метро (доступно при условии, что задано metro)
- metro_foot_minute - сколько минут до метро пешком (доступно при заданном параметре metro_station)
- sort_by - сортировка объявлений
Для house_material_type возможны следующие из значений
- 1 - киричный
- 2 - монолитный
- 3 - панельный
- 4 - блочный
- 5 - деревянный
- 6 - сталинский
- 7 - щитовой
- 8 - кирпично-монолитный
Возможные значения полей metro и metro_station можно посмотреть cianparser.list_metro_stations().keys() и cianparser.list_metro_stations()[metro] соотвественно
Поле sort_by может иметь следующие возможные значения:
- "price_from_min_to_max" - сортировка по цене (сначала дешевле)
- "price_from_max_to_min" - сортировка по цене (сначала дороже)
- "total_meters_from_max_to_min" - сортировка по общей площади (сначала больше)
- "creation_data_from_newer_to_older" - сортировка по дате добавления (сначала новые)
- "creation_data_from_older_to_newer" - сортировка по дате добавления (сначала старые)
- district - район
- underground - метро
- street - улица
- house_number - номер дома
- floor - этаж
- floors_count - общее количество этажей
- total_meters - общая площадь
- living_meters - жилая площади
- kitchen_meters - площадь кухни
- rooms_count - количество комнат
- year_construction - год постройки здания
- house_material_type - тип дома (киричный/монолитный/панельный итд)
- heating_type - тип отопления
- price_per_month - стоимость в месяц
- price_per_m2 - стоимость на квадратный метр
- commissions - комиссия, взымаемая при заселении
- author - автор объявления
- author_type - тип автора
- phone - номер телефона в объявлении
- link - ссылка на объявление
Возможные значения поля author_type:
- real_estate_agent - агентство недвижимости
- homeowner - собственник
- realtor - риелтор
- official_representative - ук оф.представитель
- representative_developer - представитель застройщика
- developer - застройщик
- unknown - без указанного типа
Признаки аналогичны вышеописанным, кроме отсутствия полей price_per_month и commissions.
При этом появляются новые:
- price - стоимость недвижимости
- residential_complex - название жилого комплекса
- object_type - тип жилья (вторичка/новостройка)
- finish_type - отделка
Имеется возможность сохранения собираемых данных в режиме реального времени. Для этого необходимо подставить в аргументе is_saving_csv значение True.
Пример получаемого файла:
cian_parsing_result_rent_long_1_2_moskva_04_Feb_2023_06_58_21_765479.csv
author | author_type | link | city | deal_type | accommodation_type | floor | floors_count | rooms_count | total_meters | price_per_month | price_per_m2 | commissions | year_of_construction | living_meters | kitchen_meters | phone | district | street | underground |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Intermark Real Estate | real_estate_agent | https://www.cian.ru/rent/flat/278903117/ | Москва | rent | flat | 4 | 6 | 3 | 50.0 | 180000 | 3600 | 0 | 1911 | 32.0 | 8.0 | +79676513428 | Пресненский | Малый Предтеченский переулок | Краснопресненская |
Capital Mars | real_estate_agent | https://www.cian.ru/rent/flat/282506328/ | Москва | rent | flat | 5 | 9 | 2 | 89.0 | 180000 | 2022 | 0 | 2006 | 53.0 | 15.0 | +79660619653 | Хамовники | 3-я Фрунзенская | Спортивная |
MERSI | real_estate_agent | https://www.cian.ru/rent/flat/281562376/ | Москва | rent | flat | 8 | 16 | 2 | 80.0 | 200000 | 2500 | 0 | 2012 | -1 | -1 | +79652455850 | Замоскворечье | Мытная | Октябрьская |
Для обхода блокировки в проекте задействован CloudScraper (библиотека cloudscraper), который позволяет успешно обходить защиту Cloudflare.
Вместе с тем, это не гарантирует отсутствие возможности появления у некоторых пользователей теста CAPTCHA при долговременном непрерывном использовании.
Поэтому была предоставлена возможность проставлять прокси, используя аргумент proxies (список прокси протокола HTTP)
Пример:
proxies = [
'85.26.146.169:80',
'178.140.177.145:8889',
'95.66.138.21:8880',
'93.123.226.23:81',
'46.47.197.210:3128',
'213.184.153.66:8080',
'62.33.207.201:3128',
]
В процессе запуска утилита проходится по всем из них, пытаясь определить подходящий, то есть тот, который может, во первых, делать запросы, во вторых, не иметь тест CAPTCHA
Пример лога, в котором представлено все три возможных кейса
The process of checking the proxies... Search an available one among them...
1 | proxy 46.47.197.210:3128: unavailable.. trying another
2 | proxy 213.184.153.66:8080: there is captcha.. trying another
3 | proxy 95.66.138.21:8880: available.. stop searching
Сайт выдает списки с объявлениями лишь до 54 странцы включительно. Это примерно 28 * 54 = 1512 объявлений. Поэтому, если имеется желание собрать как можно больше данных, то следует использовать более конкретные запросы (по количеству комнат).
К примеру, вместо того, чтобы при использовании указывать rooms=(1, 2), стоит два раза отдельно собирать данные с параметрами rooms=1 и rooms=2 соответственно.
Таким образом, максимальная разница может составить 1 к 6 (студия, 1, 2, 3, 4, 5 комнатные квартиры), то есть 1512 к 9072.
-
В некоторых объявлениях отсутсвуют данные по некоторым признакам (год постройки, жилые кв метры, кв метры кухни итп). В этом случае проставляется значение -1 либо пустая строка для числового и строкового типа поля соответственно.
-
Для отсутствия блокировки по IP в данном проекте задана пауза (в размере 4-5 секунд) после сбора информации с каждой отдельной взятой страницы.
-
Не рекомендутся производить несколько процессов сбора данных параллельно (одновременно) на одной машине (см. пункт 2).
-
Имеется флаг is_express_mode, при помощи которого можно существенно (в 5-10 раз) ускорить сбор данных благодаря отсутствию необходимости заходить на каждую страницу с предложением. Однако в таком случае не будут собираться данные о площади кухни, годе постройки здания, типа дома, типа отделки, типа отопления, типа жилья и номере телефона.
-
Данный парсер не будет работать в таком инструменте как Google Colaboratory. См. подробности
-
Если в проекте не имеется подходящего локации (неожидаемое значение аргумента location) или иными словами его нет в списке cianparser.list_cities(). То прошу сообщить, буду рад добавить.