python - 需要帮助优化 gspread API 调用

标签 python python-3.x google-sheets-api gspread

我一直在尝试使用 gspread 将数据推送到 Google Sheet,并用 python 编写了一个工作脚本。

此脚本必须执行的“工作”的快速背景:

  • 打开 Google 表格
  • 从 B 列读取 Instagram 用户名
  • 从 Instagram 收集数据
  • 填写F列数据

现在,如前所述,我已经使用下面的代码进行了操作。但这确实(至少据我所知)每行更新使用 1 个 API 调用,但我的工作表将包含 1000 多行用户名,因此这可能最终会使用大量 API 调用。所以我更愿意批量执行此操作。因此,暂时存储它并在 1 个大推送中更新所有行。从 Gspread 文档中我注意到,如果我可以分配精确的单元格和列值,那么应该是可能的,但我不知道如何构建我的原始输入数据来促进这一点。

我的最终用户偶尔也会输入空行(天知道为什么......),但我注意到我当前的逻辑在此处填充了数据,这实际上需要转到空行下方的行。

所以我很想得到您关于如何优化它的意见,并用我当前的脚本解决 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))

最佳答案

  • 您想要输入“F”列第 2 行的值(data = instagram_metrics(ig_url)data[2])。
  • 例如,您希望将 instagram_metrics(ig_url) 检索到的 (20, 'username', 18410, 937)18410 值放入 到电子表格。
  • 您希望通过一次 API 调用将“500 行”的所有值放入电子表格中。

如果我的理解是正确的,那么这个修改怎么样?在此修改中,requests 在 for 循环中创建。然后,使用update_cells()方法将request放入电子表格中。

修改后的脚本:

请修改如下。

从:
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))
  • 此修改后的脚本假设您已经能够使用 Sheets API 写入和读取值。

引用:

关于python - 需要帮助优化 gspread API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56578624/

相关文章:

python - 如何仅更改第一个 "Column name"pandas 的字体

python - 所有任务完成后如何终止 python asyncio event_loop

google-apps-script - 仅修改 Google 表格图表中的一个系列

javascript - Google 脚本将文件大小驱动到电子表格 - 文件迭代器不起作用

ios - 安装了 Google Drive API,但出现错误 "no such module ' GoogleAPIClient'"

python - 从 DataFrame 到嵌套的 Json 对象

python - OpenCv 链接器错误 : Symbol not found: ___itt_api_version_ptr__3_0

python - 一个类从一个不是类型的对象继承是什么意思?

python - 下载了Python版的SciPy,无法使用

python - 强制 timeit 自动选择语句执行的次数