Python中Gspread/open_by_url连接谷歌表格耗时过长求助
解决谷歌表格Python操作初始化耗时过长的问题
可能的原因
- 网络链路/DNS解析问题:谷歌服务在部分地区访问存在DNS解析慢、路由绕路的情况,导致HTTP请求等待时间拉满。
- 库的默认配置冗余:gspread或谷歌官方库默认会加载表格全量元数据(比如所有工作表、权限配置),哪怕你只需要读一个单元格;另外默认的请求重试、超时设置也可能不合理。
- 认证环节额外开销:首次创建service_account时,加载证书、完成OIDC认证的过程如果网络差,会拖慢整体速度。
优化方案
1. 先搞定网络基础问题
- 把本地DNS换成
8.8.8.8或1.1.1.1,避免DNS解析延迟。 - 如果是国内环境,用合规代理打通访问谷歌API的链路——这是最常见的耗时根源。
2. 调整gspread的会话复用
复用TCP连接能减少重复握手的开销,试试这段代码:
import gspread import time from requests import Session # 用Session复用连接,减少HTTP握手次数 session = Session() gc = gspread.service_account(session=session) lel = time.time() sheet = gc.open_by_url('你的表格URL') worksheet = sheet.worksheet("Quick Links") print(worksheet.get('A1').first()) print(time.time() - lel)
3. 跳过全量元数据加载,直接读单元格
如果只需要操作特定单元格/范围,直接调用谷歌Sheets API的values.get接口,不用加载整个表格的元数据:
from google.oauth2 import service_account from googleapiclient.discovery import build import time credentials = service_account.Credentials.from_service_account_file('你的凭证文件.json') service = build('sheets', 'v4', credentials=credentials) lel = time.time() # 直接指定表格ID和单元格范围 result = service.spreadsheets().values().get( spreadsheetId='你的表格ID', range='Quick Links!A1' ).execute() print(result.get('values', [['']])[0][0]) print(time.time() - lel)
4. 缓存认证token,避免重复认证
每次运行脚本都重新走认证流程会浪费时间,缓存token能跳过这一步:
import gspread from google.oauth2.service_account import Credentials import time import json import os TOKEN_CACHE = 'token_cache.json' def load_cached_token(): if os.path.exists(TOKEN_CACHE): with open(TOKEN_CACHE, 'r') as f: data = json.load(f) creds = Credentials.from_service_account_file( '你的凭证文件.json', scopes=['https://www.googleapis.com/auth/spreadsheets'] ) creds.token = data['token'] creds.expiry = data['expiry'] return creds return None def save_token(creds): with open(TOKEN_CACHE, 'w') as f: json.dump({ 'token': creds.token, 'expiry': creds.expiry.isoformat() }, f) # 优先用缓存的凭证 creds = load_cached_token() if not creds or creds.expired: creds = Credentials.from_service_account_file( '你的凭证文件.json', scopes=['https://www.googleapis.com/auth/spreadsheets'] ) creds.refresh(gspread.client.requests.Session()) save_token(creds) gc = gspread.Client(credentials=creds) lel = time.time() sheet = gc.open_by_url('你的表格URL') worksheet = sheet.worksheet("Quick Links") print(worksheet.get('A1').first()) print(time.time() - lel)
排查步骤
- 先测网络:用
curl https://sheets.googleapis.com/v4/spreadsheets/你的表格ID看响应时间,如果超过5秒,基本就是网络问题。 - 拆分计时:把代码拆成认证、打开表格、读单元格三步分别计时,看哪一步拖了后腿。
内容的提问来源于stack exchange,提问作者Oshida_BCF
相关产品推荐
相关产品推荐

