Получить выписку из Росреестра через ФГИС ЕГРН и python. Часть 2

  • Tutorial
В этой статье попробуем получить выписки из ФГИС ЕГРН с помощью python (selenium) сразу по нескольким объектам недвижимости, решим капчу с помощью сервиса anticaptcha, используя его api. При встрече с капчей нейросети трогать не будем, так как они могут показаться сложнее в реализации, да и процент «успешных разгадываний» капч с их помощью пока ниже.

Ссылка на 1-ю часть статьи:Получить выписку из Росреестра через ФГИС ЕГРН и python. Часть 1




Начало нашей программы будет сходно с аналогичным из программы предыдущего поста.Сперва происходит автоматическая авторизация на сервисе ФГИС ЕГРН, ввод ключа входа:
код
import webbrowser,time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.action_chains import ActionChains
import openpyxl
import pyautogui
import os
from python3_anticaptcha import ImageToTextTask

wb = openpyxl.load_workbook('rosreestr-objects.xlsx')
sheet=wb.get_active_sheet()

browser = webdriver.Firefox()
browser.implicitly_wait(40)
browser.get ('https://rosreestr.ru/wps/portal/p/cc_present/ir_egrn')

act = browser.find_element_by_css_selector('.v-panel-content > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > input:nth-child(1)')
for i in '---------':
	act.send_keys(i)
time.sleep(2)
act = browser.find_element_by_css_selector('.v-panel-content > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > div:nth-child(1) > input:nth-child(1)')
for i in '----':
	act.send_keys(i)
time.sleep(2)
act = browser.find_element_by_css_selector('.v-panel-content > div:nth-child(1) > div:nth-child(1) > div:nth-child(5) > div:nth-child(1) > input:nth-child(1)')	
for i in '----':
	act.send_keys(i)
time.sleep(2)
act = browser.find_element_by_css_selector('.v-panel-content > div:nth-child(1) > div:nth-child(1) > div:nth-child(7) > div:nth-child(1) > input:nth-child(1)')                                         
for i in '----':
	act.send_keys(i)
time.sleep(2)
act = browser.find_element_by_css_selector('.v-panel-content > div:nth-child(1) > div:nth-child(1) > div:nth-child(9) > div:nth-child(1) > input:nth-child(1)')                                           
for i in '-----------':
	act.send_keys(i)
time.sleep(2)
act = browser.find_element_by_css_selector('.v-button-normalButton > span:nth-child(1) > span:nth-child(1)')
act.click()


Вместо "---" надо внести соответствующие части кода авторизации ФГИС ЕГРН, которые в коде авторизации разделены символом "-".
«rosreestr-objects.xlsx» — файл с объектами недвижимости, по котором пойдут запросы. Если объектов недвижимости более 20, могут возникнуть проблемы, о которых ниже.

Теперь формируем перечень объектов, забирая их из таблицы excel и отправляем на сайт в нужную строку, нажимаем поиск:
код
n=1
while n<11: #количество объектов в таблице excel
        i=sheet['C'+str(n)].value
        test.append(i+';')
        n+=1
# поиск объектов недвижимости
act = browser.find_element_by_css_selector('.v-gridlayout-margin > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > span:nth-child(1) > span:nth-child(2)')
act.click()        
time.sleep(1)
act = browser.find_element_by_css_selector('.v-verticallayout-searchFormOuter > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > input:nth-child(1)')
act.click()        
act.clear()        
for i in test:
        act.send_keys(i)        
time.sleep(3)
act = browser.find_element_by_css_selector('.v-filterselect-error > input:nth-child(1)')
act.click()        
act.clear()        
for i in 'Свердловская область':
        act.send_keys(i)
time.sleep(5)
act.send_keys(Keys.ENTER)
act = browser.find_element_by_css_selector('.v-horizontallayout-borderTop > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > span:nth-child(1) > span:nth-child(1)')
act.click()


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

Регистрация на сайте anti-captcha.com


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

