Obtenez la déclaration USRN de Rosreestr en utilisant python, en contournant l'api

Pas la première connaissance du portail Rosreestr


Tout avocat a déjà fait une demande à Rosreestr (Service fédéral d'enregistrement des états, de cadastre et de cartographie). Le temps où pour une demande il fallait se présenter à la succursale Rosreestr et déposer une demande sur papier appartient au passé. Rosreestr a lancé plusieurs services en ligne que vous pouvez utiliser sans quitter votre domicile. Ces services comprennent une demande d'extrait du Registre d'État unifié de l'immobilier. Site officiel pour commencer.

Quiconque a déjà réussi à travailler avec le site sait que pour recevoir un extrait de l'USRN, qui contiendra des informations non seulement sur les caractéristiques générales de l'installation, mais également sur le détenteur des droits d'auteur de cette installation, il est nécessaire de se rendre sur le compte personnel de Rosreestr.

C'est peut-être un moyen pratique d'obtenir une ou plusieurs déclarations. Cependant, que faire si vous avez besoin d'un paquet d'extraits d'USRN? Supposons que vous travaillez avec des biens immobiliers ou que vous possédez un certain nombre d'objets, dont le nombre total est supérieur à 10. En règle générale, vous devez recevoir un extrait de l'USRN au moins 1 fois par an afin de pouvoir réagir rapidement dans le plan juridique aux modifications indésirables du registre fédéral si elles se produisent en plus des vôtres la volonté.


Vous pouvez soumettre manuellement des demandes via votre compte personnel, ou vous pouvez utiliser l'API Rosreestr. La première option est extrêmement fatigante. En plus du fait que le service en ligne Rosreestra lui-même fonctionne très lentement avec des blocages constants, l'utilisateur ordinaire est également invité à soumettre un arsenal de champs pour l'objet lors de la soumission de chaque demande. Par exemple, une demande de terrain:


Autrement dit, pour trouver des informations sur l'objet et en obtenir un extrait, physique. la personne doit déjà connaître toutes les caractéristiques de l'objet! Et chaque fois que vous demandez des informations, vous devez remplir tous les champs. Que dire est très gênant. Merci d'avoir au moins prévu que le terrain puisse être mesuré en millimètres carrés.

La deuxième option pour obtenir des extraits de l'USRN est l'API Rosreestr. Api est un ensemble d'instructions du programme, selon lequel votre partie logicielle et partie de Rosreestr échangent des informations sans votre participation. Une chose pratique si tout fonctionne correctement. Et on pourrait finir.

Cependant, si vous regardez la page où Rosreestr explique comment implémenter une API pratique, vous vous sentez mal à l'aise.

Un document avec une description est publié ici - rosreestr.ru/wps/portal/cc_ib_documents?documentId=1521

Il ne prend que 19 pages, mais est écrit en langage technique et suggère que nous ne pouvons pas nous passer d'une signature numérique. En général, pendant longtemps, c'est incompréhensible et incommode. Allons plus loin.

Lorsque nous travaillons avec le site suspendu de Rosreestr, nous avons besoin d'une compréhension d'un tel outil Python que les attentes. L'outil le plus approprié pour travailler avec ce site, au moins au stade actuel de développement de ce service Rosreestra.

Lorsqu'une page se charge lentement chargée dans un navigateur, les éléments de cette page peuvent apparaître à différents intervalles de temps (ou ne pas apparaître du tout). Cela rend difficile la recherche d'éléments; une exception ElementNotVisibleException ou NoSuchElement est levée périodiquement. En utilisant les attentes, nous pouvons résoudre ce problème.

L'attente donne un certain intervalle de temps entre les actions effectuées - la recherche d'un élément ou toute autre opération avec l'élément.

Puisque nous utilisons le module sélénium dans notre travail, nous travaillerons avec ce qu'il offre. Le sélénium fournit deux types d'attentes - implicites et explicites.

L'attente explicite est le code par lequel vous déterminez quelle condition doit se produire pour que du code supplémentaire soit exécuté. Plus tôt, nous avons utilisé time.sleep (), qui définit le délai d'expiration exact. Mais cette option n'est pas entièrement réussie. L'inconvénient est que si vous ne devinez pas le temps d'arrêt (sommeil), le programme plantera. Il existe des méthodes plus pratiques qui peuvent vous aider à écrire du code qui attend autant que vous en avez besoin.

Nous écrivons un programme pour travailler avec le Rosreestr en ligne


Passons à notre programme.

Son essence est que lorsqu'elle accède au site Web de Rosreestr, elle se connecte via le compte personnel d'une personne physique. personnes et a en outre commencé à soumettre de manière indépendante des demandes d'extraits de l'USRN. Notre programme recevra des données pour les demandes d'un fichier Excel (où serait-il sans lui). Une mise en garde. Lors de la soumission d'une demande, le site Web Rosreestr dispose d'un champ avec l'adresse de l'objet. Il y aura des difficultés, car les adresses de Rosreestr sont ouvertes de manière spéciale. Cela devra être pris en compte dans le programme.

Commençons.

Avant de commencer, préparez un tableau Excel avec les données source au format suivant:


Numéro-nom du titulaire du droit d'auteur-adresse de la propriété-type de propriété-numéro cadastral-zone. Sur demande, nous aurons besoin de tous les champs du tableau à l'exception de «numéro» et «nom du titulaire du droit d'auteur».

Créez maintenant un nouveau fichier python - rosreestr.py. Et nous importons les modules nécessaires:

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

Ouvrez le fichier Excel avec des données sur l'immobilier:

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

Nous allons sur le site Web de Rosreestr. Étant donné que l'entrée du site lui-même peut déjà être retardée, vous devez définir une attente:

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

Ici, vous pouvez laisser juste time.sleep 5 secondes. Mais mieux, en utilisant les attentes, écrivez comme ceci:

 browser.implicitly_wait(40) 

Maintenant, nous devons attendre que le bouton apparaisse dans votre compte personnel et cliquez dessus:

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

Étant donné que l'enregistrement dans votre compte personnel s'effectue via le portail des services d'État, le site redirige vers les services d'État et cela se produit également avec un retard, considérez ceci:

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

Maintenant, le programme nous autorisera sur le site Web du Service d'État en entrant un nom d'utilisateur et un mot de passe (au lieu d'un nom d'utilisateur et d'un mot de passe, entrez vos données):

 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() 

Une fois que le programme a appuyé sur le bouton Entrée, la fenêtre suivante peut apparaître avant l'autorisation:



Ici, vous devez sélectionner le sélecteur CSS nat. visages. Rappelez-vous comment faire? Faites un clic droit sur l'icône Personne privée ... - explorez l'élément:



Et copiez le sélecteur CSS:



Nous l'ajouterons à notre programme:

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

Maintenant que nous sommes connectés, le navigateur nous redirigera du site Web des services d'État vers le site Web de Rosreestr. Là, notre programme doit cliquer sur l'élément "Demande d'informations sur l'immobilier et (ou) leurs propriétaires":



Nous entrerons le code approprié:

 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() 

Nous sommes arrivés à la page de démarrage de la soumission d'une demande, où 5 étapes sont attendues de notre part:



Pour passer à la deuxième étape, vous devez vérifier la page et cliquer sur suivant. Notons cela dans le code:

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

Nous sommes à la 2ème étape du site Rosreestr. Ici, il est nécessaire de remplir la catégorie de champ du demandeur, toutes les autres données sont automatiquement extraites de la fonction publique. Cliquez ensuite sur «Suivant»:



En code, cela ressemble à ceci:

 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() 

Si nous exécutons notre programme, nous obtiendrons très probablement une erreur:



Nous traitons cette erreur comme suit:

 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') 

Maintenant, si une situation survient dans laquelle la page ne se charge pas, le programme mettra à jour le navigateur et réessayera de cliquer sur l'icône souhaitée. Malheureusement, les attentes ne fonctionnent pas ici et vous devez utiliser l'ancien time.sleep () éprouvé.

Nous sommes à la troisième étape et c'est la plus laborieuse:



Il est nécessaire de remplir tous les champs avec le signe "*".

Commençons par saisir l'objet:

 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() 

Ici, nous commençons avec une cellule dans Excel, où nous avons le nom de l'objet écrit. Si, par exemple, «Terrain» est entré dans la cellule, le programme sélectionne l'élément approprié à l'aide du sélecteur css. Tout se passe également avec d'autres types d'objets dans la cellule - le programme les traite.

Ensuite, nous cliquons sur les sélecteurs css du numéro cadastral, du type de relevé et de l'adresse des objets, ces sélecteurs sont les mêmes pour tous les objets:

 #  -   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() 

Vous devez maintenant conduire l'adresse:

 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() 

L'adresse est extraite de la colonne C du tableau Excel. Il y a une pause sous la forme d'une relance des actions des utilisateurs. Cela est dû au fait que l'adresse dans Rosreestr peut différer de l'adresse que vous avez et très probablement. Par conséquent, le programme, en entrant l'adresse à partir du tableau sur le site, attendra de l'utilisateur qu'il appuie sur Entrée dans l'interpréteur pour continuer.

Les étapes restantes sur le portail Rosreestr sont les moins remarquables, là le programme clique simplement sur les boutons du portail "Suivant" et envoie la demande au 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() 

À la fin du programme, ajoutez une mise à jour du navigateur:

 browser.refresh() time.sleep (2) 

Si le programme a fonctionné correctement, il ne reste plus qu'à démarrer un cycle à travers toutes les cellules avec des objets dans notre fichier Excel. Pour ce faire, ajoutez au début du bloc avant i=sheet['B'+str(n)].value

 while True: if n<36: 

et à la fin: n+=1 , où n est le nombre de biens immobiliers dans le tableau Excel.

Le texte intégral du programme peut être consulté ici .

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


All Articles