Обновить

Получить выписку ЕГРН из Росреестра с помощью python, минуя api

Python

Не первое знакомство с порталом Росреестра


Любой юрист когда-либо обращался с запросом в Росреестр (Федеральная служба государственной регистрации, кадастра и картографии). Времена, когда для запроса надо было бежать в отделение Росреестра и подавать запрос на бумаге уходят в прошлое. Росреестр запустил несколько онлайн сервисов, которые можно использовать не выходя из дома. К этим сервисам относится и запрос выписки из Единого государственного реестра недвижимости. Официальный сайт для начала работы.

Всем, кто уже успел поработать с сайтом, известно, что для получения выписки из ЕГРН, в которой будет содержаться информация не только об общих характеристиках объекта, но и о правообладателе данного объекта, необходимо зайти в личный кабинет Росреестра.

Возможно, это удобный способ получения одной или нескольких выписок. Однако, что делать, если необходим пакет выписок ЕГРН? Допустим, вы работаете с недвижимостью или владеете рядом объектов, общее число которых более 10. По общему правилу получать выписку из ЕГРН надо не реже 1 раза в год, чтобы успеть вовремя отреагировать в юридической плоскости на нежелательные изменения в Росреестре, если они возникнут помимо вашей воли.


Можно вручную подавать запросы через личный кабинет, а можно использовать api Росреестра. Первый вариант крайне утомителен. Помимо того, что сам онлайн сервис Росреестра работает весьма неторопливо с постоянными зависаниями, так еще обычному пользователю предлагается при подаче каждого запроса вводить целый арсенал полей по объекту. Вот, например, запрос по земельному участку:


То есть, чтобы узнать сведения об объекте и получить по нему выписку, физ. лицу надо уже знать все характеристики объекта! И каждый раз при запросе сведений необходимо заполнять все поля. Что сказать, очень неудобно. Спасибо, что хотя бы предусмотрели, что земельный участок может измеряться в квадратных миллиметрах.

Второй вариант получения выписок из ЕГРН – api Росреестра. Api — это набор программных инструкций, по которому ваша программная часть и часть Росреестра обмениваются сведениями без вашего участия. Удобная вещь, если все работает правильно. И можно было бы закончить.

Однако, если посмотреть на страницу, где Росреестр объясняет как внедрить удобное api, становится не по себе.

Документ с описанием размещен здесь — rosreestr.ru/wps/portal/cc_ib_documents?documentId=1521

Занимает всего лишь 19 страниц, но написан техническим языком и говорит о том, что без цифровой подписи нам не обойтись. Вообщем, долго, непонятно и неудобно. Пойдем более коротким путем.

При работе с подвисающим сайтом Росреестра нам понадобится понимание такого инструмента Python как ожидания. Самый подходящий инструмент для работы с этим сайтом, по крайнем мере на текущем этапе развития данного сервиса Росреестра.

Когда страница медленно прогружается загружена в браузере, элементы на этой странице могут появляться с различными временными интервалами (или не появляться вообще). Это затрудняет поиск элементов, периодически возникает исключение ElementNotVisibleException или NoSuchElement. Используя ожидания, мы можем решить эту проблему.

Ожидание дает некий временной интервал между произведенными действиями — поиске элемента или любой другой операции с элементом.

Так как мы используем в работе модуль selenium, то будем работать с тем, что он предлагает. Selenium предоставляет два типа ожиданий — неявное (implicit) и явное (explicit).

Явное ожидание — это код, которым вы определяете, какое условие должно произойти для того, чтобы дальнейший код исполнился. Ранее мы использовали time.sleep(), которое устанавливает точное время ожидания. Но этот вариант не совсем удачен. Минус его в том, что, если не угадать со временем простоя (sleep) программа вылетит. Существуют более удобные методы, которые помогут написать код, ожидающий ровно столько, сколько необходимо.

Пишем программу для работы с онлайн Росреестром


Перейдем к нашей программе.

Суть ее заключается в том, чтобы заходя на сайт Росреестра, она авторизовалась через личный кабинет физ. лица и далее начала самостоятельно подавать запросы на выписки из ЕГРН. Данные для запросов наша программа будет получить из файла Excel (куда же без него). Один нюанс. На сайте Росреестра при подаче запроса есть поле с адресом объекта. С ним возникнут сложности, так как адреса в Росреестр заведены особым способом. Придется это учесть в работе программы.

Приступим.

Перед началом работы подготовим таблицу excel с исходными данными в следующем формате:


Номер-наименование правообладателя-адрес объекта недвижимости- тип объекта- кадастровый номер- площадь. При запросе нам понадобятся все поля таблицы кроме «номер» и «наименование правообладателя».

