使用Beautiful Soup爬虫:如何从表格中提取特定赔率值
解决OddsMath赛事赔率爬取问题
问题概述
已成功爬取OddsMath赛事页面的球队名称和比赛日期,但无法提取表格内的赔率数据——静态HTML返回的表格<tbody>为空,无法通过data-x-id定位博彩商或class='odds odds -1'提取对应赔率。
现有代码
from bs4 import BeautifulSoup import requests url = 'https://www.oddsmath.com/football/england/premier-league-1281/2022-08-28/wolverhampton-wanderers-vs-newcastle-united-3882295/' page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') match = soup.find('li', {'class':'active'}).text print(match) date = soup.find('time', {'class':'event-time'})['datetime'] print(date) All_1X2_FT = soup.find_all('table', id = 'table-odds-cat-0') print(All_1X2_FT)
问题原因
页面的赔率数据并非直接嵌入静态HTML,而是通过AJAX异步请求加载的。requests.get()仅能获取初始静态页面,无法捕获动态加载的内容,因此表格<tbody>为空。
解决方案
直接请求页面用于加载赔率的API接口,解析返回的JSON数据获取赔率:
from bs4 import BeautifulSoup import requests import json # 原赛事页面URL url = 'https://www.oddsmath.com/football/england/premier-league-1281/2022-08-28/wolverhampton-wanderers-vs-newcastle-united-3882295/' page = requests.get(url) soup = BeautifulSoup(page.text, 'html.parser') # 提取球队名称与比赛日期 match = soup.find('li', {'class':'active'}).text print(match) date = soup.find('time', {'class':'event-time'})['datetime'] print(date) # 从URL中提取赛事ID(URL末尾的数字部分) event_id = url.split('-')[-1] # 赔率数据的API接口(categoryId=0对应1X2终盘赔率) odds_api_url = f'https://www.oddsmath.com/api/getOdds?eventId={event_id}&categoryId=0' # 构造请求头,模拟浏览器请求避免被拦截 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', 'X-Requested-With': 'XMLHttpRequest' } # 请求API获取赔率JSON数据 response = requests.get(odds_api_url, headers=headers) odds_data = json.loads(response.text) # 遍历输出每个博彩商的1X2赔率 for bookmaker in odds_data['bookmakers']: bookmaker_name = bookmaker['name'] bookmaker_id = bookmaker['id'] print(f"\n博彩商:{bookmaker_name}(ID:{bookmaker_id})") for odd in bookmaker['odds']: if odd['type'] == '1': print(f"主胜赔率:{odd['value']}") elif odd['type'] == 'X': print(f"平局赔率:{odd['value']}") elif odd['type'] == '2': print(f"客胜赔率:{odd['value']}")
关键说明
- API接口定位:打开浏览器开发者工具(F12)→ 切换至「Network」标签→ 刷新页面→ 筛选「XHR」类型请求,可找到
getOdds接口,其参数eventId为赛事唯一标识,categoryId对应不同赔率类型(0=1X2终盘,1=亚洲盘等)。 - 请求头设置:添加
User-Agent和X-Requested-With模拟浏览器请求,避免被服务器识别为爬虫拦截。
内容的提问来源于stack exchange,提问作者Psychomantis
相关产品推荐
相关产品推荐

