如何抓取公开Google Sheet中的第二个工作表(Sheet2)
解决Google Sheets抓取指定Sheet数据的问题
问题原因
你用带#gid=367705858的编辑链接抓取数据没用,是因为#后面的锚点参数只在浏览器端生效,服务器收到requests的GET请求时会直接忽略锚点部分,返回的还是默认加载的Sheet1页面内容,所以BeautifulSoup解析到的自然是Sheet1的数据。
正确解决方案:用公开导出API
Google Sheets提供了公开数据的导出接口,直接用这个接口指定Sheet的gid,就能拿到对应Sheet的纯数据(比如CSV格式),比解析HTML靠谱多了。
导出链接格式
把原编辑链接的/edit替换成/export,再加上两个参数:
format=csv:指定导出格式为CSV(也可以用format=xlsx导出Excel)gid=367705858:指定要导出的Sheet的gid
最终链接为:https://docs.google.com/spreadsheets/d/1HplWfW1T_XPF45wondzxsTOd5M2VijT-LaDJ9hVOH7Y/export?format=csv&gid=367705858
修改后的Python代码
import requests import csv from io import StringIO # 请求Sheet2的CSV数据 response = requests.get("https://docs.google.com/spreadsheets/d/1HplWfW1T_XPF45wondzxsTOd5M2VijT-LaDJ9hVOH7Y/export?format=csv&gid=367705858") response.encoding = 'utf-8' # 解析CSV内容 csv_data = StringIO(response.text) reader = csv.reader(csv_data) # 打印每一行数据 for row in reader: print(row)
备选方案:模拟浏览器(不推荐)
如果一定要用HTML解析的方式,得用selenium模拟浏览器加载页面,让浏览器处理锚点并切换到Sheet2,再解析页面。但这种方法速度慢,还需要安装浏览器驱动,不如导出API高效。示例代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("https://docs.google.com/spreadsheets/d/1HplWfW1T_XPF45wondzxsTOd5M2VijT-LaDJ9hVOH7Y/edit#gid=367705858") time.sleep(2) # 等待页面加载完成 tbody = driver.find_element(By.TAG_NAME, "tbody") rows = tbody.find_elements(By.TAG_NAME, "tr") for row in rows: cells = row.find_elements(By.TAG_NAME, "td") print([cell.text for cell in cells]) driver.quit()
内容的提问来源于stack exchange,提问作者james josephson
相关产品推荐
相关产品推荐

