【问题标题】:Read JSON data from API to Python从 API 读取 JSON 数据到 Python
【发布时间】:2021-03-12 18:25:38
【问题描述】:

我正在尝试从 API 数据中读取组件设置。基本上与 API 的通信是有效的。但是,我注意到并非所有我期望的值都已加载。

列表中应该有 52 个组件 (https://lignumdata.ch/?page=bauteil&bauteilgruppe=decke),但我只返回了 13 个。

API = https://lignumdata.ch/api/

我做错了什么?我无能为力....有人可以进一步帮助我吗? :)

import json
import urllib.request
import urllib.parse
import urllib



def main():
    URL = 'https://lignumdata.ch/api/v1.cfc?method=getBauteil&compatMode=true&condition={"type":"decke","bauteiltyp":["Rippen", "Balken"]}'
    
request_url = URL.replace(" ", "")
    
    print('url', request_url)

    response = urllib.request.urlopen(request_url)
    data = json.loads(response.read()) 
    #print('url', data[0])

    for output_loads in data:
        print(output_loads['laufnummer'])
                
    return


if __name__ == '__main__':
    main()

谢谢!

【问题讨论】:

    标签: json python-3.x urllib


    【解决方案1】:

    结果是分页的。您需要选择具有 page={pagenum} 的特定页面。但是,您提供的 API 提到了这一点:If authenticated, the getBauteilIndex route now accepts page=all to turn off pagination

    我不知道您使用的方法是否可以关闭分页,但即使可以,您也需要进行身份验证。

    编辑:

    基于 cmets,以下是发送经过身份验证的请求的方法:

    import request
    import base64
    
    url = "http://example.com"
    
    username = "user"    
    password = "password"
    authstr = username + ':' + password
    asciistr = authstr.encode('ascii')
    b64str = base64.b64encode(asciistr).decode()
    
    headers = {
        'Authorization': "Basic " + b64str
        }
    
    querystring = {"param1": "value", "param2": "value"}
    response = requests.request("GET", url, headers=headers, params=querystring)
    
    print(response.text)
    

    【讨论】:

    • 你打败了我。无论如何,OP 使用的条件只有 13 个结果,但是如果我删除“bauteiltyp”并且只搜索"type":"decke",我会得到 13 页结果,每页 20 个项目,这与 OP 发布的链接的结果相同,即 20 项 * 13 页 = 260 个结果
    • 这里是分页添加标题以获取所有数据的部分lignumdata.ch/api/#paging
    • 没错!如果他们允许未经身份验证的非分页结果,我会说他们的后端很糟糕。
    • 感谢您的帮助@chrisbyte!不知何故,我无法让它在我的 URL 中工作,我必须如何以及在哪里放置分页?我可以请求一个密码,我必须如何创建脚本才能使我的方法有效?
    • @MichaelBrunner 就在 API 中:lignumdata.ch/api/#toc_110 只需添加值为“basic”的“Authorization”标头,后跟“username:password”的 base64 编码。
    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多