В этой статье попробуем получить выписки из ФГИС ЕГРН с помощью python (selenium) сразу по нескольким объектам недвижимости, решим капчу с помощью сервиса anticaptcha, используя его api. При встрече с капчей нейросети трогать не будем, так как они могут показаться сложнее в реализации, да и процент «успешных разгадываний» капч с их помощью пока ниже.
Ссылка на 1-ю часть статьи:Получить выписку из Росреестра через ФГИС ЕГРН и python. Часть 1
Начало нашей программы будет сходно с аналогичным из программы предыдущего поста.Сперва происходит автоматическая авторизация на сервисе ФГИС ЕГРН, ввод ключа входа:
Вместо "---" надо внести соответствующие части кода авторизации ФГИС ЕГРН, которые в коде авторизации разделены символом "-".
«rosreestr-objects.xlsx» — файл с объектами недвижимости, по котором пойдут запросы. Если объектов недвижимости более 20, могут возникнуть проблемы, о которых ниже.
Теперь формируем перечень объектов, забирая их из таблицы excel и отправляем на сайт в нужную строку, нажимаем поиск:
При этом на сайт улетает сразу несколько объектов для поиска, что дополнительно экономит время.
Не обязательно пользоваться именно этим сайтом, но можно взять его за основу.
Ресурс, как говорит название, предоставляет решение для решения капч. Такая вот тавтология. Платно. 1 доллар за 1000 капч. Должно хватить на первое время. Суть его работы простая — отправленная на сайт (или его сервис) капча решается живыми людьми (или не совсем живыми) по ту сторону экрана. Решение практически мгновенное, способное по скорости посоперничать с нейросетями. Точность практически сто процентная.
В нашем случае алгоритм такой: сделали фото капчи с экрана, отправили фото в сервис с помощью api, забрали ответ. Таким образом можно решить практически любую капчу, состоящую из цифр, букв и т.д.
Итак, после регистрации на сайте, и оплате 1 доллара, необходимо в разделе api забрать свой ключ:
Все, больше сайт нам не нужен.
Так как объекты на экране находятся в списке, программа будет последовательно заходить в каждый объект и делать по нему запрос, решая капчу:
Капча по объекту сразу не видна на экране, поэтому происходит нажатие page_down, затем фото капчи и сохранение ее на диск. Разрешение экрана может у всех разное, программа писалась под экран 1280х1024.
Чтобы не мучаться с подбором координат на экране при определении границ капчи, которую требуется сфотографировать, оставляю код для определения позиции мыши на экране:
Теперь воспользуемся api anticaptcha и отправим картинку на распознавание в сервис, полученный результат программа введет в соответствующее окно на сайте Росреестра сама:
*Не забываем ввести вместо "-------------------------------" вставить api ключ.
Осталось понажимать соотвествующие кнопки и продолжить цикл по объектам недвижимости:
Здесь могут возникнуть сложности, если объектов слишком много (50 и более). Это связано со сдигом окна просмотра и часть объектов не попадает в окно, видимое программой. Как с этим бороться? Возможно, добавить еще одну act.send_keys(Keys.DOWN) в код выше.
Что делать, если даже люди по ту сторону экрана решили капчу неправильно (кстати, капча иногда не прогружается и даже обновление картинки не спасает)? Добавлять обработку ошибок в код. Но это уже совсем другая история.
Для того, чтобы перейти на аналогичный сервис, который, по субъективным соображениям работает быстрее в части отдачи распознанной капчи и стоит немного дешевле (33 руб. за 1000 капч), достаточно поменять два момента.
Во-первых, получить api-код, зарегистрировавшись на сайте rucaptcha.com
Во-вторых, обозначить это в коде программы, поменяв соответствующие строки:
Как видно выше, сервисы похожи. Что выбрать — дело вкуса.
Программа — скачать.
Тестовые объекты недвижимости — скачать.
Ссылка на 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"] #это полученная решенная капча
Как видно выше, сервисы похожи. Что выбрать — дело вкуса.
Программа — скачать.
Тестовые объекты недвижимости — скачать.