Obtenha uma extração do Rosreestr através do FSIS USRN e python. Parte 2

Neste artigo, tentaremos obter extratos do Fundo Federal de Propriedades do Estado do Registro Unificado de Empresas do Estado com a ajuda de python (selênio) para vários imóveis, ao mesmo tempo, resolveremos o captcha usando o serviço anticaptcha usando sua API. Não tocamos na rede neural quando nos encontramos com o captcha, pois eles podem parecer mais difíceis de implementar, e a porcentagem de captcha de "adivinhação bem-sucedida" com sua ajuda ainda é menor.

Link para a 1ª parte do artigo: obtenha uma extração do Rosreestr através do FSIS USR e python. Parte 1




O início do nosso programa será semelhante ao do post anterior.Primeiro, há uma autorização automática no serviço FSIS USN, digitando a chave de login:
o código
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()


Em vez de "---", é necessário inserir as partes correspondentes do código de autorização do Registro de Inspeção de Propriedades do Estado Federal, que são separadas pelo símbolo "-" no código de autorização.
"Rosreestr-objects.xlsx" - um arquivo com objetos imobiliários para os quais as solicitações serão enviadas. Se houver mais de 20 propriedades, poderão surgir problemas, descritos a seguir.

Agora criamos uma lista de objetos, retirando-os da tabela do Excel e enviando para o site na linha desejada, clique em pesquisar:
o código
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()


Ao mesmo tempo, vários objetos a serem pesquisados ​​voam para o site ao mesmo tempo, o que economiza tempo.

Registre-se em anti-captcha.com


Não é necessário usar este site específico, mas você pode tomá-lo como base.
O recurso, como o nome diz, fornece uma solução para resolver o captcha. Essa é a tautologia. Por uma taxa. 1 dólar por 1000 captcha. Deve ser o suficiente pela primeira vez. A essência de seu trabalho é simples - o captcha enviado para o site (ou seu serviço) é resolvido por pessoas vivas (ou não muito vivas) do outro lado da tela. A solução é quase instantânea, capaz de competir em velocidade com as redes neurais. A precisão é quase cem por cento.
No nosso caso, o algoritmo é o seguinte: eles tiraram uma foto do captcha da tela, enviaram a foto para o serviço usando a API, pegaram a resposta. Assim, você pode resolver praticamente qualquer captcha, composto por números, letras, etc.

Então, depois de se registrar no site e pagar 1 dólar, você precisa pegar sua chave na seção da API:
cenário



picture2


Isso é tudo, não precisamos mais de um site.

Voltamos ao programa.


Como os objetos na tela estão na lista, o programa sequencialmente entrará em cada objeto e fará uma solicitação, resolvendo o captcha:
o código
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))#  12801024
        #im=pyautogui.screenshot(imageFilename=str(a)+'.jpg',region=(317,404,160,200))#    
        time.sleep(1)
        captcha_file = 'C:\/1\/0.jpg'


O captcha no objeto não é imediatamente visível na tela, então page_down é pressionado e, em seguida, uma foto do captcha e seu salvamento no disco. A resolução da tela pode ser diferente para todos, o programa foi escrito para uma tela de 1280x1024.
Para não sofrer com a seleção de coordenadas na tela ao determinar os limites do captcha que você deseja fotografar, deixo o código para determinar a posição do mouse na tela:
o código
#! 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.')



Agora usaremos o api anticaptcha e enviaremos a imagem para reconhecimento ao serviço, o programa inserirá o resultado na janela correspondente no próprio site da Rosreestr:

o código
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)


* Não se esqueça de inserir a tecla api em vez de "-------------------------------"

Resta pressionar os botões apropriados e continuar o ciclo do setor imobiliário:
o código
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


Aqui podem surgir dificuldades se houver muitos objetos (50 ou mais). Isso ocorre devido à mudança da janela de exibição e alguns dos objetos não caem na janela visível pelo programa. Como lidar com isso? Talvez adicione outro act.send_keys (Keys.DOWN) ao código acima.
O que devo fazer se até as pessoas do outro lado da tela decidirem consertar o captcha incorretamente (a propósito, o captcha às vezes não carrega e até a atualização da imagem não salva)? Adicione tratamento de erros ao código. Mas esta é uma história completamente diferente.

Não gosta de anticaptcha? Usando Rucaptcha!



Para mudar para um serviço semelhante, que, por razões subjetivas, funciona mais rapidamente em termos de retorno de captcha reconhecido e custa um pouco mais barato (33 rublos por 1000 captcha), basta mudar dois pontos.
Primeiro, obtenha o código da API registrando-se no site rucaptcha.com.
Em segundo lugar, indique isso no código do programa alterando as linhas correspondentes:

O código
RUCAPTCHA_KEY = "  api"
from python_rucaptcha import ImageCaptcha
result = ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler(captcha_file=captcha_file)
b=result["captchaSolve"] #   



Como você pode ver acima, os serviços são semelhantes. O que escolher é uma questão de gosto.

Programa - download .
Teste objetos imobiliários - faça o download .

All Articles