【问题标题】:Iterate over json api and append results to pandas dataframe遍历 json api 并将结果附加到 pandas 数据帧
【发布时间】:2021-05-31 16:30:44
【问题描述】:

我正在尝试将 Excel 数据加载到 Pandas DataFrame 中,然后将 ip_address 从 DataFrame 推送到以 json 格式返回信息的 api,然后将 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

【问题讨论】:

  • API是否允许同时推送多个IP?

标签: python json urllib


【解决方案1】:

您可以使用 pandas Series.apply 方法从您的数据框中挑选每个 ip,并从您的 @987654323 中获取与其对应的 proxy、type、risk 值@ 功能。然后将值分配给最后的相应列:

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 函数

【讨论】:

  • 谢谢,我在尝试将其分配回原始 df 时遇到错误:AttributeError: 'DataFrame' object has no attribute 'ip'。删除 ip 使其显示为: df[['proxy','ip_type','risk']] = df.apply(query_api) - 然后按预期返回数据帧,但 proxy/ip_type/risk 列均为“无”
  • 您确定在您的问题中发布的数据框中有“ip”作为列吗?
  • 数据框中存储 ip 的列名是什么?
  • 是的,样品返回:date ip name proxy ip_type risk 0 2021-01-01 8.8.8.8 tommo None None None 1 2021-01-01 4.4.4.4 bexx None None None 2 2021-01-01 8.8.8.8 saint None None None
  • 得到它的工作,这是因为它是“IP”而不是“IP” - 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2020-11-28
  • 2021-07-03
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多