RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1606754
Accepted
Михаил Ширшов
Михаил Ширшов
Asked:2025-02-12 16:03:27 +0000 UTC2025-02-12 16:03:27 +0000 UTC 2025-02-12 16:03:27 +0000 UTC

API NSPD。数据输出问题

  • 772

这是代码

import httpx
from datetime import datetime
import asyncio

async def fetch_data(url, client):
    """Функция для асинхронного получения данных по URL с повторными попытками"""
    response = await client.get(url, timeout=30)
    await asyncio.sleep(2)
    if response.status_code == 200:
        return response.json()

async def api_nspd_json(code):
    result_parts_zu = None
    objectsList = None
    result_string = None
    pomList = None
    mashList = None
    landLinks = None
    buildParts = None
    permissionType = None
    result = {}
    code = code.replace(':', '%3A')
    url = f'https://nspd.gov.ru/api/geoportal/v2/search/geoportal?thematicSearchId=1&query={code}'

    async with httpx.AsyncClient(verify=False) as client:
        response_data = await fetch_data(url, client)
        
        if not response_data or 'data' not in response_data or 'features' not in response_data['data']:
            result['message'] = 'Объект не найден в НСПД, возможно снят с учета или ввели не правильно кадастровый номер.'
            return result, result_parts_zu, objectsList, result_string, pomList, mashList, landLinks, buildParts, permissionType
        
        coordinates = 'Без координат'
        for feature in response_data['data']['features']:
            if feature['geometry']['type'] == 'Polygon':
                coordinates = 'С координатами'

        properties = response_data['data']['features'][0]['properties']['options']
        feature_id = response_data['data']['features'][0]['id']
        category_id = response_data['meta'][0]['categoryId']
        
        async def get_tab_values(url):
            tab_data = await fetch_data(url, client)
            print(tab_data)
            if not tab_data:
                return "Нет данных"
            title = tab_data.get("title", "Нет заголовка")
            values = tab_data.get("value", [])
            values = [value for value in values if value]
            return f"{title}: <code>{', '.join(values)}</code>" if values else "Нет данных"

        if category_id == 36368:  # ЗУ
            result_parts_zu = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landParts&categoryId={category_id}&geomId={feature_id}')
            objectsList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-group-data?tabClass=objectsList&categoryId={category_id}&geomId={feature_id}')
        elif category_id == 36384:  # ОНС
            landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&categoryId=36384&geomId={feature_id}')
        elif category_id == 36383:  # Сооружения
            pomList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&categoryId=36383&geomId={feature_id}')
            mashList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=buildParts&categoryId=36383&geomId={feature_id}')
            buildParts = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=permissionType&categoryId=36383&geomId={feature_id}')
        elif category_id == 36369:  # ОКС
            permissionType = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=permissionType&categoryId=36369&geomId={feature_id}')

        for key, value in properties.items():
            if key == 'registersId' and value == 36440:
                result_string = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=compositionLand&objdocId={feature_id}&registersId=36440')
            elif key == 'registersId' and value == 36441:
                landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&objdocId={feature_id}&registersId=36441')
                objectsList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-group-data?tabClass=objectsList&objdocId={feature_id}&registersId=36441')
            elif key == 'registersId' and value == 36453:
                landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&objdocId={feature_id}&registersId=36453')
                buildParts = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=buildParts&objdocId={feature_id}&registersId=36453')

            if isinstance(value, str):
                if len(value) == 10 and value[4] == '-' and value[7] == '-':
                    date_obj = datetime.strptime(value, '%Y-%m-%d')
                    formatted_date = date_obj.strftime('%d.%m.%Y')
                    result[key] = formatted_date
                elif len(value) == 20 and value[10] == 'T' and value[-1] == 'Z':
                    date_obj = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
                    formatted_date = date_obj.strftime('%d.%m.%Y')
                    result[key] = formatted_date
                elif isinstance(value, list):
                    result[key] = ', '.join(value) if value else None
                elif value not in [None, ""]:
                    result[key] = value
        
        result['coordinates'] = coordinates
    return result, result_parts_zu, objectsList, result_string, pomList, mashList, landLinks, buildParts, permissionType



async def main():
    result = await api_nspd_json("52:51:0010002:1139")
if __name__ == '__main__':
    asyncio.run(main())

地籍号 52:51:0010002:1139 是一栋包含房屋的公寓楼。主要 API 是

code = code.replace(':', '%3A')
    url = f'https://nspd.gov.ru/api/geoportal/v2/search/geoportal?thematicSearchId=1&query={code}'

您可以通过它从 NSPD 中获取其他数据: 在此处输入图片描述

在代码中是这样写的(我马上就说这些并不是所有的链接,将来我会“剪切”代码):

