如何用Python爬取Oddschecker网站的两队均进球(BTTS)赔率
Oddschecker BTTS板块赔率爬取解决方案
问题根源
- 你当前用
urlopen只能拿到静态初始HTML,Oddschecker的所有赔率板块都是客户端JS动态渲染的,初始页面里根本没有你要找的赔率节点,所以你用索引硬取第13个元素要么直接报错要么拿到空内容。 - 站点用了CSS Modules,类名后面的随机后缀(比如
_mgnb13w)每次版本更新都会变,硬写死类名+索引的方式完全不可靠,页面结构稍微调整就失效。
可行实现方案
用支持JS渲染的工具模拟浏览器加载页面,等内容完全渲染后通过稳定的文本特征定位板块,不要依赖带哈希的动态类名。下面给出Playwright的实现示例:
1. 安装依赖
pip install playwright playwright install chromium
2. 示例代码
from playwright.sync_api import sync_playwright def get_btts_odds(match_url): with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") page.goto(match_url, wait_until="networkidle") # 定位Both Teams To Score板块,通过文本特征匹配 btts_market = page.locator("div[class*='MarketWrapper']", has_text="Both Teams To Score").first # 等待板块加载完成 btts_market.wait_for(state="visible") # 提取是/否两个选项的赔率 odds = {} # 定位所有赔率按钮 odds_buttons = btts_market.locator("button[data-odds]").all() for btn in odds_buttons: option = btn.get_attribute("aria-label").split(" ")[0] odd_value = btn.get_attribute("data-odds") odds[option] = odd_value browser.close() return odds # 测试调用 url = 'https://www.oddschecker.com/football/spain/la-liga-primera/levante-v-rayo-vallecano/winner' print(get_btts_odds(url))
补充说明
- 如果你需要提取多家博彩公司的对应赔率,可以修改定位逻辑,查找板块下对应博彩公司列的
td节点的赔率属性即可。 - 不要高频请求站点,可适当加延时避免被封。
内容的提问来源于stack exchange,提问作者order66
相关产品推荐
相关产品推荐

