用于循环数千个 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
设置为一个空列表。您可能应该在初始循环之前声明该变量。
您在调用该函数时已经在打印最终结果。因此,只有在调试和需要在浏览数据时查看数据时,在迭代时打印才真正有意义。
问题:此代码的输出似乎在最终列表中重复了很多相同的条目,因此使其呈指数级增长。
目标是完成查询并打印包含区域内所有城市的最终列表
[
{
"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
设置为一个空列表。您可能应该在初始循环之前声明该变量。
您在调用该函数时已经在打印最终结果。因此,只有在调试和需要在浏览数据时查看数据时,在迭代时打印才真正有意义。