Holen Sie sich die USRN-Anweisung von Rosreestr mithilfe von Python unter Umgehung der API

Nicht die erste Bekanntschaft mit dem Rosreestr-Portal


Jeder Anwalt hat jemals einen Antrag an Rosreestr (Bundesdienst für staatliche Registrierung, Kataster und Kartographie) gestellt. Die Zeiten, in denen es für eine Anfrage erforderlich war, zur Rosreestr-Niederlassung zu laufen und eine Anfrage auf Papier einzureichen, gehören der Vergangenheit an. Rosreestr hat mehrere Online-Dienste gestartet, die Sie nutzen können, ohne Ihr Zuhause zu verlassen. Diese Dienstleistungen umfassen die Anforderung eines Auszugs aus dem Unified State Register of Real Estate. Offizielle Seite für den Einstieg.

Jeder, der es bereits geschafft hat, mit der Website zu arbeiten, weiß, dass es erforderlich ist, auf das persönliche Konto von Rosreestr zuzugreifen, um einen Auszug aus dem USRN zu erhalten, der nicht nur Informationen über die allgemeinen Merkmale der Einrichtung, sondern auch über den Inhaber des Urheberrechts dieser Einrichtung enthält.

Vielleicht ist dies ein bequemer Weg, um eine oder mehrere Aussagen zu erhalten. Was tun, wenn Sie ein Paket mit USRN-Auszügen benötigen? Angenommen, Sie arbeiten mit Immobilien oder besitzen eine Reihe von Objekten, deren Gesamtzahl mehr als 10 beträgt. In der Regel müssen Sie mindestens einmal pro Jahr einen Auszug aus der USRN erhalten, um auf rechtlicher Ebene umgehend auf unerwünschte Änderungen im Bundesregister reagieren zu können, wenn diese zusätzlich zu Ihren auftreten der Wille.


Sie können Anfragen manuell über Ihr persönliches Konto senden oder die Rosreestr-API verwenden. Die erste Option ist extrem anstrengend. Zusätzlich zu der Tatsache, dass der Rosreestra-Onlinedienst selbst sehr langsam mit ständigen Hängen arbeitet, wird der normale Benutzer auch aufgefordert, bei jeder Anfrage ein Arsenal von Feldern für das Objekt einzureichen. Zum Beispiel eine Anfrage für ein Grundstück:


Das heißt, Informationen über das Objekt herauszufinden und einen physischen Auszug daraus zu erhalten. Die Person muss bereits alle Eigenschaften des Objekts kennen! Und jedes Mal, wenn Sie Informationen anfordern, müssen Sie alle Felder ausfüllen. Was zu sagen ist, ist sehr unpraktisch. Vielen Dank, dass Sie zumindest vorausgesetzt haben, dass das Land in Quadratmillimetern gemessen werden kann.

Die zweite Möglichkeit, Auszüge aus der USRN zu erhalten, ist die Rosreestr-API. Api ist eine Reihe von Programmanweisungen, nach denen Ihr Softwareteil und ein Teil von Rosreestr ohne Ihre Teilnahme Informationen austauschen. Eine bequeme Sache, wenn alles richtig funktioniert. Und man könnte fertig werden.

Wenn Sie sich jedoch die Seite ansehen, auf der Rosreestr erklärt, wie eine praktische API implementiert wird, fühlen Sie sich unwohl.

Ein Dokument mit einer Beschreibung finden Sie hier - rosreestr.ru/wps/portal/cc_ib_documents?documentId=1521

Es dauert nur 19 Seiten, ist aber in technischer Sprache verfasst und legt nahe, dass wir nicht auf eine digitale Signatur verzichten können. Im Allgemeinen ist es lange Zeit unverständlich und unpraktisch. Gehen wir einen kürzeren Weg.

Wenn wir mit der Hängeseite von Rosreestr arbeiten, müssen wir ein solches Python-Tool wie erwartet verstehen. Das am besten geeignete Werkzeug für die Arbeit mit dieser Site, zumindest in der aktuellen Entwicklungsphase dieses Dienstes Rosreestra.

