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

使用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']}")

关键说明

  1. API接口定位:打开浏览器开发者工具(F12)→ 切换至「Network」标签→ 刷新页面→ 筛选「XHR」类型请求,可找到getOdds接口,其参数eventId为赛事唯一标识,categoryId对应不同赔率类型(0=1X2终盘,1=亚洲盘等)。
  2. 请求头设置:添加User-Agent和X-Requested-With模拟浏览器请求,避免被服务器识别为爬虫拦截。

内容的提问来源于stack exchange,提问作者Psychomantis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:24:16