Итак, после регистрации на сайте, и оплате 1 доллара, необходимо в разделе api забрать свой ключ:
картинка



картинка2


Все, больше сайт нам не нужен.

Возвращаемся к программе.


Так как объекты на экране находятся в списке, программа будет последовательно заходить в каждый объект и делать по нему запрос, решая капчу:
код
x=1
ActionChains(browser).move_to_element(browser.find_element_by_xpath('/html/body/div[1]/div[6]/div[4]/div/div/section/div[2]/div[2]/div/div/div[2]/div/div[2]/div/div/div/div[1]/div/div/div/div[5]/div/div/div[2]/div[1]/table/tbody/tr['+str(x)+']')).click().perform()
        time.sleep(2)        
        act = browser.find_element_by_css_selector('.v-textfield')
        act.click()
        time.sleep(1)
        act = browser.find_element_by_tag_name('html')
        act.send_keys(Keys.PAGE_DOWN)#прокручиваем страницу, чтобы увидеть капчу
        time.sleep(2)
        a=0
        os.chdir('C:\\1')
        im=pyautogui.screenshot(imageFilename=str(a)+'.jpg',region=(238,394,220,70))#разрешение экрана 1280х1024
        #im=pyautogui.screenshot(imageFilename=str(a)+'.jpg',region=(317,404,160,200))#делаем фото капчи на память
        time.sleep(1)
        captcha_file = 'C:\/1\/0.jpg'


Капча по объекту сразу не видна на экране, поэтому происходит нажатие page_down, затем фото капчи и сохранение ее на диск. Разрешение экрана может у всех разное, программа писалась под экран 1280х1024.
Чтобы не мучаться с подбором координат на экране при определении границ капчи, которую требуется сфотографировать, оставляю код для определения позиции мыши на экране:
код
#! python3
# mouseNow.py - Displays the mouse cursor's current position.
import pyautogui
print('Press Ctrl-C to quit.')
try:
    while True:
        # Get and print the mouse coordinates.
        x, y = pyautogui.position()
        positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
        pixelColor = pyautogui.screenshot().getpixel((x, y))
        positionStr += ' RGB: (' + str(pixelColor[0]).rjust(3)
        positionStr += ', ' + str(pixelColor[1]).rjust(3)
        positionStr += ', ' + str(pixelColor[2]).rjust(3) + ')'
        print(positionStr, end='')
        print('\b' * len(positionStr), end='', flush=True)

except KeyboardInterrupt:
    print('\nDone.')



Теперь воспользуемся api anticaptcha и отправим картинку на распознавание в сервис, полученный результат программа введет в соответствующее окно на сайте Росреестра сама:

код
ANTICAPTCHA_KEY = "-------------------------------"
        result = ImageToTextTask.ImageToTextTask(anticaptcha_key=ANTICAPTCHA_KEY).captcha_handler(captcha_file=captcha_file)        
        b=result.get('solution').get('text')#ответ на капчу с сервиса
        print(b)
        act = browser.find_element_by_css_selector('.v-textfield')
        act.click()
        for a in b:
                act.send_keys(a)
                time.sleep(0.1)
        act.send_keys(Keys.ENTER)
        time.sleep(1)


*Не забываем ввести вместо "-------------------------------" вставить api ключ.

Осталось понажимать соотвествующие кнопки и продолжить цикл по объектам недвижимости:
код
act.click()
        time.sleep(3)        
        act = browser.find_element_by_css_selector('.v-table-body-wrapper')
        act.send_keys(Keys.DOWN)
        act.send_keys(Keys.DOWN)
        time.sleep(3)        
        x+=1


Здесь могут возникнуть сложности, если объектов слишком много (50 и более). Это связано со сдигом окна просмотра и часть объектов не попадает в окно, видимое программой. Как с этим бороться? Возможно, добавить еще одну act.send_keys(Keys.DOWN) в код выше.
Что делать, если даже люди по ту сторону экрана решили капчу неправильно (кстати, капча иногда не прогружается и даже обновление картинки не спасает)? Добавлять обработку ошибок в код. Но это уже совсем другая история.