Wenn eine Seite langsam geladen wird und in einen Browser geladen wird, werden Elemente auf dieser Seite möglicherweise in unterschiedlichen Zeitintervallen angezeigt (oder überhaupt nicht). Dies macht es schwierig, Elemente zu finden. Eine ElementNotVisibleException- oder NoSuchElement-Ausnahme wird regelmäßig ausgelöst. Mit den Erwartungen können wir dieses Problem lösen.

Das Warten gibt ein bestimmtes Zeitintervall zwischen den ausgeführten Aktionen an - die Suche nach einem Element oder eine andere Operation mit dem Element.

Da wir das Selenmodul in unserer Arbeit verwenden, werden wir mit dem arbeiten, was es bietet. Selen bietet zwei Arten von Erwartungen - implizite und explizite.

Explizites Warten ist der Code, mit dem Sie bestimmen, welche Bedingung auftreten muss, damit weiterer Code ausgeführt werden kann. Früher haben wir time.sleep () verwendet, das das genaue Timeout festlegt. Diese Option ist jedoch nicht ganz erfolgreich. Der Nachteil ist, dass das Programm abstürzt, wenn Sie die Ausfallzeit (Schlaf) nicht erraten. Es gibt bequemere Methoden, mit denen Sie Code schreiben können, der so viel erwartet, wie Sie benötigen.

Wir schreiben ein Programm für die Arbeit mit dem Online-Rosreestr


Fahren wir mit unserem Programm fort.

Das Wesentliche ist, dass sie sich beim Aufrufen der Rosreestr-Website über das persönliche Konto einer physischen Person anmeldet. Personen und begann ferner, unabhängig Anträge auf Auszüge aus der USRN einzureichen. Unser Programm empfängt Daten für Anfragen aus einer Excel-Datei (wo wäre es ohne). Eine Einschränkung. Bei der Übermittlung einer Anfrage enthält die Rosreestr-Website ein Feld mit der Adresse des Objekts. Es wird Schwierigkeiten geben, da die Adressen in Rosreestr auf besondere Weise geöffnet werden. Dies muss im Programm berücksichtigt werden.

Fangen wir an.

Bevor Sie beginnen, erstellen Sie eine Excel-Tabelle mit den Quelldaten im folgenden Format:


Nummer-Name des Copyright-Inhabers-Adresse des Eigentums-Typs des Eigentums-Kataster-Nummernbereichs. Auf Anfrage benötigen wir alle Felder in der Tabelle mit Ausnahme von "Nummer" und "Name des Copyright-Inhabers".

Erstellen Sie jetzt eine neue Python-Datei - rosreestr.py. Und wir importieren die notwendigen Module:

import webbrowser,time from selenium import webdriver import csv from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import NoSuchElementException import openpyxl 

Öffnen Sie die Excel-Datei mit Daten zu Immobilien:

 wb = openpyxl.load_workbook('activ2.xlsx') sheet=wb.get_active_sheet() 

Wir gehen auf die Website von Rosreestr. Da sich der Zugang zum Gelände selbst möglicherweise bereits verzögert, müssen Sie eine Erwartung festlegen:

 browser = webdriver.Firefox() browser.get ('https://rosreestr.ru/') time.sleep(5) 

Hier können Sie nur time.sleep 5 Sekunden verlassen. Aber besser, unter Verwendung der Erwartungen, schreiben Sie wie folgt:

 browser.implicitly_wait(40) 

Jetzt müssen wir warten, bis die Schaltfläche in Ihrem persönlichen Konto angezeigt wird, und darauf klicken:

 act = browser.find_element_by_css_selector('#top_panel > a:nth-child(4)') act.click() 

