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

使用Python 3抓取MLB赛事数据的技术求助

完善Bovada MLB爬虫代码提取指定数据

我帮你调整了代码,现在可以完整抓取你需要的所有MLB赛事数据了。下面是修改后的完整代码,之后我会拆解每个部分的逻辑:

from bs4 import BeautifulSoup as bs4
import requests
import json
import re

def get_data():
    url = 'https://sports.bovada.lv//baseball/mlb/game-lines-market-group'
    headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.103 Safari/537.36"}
    r = requests.get(url, headers=headers)
    soup = bs4(r.text, 'lxml')
    # 匹配页面中的swc_market_lists JSON数据
    pattern = re.compile(r"swc_market_lists\s+=\s+(\{.*?\})")
    script = soup.find("script", text=pattern)
    if not script:
        return None
    # 提取JSON部分并返回
    return pattern.search(script.text).group(1)

def extract_mlb_data():
    raw_data = get_data()
    if not raw_data:
        print("未能获取到数据")
        return
    
    data = json.loads(raw_data)
    # 遍历所有赛事组
    for group in data['items']:
        # 遍历组内的每场赛事
        for game in group['itemList']['items']:
            print(f"\n=== 赛事: {game['description']} ===")
            
            # 1. 提取球队缩写和主客场信息
            print("\n球队信息:")
            for competitor in game['competitors']:
                team_abbrev = competitor['abbreviation']
                home_away = competitor['type']
                print(f"- {team_abbrev} ({home_away})")
            
            # 2. 提取投手信息
            home_pitcher = game['opponentBName']
            away_pitcher = game['opponentAName']
            print(f"\n投手信息:")
            print(f"- 主队投手: {home_pitcher}")
            print(f"- 客队投手: {away_pitcher}")
            
            # 3. 提取Moneyline美式赔率和总得分盘口
            print("\n赔率与盘口:")
            for display_group in game['displayGroups']:
                for market in display_group['itemList']:
                    # 处理Moneyline美式赔率
                    if market['description'] == 'Moneyline':
                        print("Moneyline 美式赔率:")
                        for outcome in market['outcomes']:
                            team_name = outcome['description']
                            american_odds = outcome['price']['american']
                            print(f"- {team_name}: {american_odds}")
                    # 处理总得分盘口(Runline里的handicap字段)
                    elif market['description'] == 'Runline':
                        print("总得分盘口:")
                        for outcome in market['outcomes']:
                            team_name = outcome['description']
                            handicap = outcome['price']['handicap']
                            print(f"- {team_name}: {handicap}")

if __name__ == "__main__":
    extract_mlb_data()

代码逻辑拆解:

  1. 数据获取部分:优化了正则匹配的准确性,使用pattern.search().group(1)直接提取JSON内容,避免了之前硬写[23:]的不稳定问题,同时增加了数据获取失败的判断。
  2. 球队与主客场信息:直接遍历game['competitors']数组,每个元素对应一支球队,从中提取abbreviation(球队缩写)和type(主客场类型)。
  3. 投手信息:根据你提供的JSON路径,opponentBName对应主队投手,opponentAName对应客队投手,直接提取即可。
  4. 赔率与盘口:遍历赛事的displayGroups市场组,通过description字段区分Moneyline和Runline市场:
    • Moneyline市场:提取每个结果的price.american作为美式赔率
    • Runline市场:提取每个结果的price.handicap作为总得分盘口

这样就能完整获取你需要的所有指定数据了,运行代码后会按每场赛事分类输出信息,更易读。

内容的提问来源于stack exchange,提问作者Michael T Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:31:34