Не нравится anticaptcha? Используем Rucaptcha!



Для того, чтобы перейти на аналогичный сервис, который, по субъективным соображениям работает быстрее в части отдачи распознанной капчи и стоит немного дешевле (33 руб. за 1000 капч), достаточно поменять два момента.
Во-первых, получить api-код, зарегистрировавшись на сайте rucaptcha.com
Во-вторых, обозначить это в коде программы, поменяв соответствующие строки:

Код
RUCAPTCHA_KEY = "здесь код api"
from python_rucaptcha import ImageCaptcha
result = ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler(captcha_file=captcha_file)
b=result["captchaSolve"] #это полученная решенная капча



Как видно выше, сервисы похожи. Что выбрать — дело вкуса.

Программа — скачать.
Тестовые объекты недвижимости — скачать.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 18

    0
    С нетерпением жду серии, где расскажут как выписку из xml преобразовать во что-то читаемое.
    Не — выписку на дессяток страниц можно и в онлайне, можно и хромом… А вот что делать с выписками у которых за тысячу страниц с картами?
      0
      Так их сразу вроде в pdf можно скачать после загрузки на сайт Росреестра из xml и sig? Или вы их предварительно распарсить хотите?
        0
        Ну так схемы же все опубликованы. Тысячи страниц образуются повторением одних и тех же элементов. Пишете XSL под Ваши нужды и художественный вкус, берёте какой-нибудь Apache FOP и в путь…

        Со схемами, конечно, надо отдельно разобраться. Но там именно схемы, которые строятся из координат граничных точек, а не карты — так что вопрос тоже явно решаемый. Вся задача — отрисовка многоугольника по координатам его вершин.
          0
          Про тысячу страниц, да чтобы с картами — я про такое даже и не слышал. Простые выписки сделал из навоза и соломы.
        0

        Неужели использовать API Росреестра оказалось сложнее, чем прикручивать распознавание капчи и вот это всё? Не пробовали в дверь войти, прежде чем через окно лезть? ;)

          0
          С момента предыдущей статьи сервис не сильно поменялся — все также нужна ЭЦП — rosreestr.ru/wps/portal/cc_ib_documents?documentId=1521
          По api было бы эффективней конечно, но слишком длинный подготовительный этап.
            0
            Про ЭЦП-то понятно, просто было интересно, не пробовали ли Вы по официальному пути дальше продвинуться и какие там есть ещё подводные камни. Просто ЭЦП получить — ерундовый вопрос, а вот с отечественными криптопровайдерами, судя по впечатлениям о работе с ними со стороны пользователя, можно поиметь много геморроя… Ну и хочется учиться на чужих ошибках :)
              0
              Основная боль в этом процессе — это оплата заказываемых документов. Чтобы оплатить документ, получаемый данным путем, надо открывать счет в банке из очень ограниченного списка. Гонять деньги туда-сюда ради только выписок так себе занятие.
              Вторая головная боль — ЭЦП на каждое общество. С одной стороны — благо, заказало общество выписку по всем своим объектам разом, и деньги сэкономило, и время. Только вот если обществ за сотню-другую… На всех ЭЦП брать, которая к тому же на год всего?
              Вот и «ходят» все через физиков во ФГИС и вешают Росреестр (возможно, конечно, он не только по этому поводу повисает).
                0
                Т.е. вы решаете задачу получения выписок, которые предоставляются только правообладателям, и таких у Вас много? Тогда да, конечно, отдельный геморрой. Кроме запроса «все мои объекты» и запроса копий правоустанавливающих документов, что там ещё, кстати, не дают свободно (давно уже разбирался последний раз, не помню)?

                Но если получать обычные выписки, которые предоставляются любым желающим, — в чём проблема оформить доступ на одно лицо с одной ЭЦП и от его имени получать на всех? Многочисленные независимые онлайн-сервисы по предоставлению выписок ведь так и делают. Заодно и «оптовая скидка» за счёт покупки самых больших пакетных тарифов получается.

                P.S. А почему «вешается» Росреестр — я в рамках цензурной лексики описать не могу, увы :) Но их любимая отмазка, что во всём виноваты «сайты-двойники», меня умиляет. Можно подумать, общая потребность в выписках и, соответственно, нагрузка на систему как-то зависит от того, через какую прокладку эти выписки заказаны. Лучше бы на сдачу от попиленных миллиардов сами нормальный интерфейс для получения выписок со своего портала сделали...
                  0
                  Кроме запроса «все мои объекты» и запроса копий правоустанавливающих документов, что там ещё, кстати, не дают свободно (давно уже разбирался последний раз, не помню)?

                  Собственно запрос правообладателя объекта.
                  — в чём проблема оформить доступ на одно лицо с одной ЭЦП и от его имени получать на всех?

                  Не получится отследить новые объекты общества, только административными средствами.
                    0
                    С отслеживанием новых объектов понятно — решить эту задачу от имени третьего лица нереально. У меня, слава Богу, другая задача…
                    А что Вы понимаете под «запросом правообладателя»? Я спокойно получаю выписки по любым чужим объектам, зная только кадастровый номер, и вижу в этой выписке их правообладателя. Ну или историю перехода прав, если другой тип выписки выберу.

                    И ещё по поводу банков для оплаты, про что Вы писали в предыдущем комментарии. Я проверил, зашёл в ЛК Росреестра с ЭЦП юрлица, посмотрел опции оплаты.
                    Единственное ограничение по банкам, которое увидел — банк должен быть подключён к ГИС ГМП. Так сейчас сложно найти такой банк, который к ней ещё не подключён (сайт Фед. казначейства утверждает, что таких ровно 5 штук, и эти названия я первый раз узнал из этого списка).
                    Или есть ещё какие-то проблемы с этим?
                      0
                      Я спокойно получаю выписки по любым чужим объектам, зная только кадастровый номер, и вижу в этой выписке их правообладателя.

                      У вас получается это бесплатно? В обычной выписке это не видно.

                      Единственное ограничение по банкам,

                      Хм, хорошая новость, если все так. Видимо, этот момент сдвинулся с мертвой точки.
                      Но все равно остается еще одно обстоятельство — как оплатить с другого юр. лица по юр. лицу, которое фактически запрашивает? У нас такой фокус не прошел, платеж не учли.
                        0
                        У вас получается это бесплатно? В обычной выписке это не видно.

                        Не бесплатно, естественно, — но от своего лица, а не от правообладателя. Вот прямо сейчас смотрю на выписку, полученную из ФГИС ЕГРН на чужой земельный участок, и вижу раздел 2 «Сведения о зарегистрированных правах» и в нём п. 1 «Правообладатель» с наименованием юр. лица и его ИНН.
                        Но все равно остается еще одно обстоятельство — как оплатить с другого юр. лица по юр. лицу, которое фактически запрашивает?

                        Ну тут опять же вопрос в том, нужно ли в принципе делать такие запросы, которые может делать только правообладатель. Если нужно (тот же мониторинг новых объектов) — то да, Вы попали на отдельные ЭЦП, отдельные аккаунты и отдельные счета. Если нет — платите за всё с одного лица, а как уж другие ему компенсируют — это Ваши договорные отношения.
                          0
                          Не бесплатно,

                          Ясно. Программа в статье как раз про эти выписки. Так и работаем.
                          нужно ли в принципе делать такие запросы, которые может делать только правообладатель

                          Да, они были бы менее трудозатратны, выгодны и информативны в плане новых объектов. Но пока этот путь не работает.
          0
          .
            0
            .
              +1
              Перед click() на элемент, который может быть невидим, я делаю
              browser.execute_script("arguments[0].scrollIntoView();", act)
              

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое