使用Python从Rosreestr获取USRN语句,绕过api

并非首次与Rosreestr门户网站相识


任何律师都曾向Rosreestr(联邦国家注册,地籍和制图服务)提出请求。 何时需要运行到Rosreestr分支并在纸上提出请求的时代已经过去了。 Rosreestr已启动了多个在线服务,您可以在不离开家的情况下使用它们。 这些服务包括请求摘录自《房地产统一州登记簿》。 官方网站上手。

每个已经设法与该网站合作的人都知道,要从USRN接收摘录,其中不仅包含有关该设施的一般特征的信息,而且还包含有关该设施的版权持有人的信息,有必要进入Rosreestr个人帐户。

也许这是获取一个或多个语句的便捷方法。 但是,如果需要一包USRN提取物怎么办? 假设您使用不动产或拥有多个物件,这些物件的总数超过10个。通常,您每年需要至少从USRN提取1次,以便能够在法律层面上迅速对联邦登记册中发生的不良变化(如果您除外)做出回应意志。


您可以通过个人帐户手动提交请求,也可以使用Rosreestr api。 第一个选择是非常累人。 除了Rosreestra在线服务本身在持续挂起的情况下运行非常缓慢的事实之外,还邀请普通用户在提交每个请求时提交对象的字段库。 例如,请求一块地块:


也就是说,找出有关对象的信息并从中获取物理信息。 这个人必须已经知道物体的所有特征! 并且每次您请求信息时,都必须填写所有字段。 该说的话很不方便。 至少感谢您提供的土地面积可以平方毫米为单位。

从USRN获取摘录的第二种选择是Rosreestr api。 Api是一组程序指令,根据这些指令,您的软件部分和Rosreestr的一部分将在没有您参与的情况下交换信息。 如果一切正常,这很方便。 一个可以完成。

但是,如果您查看Rosreestr解释如何实现便捷api的页面,您会感到不安。

带有说明的文档发布在此处-rosreestr.ru/wps/portal/cc_ib_documents?documentId=1521

它只有19页,但是用技术语言编写,这表明我们离不开数字签名。 通常,很长一段时间以来,这是令人费解和不便的。 让我们走更短的路。

在使用Rosreestr的挂机站点时,我们需要对Python工具有一定的了解。 至少在此服务Rosreestra开发的当前阶段,最适合与该站点合作的工具。

当页面缓慢加载到浏览器中时,该页面上的元素可能会以不同的时间间隔出现(或根本不出现)。 这使查找元素变得困难;会定期引发ElementNotVisibleException或NoSuchElement异常。 使用期望,我们可以解决这个问题。

等待为执行的操作之间提供了一定的时间间隔-搜索元素或对该元素进行任何其他操作。

由于我们在工作中使用了硒模块,因此我们将使用它提供的功能。 硒提供两种类型的期望-隐性和显性。

显式等待是用于确定为了进一步执行代码而必须发生的条件的代码。 之前我们使用time.sleep()来设置确切的超时时间。 但是此选项并不完全成功。 不利的一面是,如果您不猜测停机时间(睡眠),程序将崩溃。 有更方便的方法可以帮助您编写期望的代码。

我们正在编写一个与在线Rosreestr合作的程序


让我们继续我们的程序。

其实质是,在进入Rosreestr网站时,她通过自然人的个人帐户登录。 人员,并进一步开始独立提交USRN摘录要求。 我们的程序将接收来自Excel文件的请求数据(没有它的地方)。 一个警告。 提交请求时,Rosreestr网站上的字段包含对象的地址。 由于Rosreestr中的地址是以特殊方式打开的,因此会遇到困难。 在程序中必须考虑到这一点。

让我们开始吧。

在开始之前,请准备一个具有以下格式的源数据的excel表:


版权持有人的姓名名称-财产的地址-财产地籍编号-区域。 根据要求,我们将需要表格中的所有字段,“编号”和“版权所有者名称”除外。

现在创建一个新的python文件-rosreestr.py。 然后我们导入必要的模块:

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

打开包含房地产数据的excel文件:

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

我们转到Rosreestr网站。 由于网站本身的入口可能已经延迟,因此您需要设定一个期望值:

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

在这里您可以只剩下time.sleep 5秒。 但是更好的是,使用期望,这样写:

 browser.implicitly_wait(40) 

现在,我们需要等待该按钮出现在您的个人帐户中,然后单击它:

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

由于您的个人帐户注册是通过State Services门户网站进行的,因此该网站会重定向到State Services,而且这种情况也会延迟,请考虑以下几点:

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

现在,该程序将通过输入用户名和密码(而不是用户名和密码,输入您的数据)在国家服务局的网站上为我们授权:

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

在程序按下回车按钮之后,授权之前可能会出现以下窗口:



在这里,您需要选择CSS选择器nat。 面孔。 还记得怎么做吗? 右键单击图标私人...-探索元素:



并复制CSS选择器:



我们将其添加到我们的程序中:

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

现在我们已经登录,浏览器将把我们从国家服务网站重定向到Rosreestr网站。 在这里,我们的程序应点击“请求获得有关房地产和(或)其所有者的信息”项:



我们将输入适当的代码:

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

我们到达了提交请求的开始页面,我们可以从中完成5个步骤:



要转到第二步,您需要检查页面并单击下一步。 用代码表示:

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

我们位于Rosreestr网站的第二步。 在这里,必须填写申请人的字段类别,所有其他数据都会自动从公共服务中提取。 然后点击“下一步”:



在代码中,它看起来像这样:

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

如果我们运行程序,则很可能会出现错误:



我们按以下方式处理此错误:

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

现在,如果出现无法加载页面的情况,程序将更新浏览器,然后再次尝试单击所需的图标。 不幸的是,期望在这里行不通,您必须使用经过验证的旧时间。sleep()。

我们处于第三步,这是最费力的:



必须使用“ *”符号填写所有字段。

让我们从输入对象开始:

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

在这里,我们从excel中的一个单元格开始,在该单元格中写入了对象的名称。 例如,如果在单元格中输入了“土地图”,则程序将使用css选择器选择适当的项目。 一切也与单元格中的其他种类的对象一起发生-程序对其进行处理。

接下来,我们单击对象的地籍编号,语句类型和地址的css选择器,这些选择器对于所有对象都是相同的:

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

现在您需要驱动地址:

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

该地址取自excel表的C列。 恢复用户操作的形式存在暂停。 这是由于Rosreestr中的地址可能与您所拥有的地址不同,并且很可能是这样。 因此,该程序从站点上的表中输入地址,将期望用户在解释器中按Enter键以继续操作。

Rosreestr门户上的其余步骤是最不重要的,该程序只需单击“ Next”门户上的按钮,然后将请求发送到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() 

在程序末尾,添加浏览器更新:

 browser.refresh() time.sleep (2) 

如果程序正常运行,则只剩下开始在我们的excel文件中包含对象的所有单元格之间进行循环。 为此,请在i=sheet['B'+str(n)].value之前的程序段开始处添加i=sheet['B'+str(n)].value

 while True: if n<36: 

最后: n+=1 ,其中n是excel表中的不动产数量。

该程序的全文可以在这里查看。

Source: https://habr.com/ru/post/zh-CN460040/


All Articles