Python:请求 json 出错 - 如果使用所有标量值,则必须传递索引

Posted

技术标签:

【中文标题】Python:请求 json 出错 - 如果使用所有标量值,则必须传递索引【英文标题】:Python: request json gets error - If using all scalar values, you must pass an index 【发布时间】:2021-08-01 05:53:15 【问题描述】:

当尝试从 API 请求 json 文件时,我在得到第一个结果后出现错误。

有人知道为什么要从列表中获取索引吗?

最好的问候:)

import requests
import json
import pandas as pd
import time
import datetime

### OCs List ids
OCs = ['1003473-1116-SE21','1003473-1128-AG21','1031866-12-CC21','1057440-3184-AG21','1070620-1832-CM21', '1070620-2219-SE21', '1070620-2499-CM21']

for i in OCs:
    link ="http://api.mercadopublico.cl/servicios/v1/publico/ordenesdecompra.json?codigo="+ str(i) +"&ticket=F8537A18-6766-4DEF-9E59-426B4FEE2844"
    response = requests.get(link, [])
    data = response.json()
    
    df = pd.DataFrame.from_dict(data) 
    
    ### remove unnecessary columns
    df.drop(df.columns[[0,1,2]],axis=1, inplace=True)
         
    ### flat json to pandas dataframe
    df_detail = pd.json_normalize(df['Listado'])


ValueError: If using all scalar values, you must pass an index
 

【问题讨论】:

【参考方案1】:

服务器检测到太多请求并发送错误响应(然后您的脚本抛出错误)。解决方法是等待正确响应,例如:

import requests
import json
import pandas as pd
import time
import datetime

### OCs List ids
OCs = [
    "1003473-1116-SE21",
    "1003473-1128-AG21",
    "1031866-12-CC21",
    "1057440-3184-AG21",
    "1070620-1832-CM21",
    "1070620-2219-SE21",
    "1070620-2499-CM21",
]

for i in OCs:
    link = (
        "http://api.mercadopublico.cl/servicios/v1/publico/ordenesdecompra.json?codigo="
        + str(i)
        + "&ticket=F8537A18-6766-4DEF-9E59-426B4FEE2844"
    )

    while True:   # <--- repeat until we get correct response
        print(link)
        response = requests.get(link, [])
        data = response.json()

        if "Listado" in data:
            break

        time.sleep(3)   # <--- wait 3 seconds and try again

    df = pd.DataFrame.from_dict(data)

    ### remove unnecessary columns
    df.drop(df.columns[[0, 1, 2]], axis=1, inplace=True)

    ### flat json to pandas dataframe
    df_detail = pd.json_normalize(df["Listado"])

    # ...

【讨论】:

以上是关于Python:请求 json 出错 - 如果使用所有标量值,则必须传递索引的主要内容,如果未能解决你的问题,请参考以下文章

Spotify API:使用 Python 通过 JSON 解析时出错

python requests库中的post详解

向 Controller 发送 Ajax 请求时出错,它不是 json 类型

使用 Spotify API 时“解析 JSON 时出错”

Python 网络爬虫程序架构及运行流程

使用axios请求数据,post请求出错。因为axios传递的请求参数是json格式,而后端接口要求是formData