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

от автора

В этой статье попробуем получить выписки из ФГИС ЕГРН с помощью 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) в код выше.
Что делать, если даже люди по ту сторону экрана решили капчу неправильно (кстати, капча иногда не прогружается и даже обновление картинки не спасает)? Добавлять обработку ошибок в код. Но это уже совсем другая история.

Программа — скачать.
Тестовые объекты недвижимости — скачать.

ссылка на оригинал статьи https://habr.com/ru/post/492568/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *