Нужна помощь в оптимизации распространенных вызовов API - PullRequest
1 голос
/ 13 июня 2019

Я шутил, чтобы отправить данные в Google Sheet, и придумал рабочий скрипт на python.

Быстрая справка по "заданию", которое должен выполнять этот скрипт:

  • Открыть Google Sheet
  • Считать имена пользователей Instagram из столбца B
  • Собратьданные из Instagram
  • Заполните данные в столбце F

Теперь, как уже было сказано, у меня это работает с кодом внизу.Но это (по крайней мере, насколько я понимаю) использует 1 вызов API на строку, которую он обновляет, но на моем листе будет более 1000 строк с именами пользователей, так что это может закончиться использованием большого количества вызовов API.Поэтому я бы предпочел сделать это навалом.Так что временно сохраните его и обновите все строки за 1 большое нажатие.Из документации Grald я заметил, что это возможно, если я могу назначить точные значения ячеек и столбцов, но я не знаю, как создать исходные входные данные, чтобы облегчить это.

Мой конечный пользователь также иногда вводит данныепустые строки (бог знает почему ..), но я заметил, что моя текущая логика заполняет данные здесь, которые на самом деле должны перейти к строке ниже пустой.

Так что я хотел бы получить ваше мнение о том, как я могу оптимизировать это, и решить 2 «проблемы» с моим текущим сценарием:

  • уменьшить количество вызовов API
  • правильно обрабатывать пустые строки

Вот мой код:

#import Google 
import gspread
from oauth2client.service_account import ServiceAccountCredentials

#Setting up connection to Google Sheet and picking up the initial values
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('file_init.json',scope)
client = gspread.authorize(creds)
sheet = client.open('Workbookname').sheet1
pp = pprint.PrettyPrinter()

ig_username_column = 2
ig_data_column = 6
ig_usernames = sheet.col_values(ig_username_column)
ig_names = []
i = 2
t = 2
for user in ig_usernames:
    ig_clean = remove_prefix(user,'@')
    ig_names.append(ig_clean)
    print(ig_names)


for name in ig_names[1:]:
    if len(name) != 0:
        print(name)
        ig_url = f'https://www.instagram.com/{name}'
        print(ig_url)
        data = instagram_metrics(ig_url)
        sheet.update_cell(i, ig_data_column, data[2])
        i += 1
    else:
        i += 1 #this is here to skip over empty rows in the Sheet
        continue

    sleep(randint(3,6))

1 Ответ

1 голос
/ 14 июня 2019
  • Вы хотите поместить значения (data[2] из data = instagram_metrics(ig_url)) из строки 2 столбца "F".
  • Например, вы хотите поместить значение 18410 из (20, 'username', 18410, 937), полученное с помощью instagram_metrics(ig_url), в электронную таблицу.
  • Вы хотите поместить все значения «500 строк» ​​в электронную таблицу одним вызовом API.

Если мое понимание верно, как насчет этой модификации? В этой модификации requests создается в цикле for. Затем request помещается в электронную таблицу с использованием метода update_cells().

Модифицированный скрипт:

Пожалуйста, измените следующим образом.

От:
for name in ig_names[1:]:
    if len(name) != 0:
        print(name)
        ig_url = f'https://www.instagram.com/{name}'
        print(ig_url)
        data = instagram_metrics(ig_url)
        sheet.update_cell(i, ig_data_column, data[2])
        i += 1
    else:
        i += 1 #this is here to skip over empty rows in the Sheet
        continue

    sleep(randint(3,6))
Для того, чтобы:
requests = []
for name in ig_names[1:]:
    if len(name) != 0:
        print(name)
        ig_url = f'https://www.instagram.com/{name}'
        print(ig_url)
        data = instagram_metrics(ig_url)
        requests.append(data[2])
    else:
        requests.append('')
        continue

# Select a range
cell_list = worksheet.range('F2:F' + str(len(requests) + 1))

for i, cell in enumerate(cell_list):
    cell.value = requests[i]

# Update in batch
worksheet.update_cells(cell_list)

Примечание:

  • Я думаю, что в этой модификации sleep(randint(3,6)) может не потребоваться.
  • Этот модифицированный сценарий предполагает, что вы уже можете писать и читать значения с помощью API Sheets.

Справка:

...