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

如何定期或事件驱动式抓取网页数据并同步至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)前置准备

  1. 登录Google Cloud Console创建项目,启用Google Sheets API
  2. 创建服务账号,下载JSON格式的密钥文件
  3. 打开你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:22:41