使用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()
代码逻辑拆解:
- 数据获取部分:优化了正则匹配的准确性,使用
pattern.search().group(1)直接提取JSON内容,避免了之前硬写[23:]的不稳定问题,同时增加了数据获取失败的判断。 - 球队与主客场信息:直接遍历
game['competitors']数组,每个元素对应一支球队,从中提取abbreviation(球队缩写)和type(主客场类型)。 - 投手信息:根据你提供的JSON路径,
opponentBName对应主队投手,opponentAName对应客队投手,直接提取即可。 - 赔率与盘口:遍历赛事的
displayGroups市场组,通过description字段区分Moneyline和Runline市场:- Moneyline市场:提取每个结果的
price.american作为美式赔率 - Runline市场:提取每个结果的
price.handicap作为总得分盘口
- Moneyline市场:提取每个结果的
这样就能完整获取你需要的所有指定数据了,运行代码后会按每场赛事分类输出信息,更易读。
内容的提问来源于stack exchange,提问作者Michael T Johnson
相关产品推荐
相关产品推荐

