【发布时间】:2019-06-13 10:35:58
【问题描述】:
我一直在玩弄 gspread 来将数据推送到 Google 表格,并在 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))
【问题讨论】:
-
你想减少
sheet.update_cell()的调用次数。如果我的理解是正确的,可以问一下data = instagram_metrics(ig_url)和data的样本值吗?我认为当data被放入一个数组并使用gspread将该数组放入Spreadsheet时,Sheets API的调用次数可以大大减少。对于这种情况,想请教一下data的样本值。如果我误解了您的问题,我深表歉意。 -
with
sheet.update_cell()我一次更新 1 个单元格,所以实际上对于我的 500 行测试文件,我正在执行该操作 500 次。所以我想限制这一点,并在 1 个大动作中做到这一点。因此,我不想写 500 * 1 次,而是想写 1 次到 500 个单元格(所有单元格都有不同的数据)。instagram_metrics(ig_url)解析 URL 并从 IG 检索基本数据,例如帖子数、用户名、关注者数和关注数数,然后返回。所以数据变成了例子:(20, 'username', 18410, 937). -
感谢您的回复和提供信息。我以为我能理解你的问题。所以我提出了一个修改后的脚本作为答案。你能确认一下吗?首先,请检查我对您的问题的理解是否正确。如果我误解了您的问题并且这不是您想要的结果,我深表歉意。
标签: python python-3.x google-sheets-api gspread