if category_id == 36368:  # ЗУ
            result_parts_zu = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landParts&categoryId={category_id}&geomId={feature_id}')
            objectsList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-group-data?tabClass=objectsList&categoryId={category_id}&geomId={feature_id}')
        elif category_id == 36384:  # ОНС
            landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&categoryId=36384&geomId={feature_id}')
        elif category_id == 36383:  # Сооружения
            pomList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&categoryId=36383&geomId={feature_id}')
            mashList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=buildParts&categoryId=36383&geomId={feature_id}')
            buildParts = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=permissionType&categoryId=36383&geomId={feature_id}')
        elif category_id == 36369:  # ОКС
            permissionType = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=permissionType&categoryId=36369&geomId={feature_id}')

        for key, value in properties.items():
            if key == 'registersId' and value == 36440:
                result_string = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=compositionLand&objdocId={feature_id}&registersId=36440')
            elif key == 'registersId' and value == 36441:
                landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&objdocId={feature_id}&registersId=36441')
                objectsList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-group-data?tabClass=objectsList&objdocId={feature_id}&registersId=36441')
            elif key == 'registersId' and value == 36453:
                landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&objdocId={feature_id}&registersId=36453')
                buildParts = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=buildParts&objdocId={feature_id}&registersId=36453')

通过地籍编号 52:51:0010002:1139,我找到了键(如果存在)'registersId'等于 36441,在这种情况下,请求是通过链接发出的

elif key == 'registersId' and value == 36441:
                landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&objdocId={feature_id}&registersId=36441')
                objectsList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-group-data?tabClass=objectsList&objdocId={feature_id}&registersId=36441')

并通过引用objectsList应该提供与建筑物相关的处所的信息(它们位于NSPD本身中),但它在代码中给出了它

async def get_tab_values(url):
            tab_data = await fetch_data(url, client)
            print(tab_data)

由于某种原因,一开始为 None(第一次请求时出现错误 505),然后(好像在重复连接时)数据本身 {'title': '对象列表', 'object': [{'title': '房间(数量)', 'value': ['4']}, {'title': '停车位(数量)', 'value': ['']}, {'title': '房间(列表)', 'value': ['52:51:0010002:1374', '52:51:0010002:1375', '52:51:0010002:1376', '52:51:0010002:1377']}, {'title': '停车位(列表)','值':['']}]}。这个 None 破坏了一切,我通过明确的等待、通过反复的重新连接来处理它,但它仍然先给出 None 然后再给出数据。

None 如何处理?请帮忙

后来我制作了一个带有内联按钮和回调的机器人,当请求时,它不会显示带有房间的按钮(因为这个 None )

python
  • 1 1 个回答
  • 95 Views

