用于循环数千个 Url api 并将其添加到列表中

For looping several thousands of Url apis and adding it to a list

问题:此代码的输出似乎在最终列表中重复了很多相同的条目,因此使其呈指数级增长。

目标是完成查询并打印包含区域内所有城市的最终列表

[
    {
        "name": "Herat",
        "id": "AF~HER~Herat"
    }
]
[
    {
        "name": "Herat",
        "id": "AF~HER~Herat"
    },
    {
        "name": "Kabul",
        "id": "AF~KAB~Kabul"
    }
]
[
    {
        "name": "Herat",
        "id": "AF~HER~Herat"
    },
    {
        "name": "Kabul",
        "id": "AF~KAB~Kabul"
    },
    {
        "name": "Kandahar",
        "id": "AF~KAN~Kandahar"
    }
]

我的目标是获得一个带有 cityID 的列表。我首先发送 GET 请求并解析 JSON 响应以将国家/地区 ID 加入列表,

其次:我有一个 for 循环,它将对区域 ID 发出另一个 GET 请求,但我现在需要将国家/地区 ID 添加到 api url。我通过在 GET 请求上添加 .format 来做到这一点。并遍历所有国家和地区 ID,我解析它们并将它们存储在列表中。

第三:我有另一个 for 循环,它将对 cityID 发出另一个 GET 请求,循环遍历具有上述区域 ID 列表的所有城市,并分别收集我真正需要的 cityID。

代码:

from requests.auth import HTTPBasicAuth
import requests
import json
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def countries():
    data = requests.get("https://localhost/api/netim/v1/countries/", verify=False, auth=HTTPBasicAuth("admin", "admin"))
    rep = data.json()
    a = []
    for elem in rep['items']:
        a.extend([elem.get("id","")])
    print(a)
    return a
def regions():
    ids = []
    for c in countries():
        url = requests.get("https://localhost/api/netim/v1/countries/{}/regions".format(c), verify=False, auth=HTTPBasicAuth("admin", "admin"))
        response = url.json()
        for cid in response['items']:
            ids.extend([cid.get("id","")])
        data = []
        for r in ids:
            url = requests.get("https://localhost/api/netim/v1/regions/{}/cities".format(r), verify=False, auth=HTTPBasicAuth("admin", "admin"))
            response = url.json()
            data.extend([{"name":r.get("name",""),"id":r.get("id", "")} for r in response['items']])
        print(json.dumps(data, indent=4))
    return data
regions()

print(regions())

您会看到输出包含同一条目的多个副本。

不是程序员,不知道哪里错了

看起来您关心的输出可能是由于您在 regions() 方法中迭代它时正在打印 data

尝试删除以下行: print(json.dumps(data, indent=4))?

此外,更重要的是 - 每次迭代国家/地区中的项目时,您都会将 data 设置为一个空列表。您可能应该在初始循环之前声明该变量。

您在调用该函数时已经在打印最终结果。因此,只有在调试和需要在浏览数据时查看数据时,在迭代时打印才真正有意义。