我有一个看起来像这样的列表:
lst = [1,2,3, etc]
我可以成功地遍历此列表,并将ID传递给API。但是,关于我传递的ID数,API在某些点后中断。
我继续使用以下代码将列表分成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)
先谢谢您。
答案 0 :(得分:2)
执行内部循环后,可以使用双for
循环和sleep
函数。这是一个示例:
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