如何在将列表中的每个值传递给 API 并在每个列表列表之后暂停时迭代列表列表?

How to iterate over list of lists while passing each value in the lists into API and pausing after each list of list?

我有一个如下所示的列表:

lst = [1,2,3, etc]

我可以成功迭代此列表并将 ID 传递到 API。但是 API 在我传递的 ID 数量方面的某个点后中断。

我继续使用以下代码将列表分成 50 个块:

def chunks(l, n):
    # For item i in a range that is a length of l,
    for i in range(0, len(l), n):
        # Create an index range for l of n items:
        yield l[i:i+n]

a = list(chunks(lst, 50))

a 变量是列表的列表,如下所示:

[[1,2,3][4,5,6]]

如何遍历列表的列表,将各个 ID 传递到 API 代码(如下),同时在每个块后暂停代码 10 秒?

此外,如果 API 中断,我是否可以强制 API 继续其余代码?现在不是必需的,所以这是可选的。

API代码:

lst1=[]
for i in lst:
    #print (row)
    url = 'url/Id={}'.format(i)
    r = requests.get(url).text
    lst1.append(xml_data1)
    #time.sleep(1)
    print(xml_data1)

提前谢谢你。

您可以在执行内部循环后使用 sleep 函数使用双 for 循环。这是一个例子:

lst1 = []
for chunk in a:
    for id in chunk:
        url = 'url/Id={}'.format(id)
        xml_data = requests.get(url).text
        lst1.append(xml_data)
     sleep(10) # will pause execution for 10 seconds

要回答关于在 API 抛出错误时如何继续执行的第二个问题,您可以使用 try/except。可能抛出错误的代码进入 try 块,如果抛出错误,执行将移至 except 块,该块指定如何继续。如果将代码包装在一个函数中,这会变得更容易一些。

我发现跟踪您尝试使用可用于指数退避的关键字参数调用特定 id 的次数很有帮助 - 您等待更长的时间取决于关于你尝试了多少次。

下面是一个基于上述代码的示例:

def get_data_on_id(id, try_num=1):
    url = 'url/Id={}'.format(id)
    try:
        return requests.get(url).text
    except:
        sleep(2**try_num) # exponential backoff
        return get_data_on_id(id, try_num=try_num + 1)

lst1 = []
for chunk in a:
    for id in chunk:
        xml_data = get_data_on_id(id)
        lst1.append(xml_data)
    sleep(10)

上面的代码与前面的代码基本相同,但请求逻辑包装在 get_data_on_id 函数中,其中包含 try/except 块。如果在请求 url 时抛出错误,该函数将等待 2^try_num 秒,然后重试。

您可能还想 except 特定的错误并以不同的方式处理它们(或者只是为了明确,所以您只准备 except 准备处理的错误)。以下是 try/except 上的文档:https://docs.python.org/3/tutorial/errors.html