Как остановиться внутри итерации al oop, чтобы увеличить скорость? Python3 - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь l oop по списку объектов, а затем, когда в URL ничего нет, останавливаю код, а затем go к следующему объекту, а затем записываю все данные в один JSON файл .

Вот мой код

import json
import requests
from config import configs
from datetime import datetime

current_date = datetime.now().strftime("%Y%m%d-%H%M%S")
header = {"Authorization": "Bearer <api_key>"}

pst_rec_path = 'path/to/folder'

# Get a list of pst's (there are 245)
all_psts = []
for i in range(1, 3):
    s = requests.Session()
    s.proxies = < my_proxy >
    resp = s.get("https://host/v1/psts?page={0}".format(i), headers=header, verify=False).json()
    
# Get only the values from the pst_id field and put them into a list   
full_psts = [item['pst_id'] for item in resp]
all_psts.extend(full_psts)

# get all the pst receipitent list
pst_rec_list = []
print(len(all_psts))

# This will loop over all the pst's. Since there's a pagination limit per page (max=1), I have to iterate each page until it's empty
for obj in all_psts:
    # Iterate over all the pages per page until it is empty
    for i in range(1, 5000):
        s = requests.Session()
        s.proxies = < my_proxy >
        resp = s.get("https://host/v1/psts/{0}/recipients?page={1}".format(obj, i), headers=header, verify=False).json()
        if resp:  # If theres data, append it to the pst_rec_list variable
            pst_rec_list.extend(resp)
        elif not resp:  # if not stop the loop and go to the next obj
            print(str(i))  # To see at which page number it stopped at
            break
        else:
            break

print(len(pst_rec_list))
with open(pst_rec_path, 'w', encoding='utf-8') as file:
    json.dump(pst_rec_list, file, ensure_ascii=False, indent=1, sort_keys=False, default=str)

По сути, этот скрипт создает полный список объектов (pst), которых около 245 ... Затем перебирает каждый объект и записывает его данные в файл JSON. Однако, поскольку в этом API существует ограничение на разбиение на страницы (max = 1), мне приходится повторять каждую страницу, пока она не станет пустой. Этот код работает прилично, но занимает вечность. Есть ли более быстрый и эффективный способ l oop на каждой странице, записать данные в файл JSON, а затем, когда на странице ничего нет, остановить текущий объект l oop и go в следующий объект? Я новичок в этом, поэтому любые идеи или предложения могут помочь.

...