1 个回答

  • Voted
  1. Best Answer
    Михаил Ширшов
    2025-02-13T12:57:50Z2025-02-13T12:57:50Z

    感谢@gord1402 的回答,我得到了这个代码,我还没有在所有类型的物体上尝试过它,我会单独检查:

    import httpx
    from datetime import datetime
    import asyncio
    
    async def fetch_data(url, client):
        try:
            response = await client.get(url, timeout=60)
            if response.status_code == 200:
                return response.json()
        except Exception as e:
            print(f"def fetch_data {url}: {e}")
            pass
    
    async def api_nspd_json(code):
        result_parts_zu = None
        objectsList = None
        result_string = None
        pomList = None
        mashList = None
        landLinks = None
        buildParts = None
        permissionType = None
        result = {}
        code = code.replace(':', '%3A')
        url = f'https://nspd.gov.ru/api/geoportal/v2/search/geoportal?thematicSearchId=1&query={code}'
    
        async with httpx.AsyncClient(verify=False) as client:
            response_data = await fetch_data(url, client)
            
            if not response_data or 'data' not in response_data or 'features' not in response_data['data']:
                result['message'] = 'Объект не найден в НСПД, возможно снят с учета или ввели не правильно кадастровый номер.'
                return result, result_parts_zu, objectsList, result_string, pomList, mashList, landLinks, buildParts, permissionType
            
            coordinates = 'Без координат'
            for feature in response_data['data']['features']:
                if feature['geometry']['type'] == 'Polygon':
                    coordinates = 'С координатами'
    
            properties = response_data['data']['features'][0]['properties']['options']
            feature_id = response_data['data']['features'][0]['id']
            category_id = response_data['meta'][0]['categoryId']
            async def get_tab_values(url):
                tab_data = await fetch_data(url, client)
                if not tab_data:
                    return "Нет данных"
                
                title = tab_data.get("title", "Нет заголовка")
                if 'object' in tab_data:
                    objects = tab_data['object']
                    if objects:
                        values_list = []
                        for obj in objects:
                            if obj["title"] in ["Помещения (список)", "Машино-места (список)"]:
                                values = obj.get("value", [])
                                values = [value for value in values if value]
                                if values:
                                    values_list.append(';'.join(values))
                        all_values_string = ', '.join(values_list)
                        return f"{title}: <code>{all_values_string}</code>" if all_values_string else "Нет данных"
                elif 'value' in tab_data:
                    values = tab_data.get("value", [])
                    values = [value for value in values if value]
                    if values:
                        return f"{title}: <code>{';'.join(values)}</code>"
                return "Нет данных"
    
            if category_id == 36368:  # ЗУ
                result_parts_zu = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landParts&categoryId={category_id}&geomId={feature_id}')
                objectsList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-group-data?tabClass=objectsList&categoryId={category_id}&geomId={feature_id}')
            elif category_id == 36384:  # ОНС
                landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&categoryId=36384&geomId={feature_id}')
            elif category_id == 36383:  # Сооружения
                pomList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&categoryId=36383&geomId={feature_id}')
                mashList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=buildParts&categoryId=36383&geomId={feature_id}')
                buildParts = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=permissionType&categoryId=36383&geomId={feature_id}')
            elif category_id == 36369:  # ОКС
                permissionType = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=permissionType&categoryId=36369&geomId={feature_id}')
    
            for key, value in properties.items():
                if key == 'registersId' and value == 36440:
                    result_string = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=compositionLand&objdocId={feature_id}&registersId=36440')
                elif key == 'registersId' and value == 36441:
                    landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&objdocId={feature_id}&registersId=36441')
                    objectsList = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-group-data?tabClass=objectsList&objdocId={feature_id}&registersId=36441')
                elif key == 'registersId' and value == 36453:
                    landLinks = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=landLinks&objdocId={feature_id}&registersId=36453')
                    buildParts = await get_tab_values(f'https://nspd.gov.ru/api/geoportal/v1/tab-values-data?tabClass=buildParts&objdocId={feature_id}&registersId=36453')
    
                if isinstance(value, str):
                    if len(value) == 10 and value[4] == '-' and value[7] == '-':
                        date_obj = datetime.strptime(value, '%Y-%m-%d')
                        formatted_date = date_obj.strftime('%d.%m.%Y')
                        result[key] = formatted_date
                    elif len(value) == 20 and value[10] == 'T' and value[-1] == 'Z':
                        date_obj = datetime.strptime(value, '%Y-%m-%dT%H:%M:%SZ')
                        formatted_date = date_obj.strftime('%d.%m.%Y')
                        result[key] = formatted_date
                    elif isinstance(value, list):
                        result[key] = ', '.join(value) if value else None
                    elif value not in [None, ""]:
                        result[key] = value
            
            result['coordinates'] = coordinates
        return result, result_parts_zu, objectsList, result_string, pomList, mashList, landLinks, buildParts, permissionType
    

    然后我也会按区域发布它(按领土,安全等),就这样,也许有人会需要它(但我会在那里提取某些数据(我需要的):

    value_dict = {(3, 4): 4,
                (6, 8, 9, 10, 11, 15): 5,
                (7,): 7}
    
    async def check_numbers_in_dict(number, value_dict):
        for key in value_dict.keys():
            if number in key:
                return value_dict[key]
        return None
    
    async def nspd_zone():
        mix = DatabaseMixin(db_path)
        try:
            result = await mix.select_kpt()
            for item in tqdm(result, desc='Зоны', total=len(result)):
                reg_numb = item[0]
                parts = reg_numb.split('-')
                if len(parts) > 1:
                    second_part = parts[1].split('.')
                    if second_part:
                        number_str = second_part[0]
                        if number_str.isdigit():
                            number = int(number_str)
                            value = await check_numbers_in_dict(number, value_dict)
                            if value is not None:
                                try:
                                    reg_numb_r = reg_numb.replace(':', '%3A')
                                    url = f'https://nspd.gov.ru/api/geoportal/v2/search/geoportal?query={reg_numb_r}&thematicSearchId={value}'
                                    async with httpx.AsyncClient(verify=False) as client:
                                        response = await client.get(url, timeout=10)
                                        if response.status_code == 404:
                                            pass
                                        elif response.status_code == 200:
                                            data = response.json()
                                            properties = data['data']['features'][0]['properties']
                                            category_name = properties.get('categoryName', None)
                                            description = properties.get('options', {}).get('description', None)
                                            name_district = properties.get('options', {}).get('name_district', None)
                                            name_locality = properties.get('options', {}).get('name_locality', None)
                                            name_by_doc = properties.get('options', {}).get('name_by_doc', None)
                                            legal_act_document_issuer = properties.get('options', {}).get('legal_act_document_issuer', None)
                                            type_zone = properties.get('options', {}).get('type_zone', None)
                                            name = properties.get('options', {}).get('name', None)
                                            await mix.update_kpt(reg_numb, category_name, description, name_district, name_locality, name_by_doc, legal_act_document_issuer, type_zone, name)
                                except Exception as e:
                                    pass
                            else:
                                print(f"Число {number} не найдено в строке '{reg_numb}'.")
        finally:
            await mix.close_connection()
    
    asyncio.run(nspd_zone())
    

    以下是部分代码,从 DB result = await mix.select_kpt() 中取出区域号,例如“52:51-3.103 52:51-4.159 52:00-15.9 52:51-7.29”,分为 4、3、15、7 等,然后根据字典 value_dict 进行检查,并代入链接 &thematicSearchId={value}

    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5