Da die Registrierung in Ihrem persönlichen Konto über das State Services-Portal erfolgt, wird die Site zu State Services weitergeleitet, und dies geschieht auch mit Verzögerung. Beachten Sie Folgendes:

 browser.implicitly_wait(40) act = browser.find_element_by_id('mobileOrEmail') act.click() 

Jetzt autorisiert uns das Programm auf der Website des Staatsdienstes durch Eingabe eines Benutzernamens und eines Passworts (geben Sie anstelle eines Benutzernamens und eines Passworts Ihre Daten ein):

 i=0 for i in '@mail.ru': act.send_keys(i) time.sleep (0.1) act = browser.find_element_by_id('password') act.click() i=0 for i in '': act.send_keys(i) time.sleep (0.1) act = browser.find_element_by_id('loginByPwdButton') act.click() 

Nachdem das Programm die Eingabetaste gedrückt hat, wird möglicherweise vor der Autorisierung das folgende Fenster angezeigt:



Hier müssen Sie den CSS-Selektor nat auswählen. Gesichter. Erinnerst du dich, wie es geht? Klicken Sie mit der rechten Maustaste auf das Symbol Privatperson ... - erkunden Sie das Element:



Und kopieren Sie den CSS-Selektor:



Wir werden es unserem Programm hinzufügen:

 act = browser.find_element_by_css_selector('tr.not-border:nth-child(1) > td:nth-child(2) > div:nth-child(2)') act.click() 

Nachdem wir uns angemeldet haben, leitet uns der Browser von der State Services-Website zur Rosreestr-Website weiter. Dort sollte unser Programm auf den Punkt "Informationsanfrage über Immobilien und (oder) deren Eigentümer" klicken:



Wir geben den entsprechenden Code ein:

 act = browser.find_element_by_css_selector('div.services-item:nth-child(5) > div:nth-child(1) > span:nth-child(2)') act.click() act = browser.find_element_by_css_selector('div.services-item:nth-child(5) > table:nth-child(2) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2) > a:nth-child(1)') act.click() 

Wir haben die Startseite der Anfrage erreicht, auf der 5 Schritte von uns erwartet werden:



Um zum zweiten Schritt zu gelangen, müssen Sie die Seite überprüfen und auf Weiter klicken. Bezeichnen Sie dies im Code:

 act = browser.find_element_by_class_name('PGU-LabelIcon') act.click() act = browser.find_element_by_css_selector('#__nextStep') act.click() 

Wir befinden uns im 2. Schritt der Rosreestr-Website. Hier muss die Feldkategorie des Antragstellers ausgefüllt werden, alle anderen Daten werden automatisch aus dem öffentlichen Dienst abgerufen. Klicken Sie dann auf "Weiter":



Im Code sieht es so aus:

 act = browser.find_element_by_css_selector('#Form7\.step2\.specialDeclarantKind\.code > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)') act.click() act = browser.find_element_by_css_selector('#__nextStep') act.click() 

Wenn wir unser Programm ausführen, erhalten wir höchstwahrscheinlich eine Fehlermeldung:



Wir behandeln diesen Fehler wie folgt:

 try: act = browser.find_element_by_class_name('PGU-LabelIcon') except: browser.refresh() time.sleep (40) act = browser.find_element_by_class_name('PGU-LabelIcon') 

Wenn nun eine Situation auftritt, in der die Seite nicht geladen wird, aktualisiert das Programm den Browser und versucht erneut, auf das gewünschte Symbol zu klicken. Leider funktionieren die Erwartungen hier nicht und Sie müssen die alte, bewährte time.sleep () verwenden.

Wir sind am dritten Schritt und es ist der mühsamste:



Es ist notwendig, alle Felder mit dem "*" - Zeichen auszufüllen.

