You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:57:33