Holen Sie sich einen Auszug aus Rosreestr über FSIS USRN und Python. Teil 2

In diesem Artikel werden wir versuchen, mit Hilfe von Python (Selen) Auszüge aus dem Federal State Property Fund des Unified State Register of Enterprises für mehrere Immobilien gleichzeitig zu erhalten. Wir werden das Captcha mithilfe des Anticaptcha-Dienstes mithilfe seiner API lösen. Wir berühren das neuronale Netzwerk nicht, wenn wir uns mit dem Captcha treffen, da es möglicherweise schwieriger zu implementieren scheint und der Prozentsatz der Captchas, die mit ihrer Hilfe erfolgreich erraten werden, immer noch geringer ist.

Link zum 1. Teil des Artikels: Holen Sie sich einen Auszug aus Rosreestr über FSIS USR und Python. Teil 1




Der Beginn unseres Programms ähnelt dem aus dem Programm des vorherigen Beitrags. Zunächst erfolgt eine automatische Autorisierung für den FSIS USN-Dienst, bei der der Anmeldeschlüssel eingegeben wird:
der Code
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()


Anstelle von "---" müssen Sie die entsprechenden Teile des Zulassungscodes des bundesstaatlichen Immobilieninspektionsregisters eingeben, die im Zulassungscode durch das Symbol "-" getrennt sind.
"Rosreestr-objects.xlsx" - eine Datei mit Immobilienobjekten, für die Anforderungen gesendet werden. Bei mehr als 20 Eigenschaften können Probleme auftreten, die im Folgenden beschrieben werden.

Jetzt erstellen wir eine Liste von Objekten, nehmen sie aus der Excel-Tabelle und senden sie an die Site in der gewünschten Zeile. Klicken Sie auf Suchen:
der Code
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()


Gleichzeitig fliegen mehrere Suchobjekte gleichzeitig zur Site, was zusätzlich Zeit spart.

Registrieren Sie sich auf anti-captcha.com


Es ist nicht erforderlich, diese bestimmte Site zu verwenden, aber Sie können sie als Grundlage verwenden.
Die Ressource bietet, wie der Name schon sagt, eine Lösung zum Lösen von Captcha. So ist die Tautologie. Gegen eine Gebühr. 1 Dollar pro 1000 Captcha. Es sollte zum ersten Mal ausreichen. Das Wesentliche seiner Arbeit ist einfach: Das an die Site (oder deren Service) gesendete Captcha wird von lebenden Personen (oder nicht ganz lebendig) auf der anderen Seite des Bildschirms gelöst. Die Lösung ist fast augenblicklich und kann mit neuronalen Netzen in der Geschwindigkeit konkurrieren. Die Genauigkeit beträgt fast hundert Prozent.
In unserem Fall lautet der Algorithmus wie folgt: Sie haben ein Foto von Captcha vom Bildschirm aufgenommen, das Foto mit API an den Dienst gesendet und die Antwort erhalten. So können Sie fast jedes Captcha lösen, das aus Zahlen, Buchstaben usw. besteht.

Nachdem Sie sich auf der Website registriert und 1 Dollar bezahlt haben, müssen Sie Ihren Schlüssel im API-Bereich abholen:
Bild



Bild2


Das ist alles, wir brauchen keine Website mehr.

Wir kehren zum Programm zurück.


Da sich die Objekte auf dem Bildschirm in der Liste befinden, geht das Programm nacheinander in jedes Objekt und stellt eine Anforderung, um das Captcha zu lösen:
der Code
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'


CAPTCHA auf dem Objekt ist nicht sofort auf dem Bildschirm sichtbar, daher wird page_down gedrückt, dann ein Foto des Captchas und dessen Speicherung auf der Festplatte. Die Bildschirmauflösung kann für jeden unterschiedlich sein, das Programm wurde für einen Bildschirm von 1280x1024 geschrieben.
Um nicht unter der Auswahl der Koordinaten auf dem Bildschirm zu leiden, wenn Sie die Grenzen des Captchas bestimmen, das Sie fotografieren möchten, lasse ich den Code, um die Position der Maus auf dem Bildschirm zu bestimmen:
der Code
#! 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.')



Jetzt verwenden wir api anticaptcha und senden das Bild zur Erkennung an den Dienst. Das Programm gibt das Ergebnis in das entsprechende Fenster auf der Rosreestr-Website selbst ein:

der Code
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)


* Vergessen Sie nicht, den API-Schlüssel anstelle von "-------------------------------" einzugeben.

Es bleibt, die entsprechenden Tasten zu drücken und den Immobilienzyklus fortzusetzen:
der Code
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


Hier können Schwierigkeiten auftreten, wenn zu viele Objekte vorhanden sind (50 oder mehr). Dies ist auf die Verschiebung des Ansichtsfensters zurückzuführen, und einige der Objekte fallen nicht in das vom Programm sichtbare Fenster. Wie gehe ich damit um? Fügen Sie dem obigen Code möglicherweise eine weitere act.send_keys (Keys.DOWN) hinzu.
Was kann ich tun, wenn selbst die Personen auf der anderen Seite des Bildschirms beschlossen haben, das Captcha falsch zu korrigieren (das Captcha wird übrigens manchmal nicht geladen und selbst das Aktualisieren des Bildes wird nicht gespeichert)? Fügen Sie dem Code eine Fehlerbehandlung hinzu. Aber das ist eine ganz andere Geschichte.

Mögen Sie kein Anticaptcha? Mit Rucaptcha!



Um zu einem ähnlichen Dienst zu wechseln, der aus subjektiven Gründen bei der Rückgabe anerkannter Captcha schneller funktioniert und etwas billiger kostet (33 Rubel für 1000 Captcha), reicht es aus, zwei Punkte zu ändern.
Erstens erhalten Sie den API-Code, indem Sie sich auf der Website rucaptcha.com registrieren.
Zweitens geben Sie dies im Programmcode an, indem Sie die entsprechenden Zeilen ändern:

Der Code
RUCAPTCHA_KEY = "  api"
from python_rucaptcha import ImageCaptcha
result = ImageCaptcha.ImageCaptcha(rucaptcha_key=RUCAPTCHA_KEY).captcha_handler(captcha_file=captcha_file)
b=result["captchaSolve"] #   



Wie Sie oben sehen können, sind die Dienste ähnlich. Was zu wählen ist, ist Geschmackssache.

Programm - herunterladen .
Immobilienobjekte testen - herunterladen .

All Articles