Теперь создадим новый файл python – rosreestr.py. И импортируем необходимые модули:

import webbrowser,time
from selenium import webdriver
import csv
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
import openpyxl

Открываем файл excel c данными по объектам недвижимости:

wb = openpyxl.load_workbook('activ2.xlsx')
sheet=wb.get_active_sheet()

Заходим на сайт Росреестра. Так как уже сам вход на сайт может идти с задержками, надо поставить ожидание:

browser = webdriver.Firefox()
browser.get ('https://rosreestr.ru/')
time.sleep(5)

Здесь можно оставить просто time.sleep 5 секунд. Но лучше, используя ожидания, написать так:

browser.implicitly_wait(40)

Теперь нам надо дождаться появления кнопки зайти в личный кабинет и нажать на нее:

act = browser.find_element_by_css_selector('#top_panel > a:nth-child(4)')
act.click()

Так как регистрация в личном кабинете производится через портал Госуслуги, то сайт перебрасывает на Госуслуги и это происходит также с задержкой, учтем это:

browser.implicitly_wait(40)
act = browser.find_element_by_id('mobileOrEmail')
act.click()

Теперь программа за нас авторизуется на сайте Госуслуги, введя логин и пароль (вместо логина и пароля надо вписать свои данные):

i=0
for i in 'логин@mail.ru':
	act.send_keys(i)
	time.sleep (0.1)
act = browser.find_element_by_id('password')
act.click()
i=0
for i in 'пароль':
    act.send_keys(i)
    time.sleep (0.1)
act = browser.find_element_by_id('loginByPwdButton')
act.click()

После того, как программа нажала кнопку войти, перед авторизацией может возникнуть вот такое окно:



Здесь надо выбрать CSS-селектор физ. лица. Помните как это делать? Правой мыши на значке Частное лицо…- исследовать элемент:



И скопировать CSS-селектор:



Внесем его в нашу программу:

act = browser.find_element_by_css_selector('tr.not-border:nth-child(1) > td:nth-child(2) > div:nth-child(2)')
act.click()

Теперь, когда мы залогинились, браузер перекинет нас с сайта Госуслуги на сайт Росреестра. Там наша программа должна кликнуть по пункту «Запрос о предоставлении сведений об объектах недвижимости и(или) их правообладателях»:



Внесем соответствующий код:

act = browser.find_element_by_css_selector('div.services-item:nth-child(5) > div:nth-child(1) > span:nth-child(2)')
act.click()
act = browser.find_element_by_css_selector('div.services-item:nth-child(5) > table:nth-child(2) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > a:nth-child(1)')
act.click()

Мы попали на стартовую страницу подачи запроса, где от нас ждут прохождения 5 шагов:



Чтобы перейти на второй шаг, надо поставить галочку на странице и нажать далее. Обозначим это в коде:

act = browser.find_element_by_class_name('PGU-LabelIcon')
act.click()                
act = browser.find_element_by_css_selector('#__nextStep')
act.click()

Мы на 2-м шаге сайта Росреестр. Здесь надо заполнить поле категория заявителя, все остальные данные подтягиваются из Госуслуги автоматически. Потом нажать «Далее»:



В коде это выглядит так:

act = browser.find_element_by_css_selector('#Form7\.step2\.specialDeclarantKind\.code > div:nth-child(2) > div:nth-child(1)')
                act.click()                
                act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)')
                act.click()                
                act = browser.find_element_by_css_selector('#__nextStep')
                act.click() 

Если мы запустим нашу программу, то, скорее всего, получим ошибку:



Обработаем данную ошибку так:

try:                      
                        act = browser.find_element_by_class_name('PGU-LabelIcon')
                except:
                        browser.refresh()
                        time.sleep (40)
                        act = browser.find_element_by_class_name('PGU-LabelIcon')  

Теперь, если возникнет ситуация, при которой страница не прогрузится, программа обновит браузер и заново попытается нажать на нужную иконку. К сожалению, здесь ожидания не работают, и приходится использовать старый, проверенный time.sleep().

Мы на третьем шаге и он самый трудоемкий:



Надо заполнить все поля со знаком «*».

Начнем с ввода объекта:


