Для цикла нескольких тысяч API-адресов URL и добавления их в список - PullRequest
0 голосов
/ 18 июня 2020

Проблема: похоже, что вывод этого кода повторяет множество одинаковых записей в окончательном списке, что делает его экспоненциально длиннее.

Целью было бы завершить запрос и распечатать окончательный список с весь город в регионе

[
    {
        "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, чтобы получить идентификаторы стран в списке,

Во-вторых: у меня есть запрос l oop, который сделает еще один запрос GET для идентификатора региона, но теперь мне нужно добавить идентификаторы стран в URL-адрес API. Я делаю это, добавляя .format в запрос GET. и перебираю все страны и соответствующие идентификаторы регионов, я анализирую их и сохраняю в списке.

В-третьих: у меня есть еще один для l oop, который сделает еще один запрос GET для cityID, который будет l oop через все города с указанным выше списком идентификаторов регионов, и, соответственно, соберите идентификатор города, который мне действительно нужен.

Код:

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())

Вы увидите, что вывод содержит несколько копий той же записи.

Не программист, не уверен, где я ошибаюсь

1 Ответ

1 голос
/ 18 июня 2020

Похоже, что вывод, который вас интересует, может быть связан с тем, что вы печатаете data, когда вы проходите через него в методе regions().

Попробуйте удалить строку: print(json.dumps(data, indent=4))?

Кроме того, что более важно, вы устанавливаете data в пустой список каждый раз, когда выполняете итерацию по элементу в Country. Вероятно, вам следует объявить эту переменную перед начальным l oop.

Вы уже печатаете окончательный результат, когда вызываете функцию. Таким образом, печать по мере выполнения итерации имеет смысл только в том случае, если вы отлаживаете и вам нужно просматривать данные, когда вы go просматриваете их.

...