如何获取公开Google表格中超过100行的数据?
如何获取公开Google表格中超过100行的数据?
嗨,我来给你几个亲测有效的办法解决这个问题:
方法一:用Google Sheets官方API(最稳定可靠)
这是官方支持的方式,完全不用担心反爬问题,还能精准控制获取的数据范围。步骤大概是这样:
- 去Google Cloud控制台创建一个新项目,启用「Google Sheets API」
- 创建服务账号并下载密钥文件(JSON格式)
- 在Python里用
google-api-python-client库调用API,示例代码大概是这样:
from googleapiclient.discovery import build from google.oauth2.service_account import Credentials # 加载密钥文件 creds = Credentials.from_service_account_file('你的密钥文件.json') service = build('sheets', 'v4', credentials=creds) # 替换成你的表格ID和范围,比如取整个工作表的数据 sheet_id = '1DAQ__r9RNx4mHgcDoXvzda9-0d_yeP7hqXdRUZ67EtM' range_name = 'Sheet1!A:Z' # 这里可以按需调整范围 result = service.spreadsheets().values().get(spreadsheetId=sheet_id, range=range_name).execute() values = result.get('values', []) # 打印所有数据 for row in values: print(row)
方法二:直接用公开表格的导出链接(最简单)
如果你的表格是公开可访问的,那完全不用折腾API或者Selenium,直接用导出链接就能拿到全量数据。把原表格链接里的/edit?gid=xxx部分替换成/export?format=csv&gid=xxx,然后用requests请求这个链接就行。比如:
import requests import csv # 替换成你的导出链接 export_url = 'https://docs.google.com/spreadsheets/d/1DAQ__r9RNx4mHgcDoXvzda9-0d_yeP7hqXdRUZ67EtM/export?format=csv&gid=0' response = requests.get(export_url) response.encoding = 'utf-8' # 解析CSV数据 reader = csv.reader(response.text.splitlines()) for row in reader: print(row)
这个方法直接拿到的是完整的CSV文件,所有行都在里面,完美避开只加载100行的限制。
方法三:优化Selenium绕过反爬
如果你一定要用Selenium,试试这些技巧绕过Google的检测:
- 用
undetected-chromedriver库,它专门针对Google的反爬做了优化,比普通的ChromeDriver好用很多 - 模拟真实用户的操作,比如慢慢滚动页面加载所有数据,不要一次性跳到底部
- 设置合理的等待时间,比如用
WebDriverWait等待元素加载完成
示例代码大概是这样:
from undetected_chromedriver import Chrome from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time driver = Chrome() driver.get('你的表格链接') # 模拟滚动加载所有数据 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(2) # 等待加载 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 等待表格加载完成,然后提取数据 table = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, 'table')) ) rows = table.find_elements(By.TAG_NAME, 'tr') for row in rows: cols = row.find_elements(By.TAG_NAME, 'td') print([col.text for col in cols]) driver.quit()
备注:内容来源于stack exchange,提问作者Max Mustermann
相关产品推荐
相关产品推荐

