如何定期或事件驱动式抓取网页数据并同步至Google Sheets?
体育博彩投注信息自动抓取同步到Google Sheets方案
先明确要用的工具
你有基础Python能力,直接用Python生态的工具就能搞定:
- 静态页面爬虫:
requests(发HTTP请求)+BeautifulSoup(解析HTML内容) - 动态页面(JS渲染内容):
playwright(比Selenium轻量,上手简单) - 定期任务:
schedule库(快速实现脚本定时)或者系统级定时任务(Linux cron/Windows任务计划,更稳定) - 事件驱动抓取:轮询对比数据变化,或抓WebSocket接口(如果网站支持实时推送)
- Google Sheets同步:
gspread库 + Google Sheets API
分步实现
1. 网页数据抓取
(1)静态页面抓取(内容直接在HTML源码里)
先安装依赖:
pip install requests beautifulsoup4
核心代码:
import requests from bs4 import BeautifulSoup def get_bet_data(url): # 模拟浏览器请求,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } try: resp = requests.get(url, headers=headers) resp.raise_for_status() # 请求失败直接抛出错误 except Exception as e: print(f"请求页面失败: {e}") return [] soup = BeautifulSoup(resp.text, "html.parser") bet_list = [] # 这里要根据你目标页面的HTML结构修改,比如找投注项的容器类名 for bet_item in soup.select(".bet-item-container"): # 提取你需要的字段:投注ID、赛事名称、金额、状态等 bet_id = bet_item.select_one(".bet-id").text.strip() event_name = bet_item.select_one(".event-name").text.strip() bet_amount = bet_item.select_one(".bet-amount").text.strip() status = bet_item.select_one(".bet-status").text.strip() bet_list.append({ "id": bet_id, "event": event_name, "amount": bet_amount, "status": status }) return bet_list
(2)动态页面抓取(内容由JS加载,HTML源码里看不到)
用playwright实现,先装包和浏览器驱动:
pip install playwright playwright install chrome
代码示例:
from playwright.sync_api import sync_playwright def get_dynamic_bet_data(url): bet_list = [] with sync_playwright() as p: # 无头模式运行(不显示浏览器窗口),调试时可以改成headless=False browser = p.chromium.launch(headless=True) page = browser.new_page() page.set_extra_http_headers({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" }) # 等待页面完全加载(networkidle表示网络空闲,确保JS渲染完成) page.goto(url, wait_until="networkidle") # 同样根据页面结构提取数据 for bet_item in page.query_selector_all(".bet-item-container"): bet_id = bet_item.query_selector(".bet-id").text_content().strip() event_name = bet_item.query_selector(".event-name").text_content().strip() bet_amount = bet_item.query_selector(".bet-amount").text_content().strip() status = bet_item.query_selector(".bet-status").text_content().strip() bet_list.append({ "id": bet_id, "event": event_name, "amount": bet_amount, "status": status }) browser.close() return bet_list
(3)定期抓取 vs 事件驱动抓取
- 定期抓取:简单直接,适合不需要实时同步的场景
用schedule快速实现脚本定时:
import schedule import time def sync_job(): data = get_bet_data("你的投注页面URL") sync_to_sheets(data) # 每30分钟执行一次,可根据需求调整间隔 schedule.every(30).minutes.do(sync_job) while True: schedule.run_pending() time.sleep(1)
嫌Python脚本占内存?直接用系统定时任务:Linux写cron表达式,Windows用任务计划程序,定时执行你的脚本即可。
- 事件驱动抓取:有新数据立刻同步
最简单的实现方式是轮询对比数据哈希,数据变化时触发同步:
import hashlib import time def get_data_hash(data): # 将数据转为字符串后计算MD5哈希,用于对比变化 return hashlib.md5(str(data).encode()).hexdigest() last_data_hash = "" while True: current_data = get_bet_data("你的投注页面URL") current_hash = get_data_hash(current_data) if current_hash != last_data_hash: sync_to_sheets(current_data) last_data_hash = current_hash time.sleep(60) # 每分钟检查一次,可调整间隔
如果网站支持实时推送(比如用WebSocket),可以抓包找到WebSocket接口,用websockets库监听推送消息,直接获取新数据(需要一点抓包基础,可逐步尝试)
2. 同步到Google Sheets
(1)前置准备
- 登录Google Cloud Console创建项目,启用Google Sheets API
- 创建服务账号,下载JSON格式的密钥文件
- 打开你的Google Sheets表格,共享给服务账号的邮箱(密钥文件里的
client_email字段)
(2)代码实现
先安装依赖:
pip install gspread oauth2client
核心代码:
import gspread from oauth2client.service_account import ServiceAccountCredentials def sync_to_sheets(bet_data): # 定义API授权范围 scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"] try: creds = ServiceAccountCredentials.from_json_keyfile_name("你的密钥文件路径.json", scope) client = gspread.authorize(creds) except Exception as e: print(f"Google Sheets授权失败: {e}") return # 打开目标表格,可用表格名称或链接 sheet = client.open("投注记录").sheet1 # sheet1表示第一个工作表 # 写入表头(仅第一次运行时写入) headers = ["投注ID", "赛事名称", "投注金额", "状态"] if sheet.row_values(1) != headers: sheet.insert_row(headers, 1) # 将数据转换为列表格式,方便写入表格 rows = [[item["id"], item["event"], item["amount"], item["status"]] for item in bet_data] # 追加数据到表格末尾 sheet.append_rows(rows)
关键注意点
- 反爬规避:不要频繁请求页面,设置合理间隔;使用真实的User-Agent;若被封IP,可考虑使用代理池(需注意合规性)
- 数据去重:同步前可通过
sheet.find()查询投注ID是否已存在,避免重复写入 - 错误处理:给HTTP请求、Sheets操作添加try-except块,捕获异常并记录日志,避免脚本意外崩溃
- 合规性:先查看目标网站的robots.txt和用户协议,确保抓取行为符合规则,避免法律风险
内容的提问来源于stack exchange,提问作者UNRESTR1CTED
相关产品推荐
相关产品推荐

