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

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


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

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

    Возможно, это удобный способ получения одной или нескольких выписок. Однако, что делать, если необходим пакет выписок ЕГРН? Допустим, вы работаете с недвижимостью или владеете рядом объектов, общее число которых более 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.

    Полностью текст, программы можно будет посмотреть здесь.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 7

      +1
      Это история достойна называться как
      «Я не осилил инструменты разработчика и библиотеку python Requests»

      Процесс начинается с авторизации, тут или автоматизировать вход через госуслуги или зайти руками, а затем взять AUTH_TOKEN из браузера и отдать его скрипту.

      Почти всё интересное происходит по адресу
      https:// lk. rosreestr.ru/wsapi/processingService/process
      с периодической отправкой POST запросов за JSON на
      https:// lk. rosreestr.ru/wsapi/refsQueryService/listRefItems

      Хотел протестировать на себе процесс, чтобы не быть голословным, но к сожалению не осилил достаточно быстро полный набор данных об интересующем объекте.
      Хотя, тэг «юристам салют» намекает, что был найден самый понятный инструмент для исполнителя :)))
        0
        Авторизацию через «Госуслуги» программа делает.
        Через requests было бы более изящное решение, если бы не капчи и странности со вводом адреса объекта в соответствующее поле. Кроме того, сайт портала периодически отваливается и виснет (не системно, но бывает), поэтому пошли через колхоз с seleniumом.
        p.s. сама прога не слишком практична, т.к. стоимость 1 выписки 300 руб. за шт. В дальнейшем напишу как по 4 руб. их получать более просто.
          0
          Вы видимо «теоретик», устанете на таком сайте Requests исправлять при каждом чихе :)
          0

          Ох, не пишите вы вы лучше про ФГИС. Росреестр сейчас и так неадекватно ведёт себя. После вашей инструкции вообще все отключат. Если не в курсе последних событий, почитайте эти обзоры:


            0
            Я с удовольствием прочитал ваши продвигающие статьи. Ситуация не так драматична, на мой взгляд. Разберем.
            ШАГ 1. Создаём нерабочий, неспособный обработать большое количество запросов граждан и бизнеса, официальный портал по заказу выписок. Заодно делаем возможность удаленного заказа выписок неисполнимой для обычных организаций с помощью неотвечающей технической поддержки и бессмысленного требования по криптографической защите запросов.
            ШАГ 2. Делаем тариф на получение «быстрых» выписок с заградительными, неподъемными ценами в десятки миллионов рублей. Естественно, такой тариф могут позволить себе только очень крупные компании либо пресловутые посредники, но!
            ШАГ 3. Запрещаем посредников, которые могли бы обеспечить специалистов по недвижимости оперативными сведениями из ЕГРН, но которые не могут позволить себе доступ к сведениям из-за дорого тарифа.

            По п.1 частично согласен, но в последние месяцы портал работает заметно лучше (скорость прогрузки). В криптографическую защиту я не стал погружаться, т.к. все можно прокачать и без нее, через python. Техподдержка на портале доступная.
            По п.2. Про конские тарифы для организаций, про которые вы пишете, так они и для конского количества запросов. Если брать простой тариф для физ. лица 1000 выписок — 400 руб. — вполне доступная цена.
            По п. 3 Посредники здесь особо не нужны, т.к. именно они и накручивают цену на выписки. Другое дело они создают удобство для тех, кто платит. Но тот, кто платит, он и собственный отдел разработки может себе позволить.

            Главные минусы текущего портала Росреестра я бы определил такие:
            — адрес объекта, не смотря на то, что он правильно определен (по выписке), в соответствующем поле на портале при заполнении как-то странно определяется. Отсюда сложности и с программами и с заполнением в принципе.
            — на портале нет вообще целых субъектов РФ (Пензенская область например) по позиции адреса. Поэтому, модная сейчас процедура постановки запретов на перерегистрацию объектов без вашего ведома с помощью ЭЦП невозможна! Только потому, что адрес нельзя внести!
            — есть удобная услуга юр. лицо заказывает, используя ЭЦП, по себе выписку по всем объектам, которые имеет. Ан нет, оплатить услугу лицо может только через ряд «карманных» банков! Т.е. надо идти в эти банки, открывать счет, переводить туда деньги за выписку и только так это работает. Вот где повод в ФАС писать!
            — капчи. Человек заплатил 400 р. за 1000 выписок. Он будет заказывать выписки. На кой черт, ему еще и капчи сидеть вбивать!?
            — а ну и формат выдачи выписок это шедевр. Думаете на выходе при запросе получить pdf?
            Э, нет. Вот вам ссылка (!) на csv и файл sig, которые надо потом загрузить еще на портал и он выдаст вам html (!). При куче выписок это катастрофа. Csv и sig имеют разные названия при распаковке, понять что от чего невозможно.
            Можете использовать минусы в новых продвигающих статьях, они актуальны. А я позднее напишу, как с этой кашей работать программно, даже если мы положим портал запросами.
              0

              Вы во многом заблуждаетесь.
              1) фгис лучше работать не стал. На выходные отключают, постоянно отрубается с самыми разнообразными ошибками.
              2) выписки с портала неудобны в работе, потому что информация нужна сразу, для чего и был придуман фгис. Фишка в скорости получения данных.
              3) мне ни разу не ответили на запросы в техподдержку
              4) запрет на сделки не работает не потому что адрес нельзя вбить, а потому что он работает только в регионах, где перешли на единый ФГИС ЕГРН
              5) покажите мне пальцем тариф на 1000 выписок в новом законопроекте! Нет их, убрали! В этом и беда.
              6) я писал что посредники — это единственное спасение против новых тарифов, а их запрещают. Речь идёт не про сейчас, а про планируемые изменения!
              7) не csv а xml

                0

                А не сейчас не плачевная, а будет очень даже плачевная, если все это утвердят. Я говорил с бывшим главой палаты, им просто плевать на инженеров и спецов, кто работает.

            Only users with full accounts can post comments. Log in, please.