Beginnen wir mit der Eingabe des Objekts:

 n=1 i=sheet['B'+str(n)].value #i=input(". 1- .2-.3-.4-.5- : ") if i==' ': #1- act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)') act.click() #  act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.area > div:nth-child(1) > div:nth-child(4) > div:nth-child(1) > div:nth-child(2) > input:nth-child(1)') act.click() for i in str(sheet['E'+str(n)].value): act.send_keys(i) time.sleep (0.1) act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.area\.unit > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)') act.click() elif i=='': #2- act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(3)') act.click() act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectPurposeCode > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)') act.click() elif i=='': #3- act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(4)') act.click() act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.roomPurposeCode > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(3)') act.click() elif i=='': #4- act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(5)') act.click() elif i==' ': #5-  act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.objectTypeCode > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(6)') act.click() 

Hier beginnen wir mit einer Zelle in Excel, in die der Name des Objekts geschrieben ist. Wenn beispielsweise "Landplot" in die Zelle eingegeben wird, wählt das Programm das entsprechende Element mit der CSS-Auswahl aus. Alles passiert auch mit anderen Arten von Objekten in der Zelle - das Programm verarbeitet sie.

Als nächstes klicken wir auf die CSS-Selektoren der Katasternummer, des Anweisungstyps und der Adresse der Objekte. Diese Selektoren sind für alle Objekte gleich:

 #  -   excel  act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180 > div:nth-child(1) > div:nth-child(4) > div:nth-child(6) > div:nth-child(2) > input:nth-child(1)') act.click() for i in sheet['C'+str(n)].value: act.send_keys(i) time.sleep (0.1) time.sleep(2) #  act = browser.find_element_by_css_selector('#Form7\.step3\.extractDataRequestType1 > div:nth-child(2) > div:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.opened > div:nth-child(3) > div:nth-child(1) > div:nth-child(2)') act.click() #   act = browser.find_element_by_css_selector('#Form7\.step3\.objectsList\.panel1180\.addressesList\[0\]\.address > div:nth-child(2) > div:nth-child(2) > a:nth-child(1) > span:nth-child(1)') act.click() act = browser.find_element_by_css_selector('.fias_input_search') act.click() 

Jetzt müssen Sie die Adresse fahren:

 for i in sheet['D'+str(n)].value: act.send_keys(i) time.sleep (0.1) print(sheet['D'+str(n)].value) i=input(" eneter            enter: ") act = browser.find_element_by_css_selector('a.button-custom:nth-child(2)') act.click() 

Die Adresse stammt aus Spalte C der Excel-Tabelle. Es gibt eine Pause in Form einer Wiederbelebung von Benutzeraktionen. Dies liegt an der Tatsache, dass die Adresse in Rosreestr möglicherweise von der von Ihnen angegebenen Adresse abweicht und dies höchstwahrscheinlich ist. Daher erwartet das Programm, das die Adresse aus der Tabelle auf der Site eingibt, dass der Benutzer im Interpreter die Eingabetaste drückt, um fortzufahren.

Die verbleibenden Schritte auf dem Rosreestr-Portal sind am wenigsten bemerkenswert. Dort klickt das Programm einfach auf die Schaltflächen im "Weiter" -Portal und sendet die Anfrage an das Rosreestr:

 #  act = browser.find_element_by_css_selector('#__nextStep > span:nth-child(1)') act.click() #   ,     act = browser.find_element_by_css_selector('#__nextStep > span:nth-child(1)') act.click() time.sleep (1) # ,    act = browser.find_element_by_css_selector('#__nextStep > span:nth-child(1)') act.click() 

Fügen Sie am Ende des Programms ein Browser-Update hinzu:

 browser.refresh() time.sleep (2) 

Wenn das Programm ordnungsgemäß funktioniert hat, muss nur ein Zyklus durch alle Zellen mit Objekten in unserer Excel-Datei gestartet werden. Fügen Sie dazu am Anfang des Blocks vor i=sheet['B'+str(n)].value :

 while True: if n<36: 

und am Ende: n+=1 , wobei n die Anzahl der Immobilien in der Excel-Tabelle ist.

Der vollständige Text des Programms kann hier eingesehen werden .

Source: https://habr.com/ru/post/de460040/


All Articles