n=1
 i=sheet['B'+str(n)].value
                #i=input("введите. 1-для земли.2-здание.3-помещение.4-сооружение.5-не завершенное: ")
                if i=='Земельный участок':
                        #1-земля
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)')
                        act.click()                        
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)')
                        act.click()                       
                        #площадь объекта
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.area > div:nth-child(1) > div:nth-child(4) > div:nth-child(1) > div:nth-child(2) > input:nth-child(1)')
                        act.click()
                        for i in str(sheet['E'+str(n)].value):
                                act.send_keys(i)
                                time.sleep (0.1)
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.area\.unit > div:nth-child(2) > div:nth-child(1)')
                        act.click()
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)')
                        act.click()
                elif i=='Здание':
                        #2-здание
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)')
                        act.click()        
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(3)')
                        act.click()
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectPurposeCode > div:nth-child(2) > div:nth-child(1)')
                        act.click()        
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)')
                        act.click()              
                elif i=='Помещение':
                        #3-помещение
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)')
                        act.click()        
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(4)')
                        act.click()
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.roomPurposeCode > div:nth-child(2) > div:nth-child(1)')        
                        act.click()        
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(3)')
                        act.click()        
                elif i=='Сооружение':
                        #4-сооружение
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)')
                        act.click()        
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(5)')
                        act.click()
                elif i=='Не завершенное':
                        #5-не завершенное
                        act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)')
                        act.click()        
                        act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(6)')
                        act.click()

Здесь мы начинаем с ячейки в excel, где у нас написано наименование объекта. Если в ячейке например занесено «Земельный участок», то программа выбираем по css-селектором соответствующий пункт. Все также происходит с другими видами объектов в ячейке – программа их обрабатывает.

Далее программа нажимаем по css-селекторам кадастрового номера, вида выписки и адреса объектов, эти селекторы одинаковы для всех объектов:


#кадастровый номер - цикл по excel таблице
                act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180 > div:nth-child(1) > div:nth-child(4) > div:nth-child(6) > div:nth-child(2) > input:nth-child(1)')
                act.click()
                for i in sheet['C'+str(n)].value:
                        act.send_keys(i)
                        time.sleep (0.1)
                time.sleep(2)
                #вид выписки
                act = browser.find_element_by_css_selector('#Form7\.step3\.extractDataRequestType1 > div:nth-child(2) > div:nth-child(1)')
                act.click()
                act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)')
                act.click()
                # адрес объекта
                act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.addressesList\[0\]\.address > div:nth-child(2) > div:nth-child(2) > a:nth-child(1) > span:nth-child(1)')
                act.click()
                act = browser.find_element_by_css_selector('.fias_input_search')
                act.click()

Теперь надо вбить адрес:


for i in sheet['D'+str(n)].value:
                            act.send_keys(i)
                            time.sleep (0.1)
                print(sheet['D'+str(n)].value)
                i=input("нажмите eneter в интерпретаторе или поправьте адрес вручную на сайте и далее нажмите enter: ")        
                act = browser.find_element_by_css_selector('a.button-custom:nth-child(2)')
                act.click()

Адрес берется из столбца С таблицы excel. Здесь сделана пауза в виде оживания действий пользователя. Это связано с тем, что адрес в Росреестре может отличаться от того, адреса, которым вы располагаете и скорее всего так и есть. Поэтому программа, внеся адрес из таблицы на сайт, будет ожидать, что пользователь нажмет enter в интерпретаторе, чтобы продолжить далее.

Оставшиеся шаги на портале Росреестра наименее примечательны, там программа просто кликает по кнопкам на портале «Далее» и отправляет запрос уже в Росреестр:


 #кнопка Далее
                act = browser.find_element_by_css_selector('#__nextStep > span:nth-child(1)')
                act.click()
                #страница с паспортными данными, поэтому просто кнопка Далее
                act = browser.find_element_by_css_selector('#__nextStep > span:nth-child(1)')
                act.click()
                time.sleep (1)
                #последняя страница, просто кнопка Далее
                act = browser.find_element_by_css_selector('#__nextStep > span:nth-child(1)')
                act.click()

В конце программы добавим обновление браузера:


browser.refresh()
time.sleep (2)

Если программа отработала корректно, то осталось только запустить цикл по всем ячейкам с объектами в нашем excel файле. Для этого с в начале блока перед i=sheet['B'+str(n)].value добавим:

while True:
        if n<36:

а в конце: n+=1, где n-количество объектов недвижимости в таблице excel.

Полностью текст, программы можно будет посмотреть здесь.
Теги:pythonРосреестрвыпискиавтоматизация рутиныюристам салют
Хабы: Python
Рейтинг +4
Количество просмотров 20,6k Добавить в закладки 70
Комментарии
Комментарии 7

Похожие публикации

Факультет Python-разработки
12 марта 2021180 000 ₽GeekBrains
Python QA Engineer
16 марта 202160 000 ₽OTUS
Python-разработчик с нуля
22 марта 202169 900 ₽Нетология
Python для работы с данными
26 марта 202131 500 ₽Нетология

Лучшие публикации за сутки