迭代 json api 并将结果附加到 pandas 数据框

Iterate over json api and append results to pandas dataframe

我正在尝试将 Excel 数据加载到 Pandas DataFrame 中,然后将 ip_address 从 DataFrame 推送到 api returns以 json 格式返回信息,然后将 json 的结果追加回原始 DataFrame - 我将如何执行此操作,遍历数据帧中的每一行并每次追加结果?

初始数据帧:

date | ip | name
date1 | ip1 | name1
date2 | ip2 | name2

json:

{
    "status": "ok",
    "8.8.8.8": {
        "proxy": "yes",
        "type": "VPN",
        "provider": "Google Inc",
        "risk": 66
    }
}

代码:

df = pd.read_excel (r'test_data.xlsx')

def query_api(ip_address):
    risk_score = None
    vpn_score = None
    api_key = "xxx"
    base_url = "http://falseacc.com/"
    endpoint = f"{base_url}{ip_address}?key={api_key}&risk=1&vpn=1"
    r = requests.get(endpoint)
    if r.status_code not in range(200, 299):
        return None, None
    try:
        with urllib.request.urlopen(endpoint) as url:
            data = json.loads(url.read().decode())
            proxy = (data[ip_address]['proxy'])
            type = (data[ip_address]['type'])
            risk = (data[ip_address]['risk'])
            df2 = pd.Dataframe({"ip":[ip_address],
                                "proxy":[proxy],
                                "type":[type],
                                "risk":[risk]})
            print(df2)
    except:
        print("No data")

预期输出: 数据框:

date | ip | name | proxy | type | risk
date1 | ip1 | name1 | proxy1 | type1 | risk1
date2 | ip2 | name2 | proxy2 | type2 | risk2

您可以使用 pandas Series.apply 方法从您的数据框中选取每个 ip,并获取 代理,键入, risk 值对应于您的 query_api 函数。然后最后给相应的列赋值:

df = pd.read_excel (r'test_data.xlsx')

def query_api(ip_address):
    risk_score = None
    vpn_score = None
    api_key = "xxx"
    base_url = "http://falseacc.com/"
    endpoint = f"{base_url}{ip_address}?key={api_key}&risk=1&vpn=1"
    r = requests.get(endpoint)
    if r.status_code not in range(200, 299):
        return pd.Series([None]*3)
    try:
        with urllib.request.urlopen(endpoint) as url:
            data = json.loads(url.read().decode())
            proxy = (data[ip_address]['proxy'])
            type = (data[ip_address]['type'])
            risk = (data[ip_address]['risk'])
            return pd.Series([proxy, type, risk])
            
    except:
        return pd.Series([None]*3)


df[['proxy','type','risk']] = df.ip.apply(query_api)

查看官方 docs 了解 pandas.Series.apply 的工作原理。

我还建议不要在代码中使用 type 作为变量名,因为它掩盖了 python 中内置的 type 函数