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

Python+BeautifulSoup爬Winamax赔率遇阻:BeautifulSoup函数存何内容?

解决Winamax赔率爬取问题&搞懂BeautifulSoup

Hey Anthony,我来帮你一步步理清这个问题,刚接触Python和爬虫踩坑太正常了😉

一、先搞明白BeautifulSoup到底是干啥的

你可以把它理解成一个HTML拆解小工具:服务器返回给你的是一堆乱糟糟的HTML文本(就是网页的原始代码),它帮你把这些文本拆成一个个带标签、类名的可操作小模块,让你能快速定位到想要的内容——比如某个特定class的按钮里的赔率数字。

但它有个关键限制:只能处理页面一开始就加载好的「静态HTML」,那些需要靠JavaScript后来才生成的动态内容(比如Winamax的赔率),它根本看不到!这就是你遇到问题的核心。

二、为什么Winamax的soup和浏览器审查的不一样?

你用requests.get()拿到的网页内容,是Winamax服务器直接返回的「页面骨架」,里面很多动态内容(比如实时更新的赔率)是浏览器加载完骨架后,再通过JavaScript去服务器拉取数据、渲染出来的。

而浏览器的「审查元素」看到的是渲染后的完整页面(相当于骨架+装修好的内容),但BeautifulSoup解析的只是光秃秃的骨架,自然找不到你要的ui-touchlink-needsclick price odd-price元素。

之前Tipico能成功,是因为它的赔率直接写在初始静态HTML里,不需要JS额外加载,所以BeautifulSoup能直接找到。

三、怎么爬Winamax的赔率?

既然是动态内容,我们需要模拟浏览器的行为——让浏览器帮我们执行JS、渲染页面,然后再抓取已经渲染好的完整内容。这里推荐用selenium库,它可以操控真实的浏览器(比如Chrome),等页面加载完成后再提取HTML,最后用BeautifulSoup解析。

具体步骤(新手友好版):

  1. 安装必要的库
    打开终端,输入这两行命令:

    pip install selenium beautifulsoup4 requests
    

    还要下载对应浏览器的驱动:比如用Chrome的话,去Chrome官网下载和你当前Chrome版本匹配的ChromeDriver,把它放到Python能找到的路径里(或者直接加到系统环境变量)。

  2. 完整代码示例(带详细注释)

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from bs4 import BeautifulSoup
    import time
    import random
    
    # 1. 初始化Chrome浏览器(用Firefox就换成webdriver.Firefox())
    # 如果不想弹出浏览器窗口,就用无头模式:
    # options = webdriver.ChromeOptions()
    # options.add_argument("--headless=new")
    # driver = webdriver.Chrome(options=options)
    driver = webdriver.Chrome()
    
    try:
        # 2. 打开你要爬的Winamax赛事页面
        target_url = "替换成你要爬的Winamax具体赛事URL"
        driver.get(target_url)
    
        # 3. 先处理Cookie弹窗(如果有的话,根据实际按钮调整选择器)
        try:
            cookie_btn = WebDriverWait(driver, 5).until(
                EC.element_to_be_clickable((By.ID, "cookie-consent-accept"))
            )
            cookie_btn.click()
            # 随机等1-2秒,模拟人工操作
            time.sleep(random.uniform(1,2))
        except:
            # 没有弹窗就跳过
            pass
    
        # 4. 等待赔率元素加载完成(最多等10秒)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "odd-price"))
        )
        # 保险起见,再等2-3秒让所有内容加载完全
        time.sleep(random.uniform(2,3))
    
        # 5. 获取浏览器渲染后的完整HTML
        page_source = driver.page_source
    
        # 6. 用BeautifulSoup解析这个完整HTML
        soup = BeautifulSoup(page_source, "html.parser")
    
        # 7. 提取所有赔率元素并打印
        odds = soup.find_all(class_="ui-touchlink-needsclick price odd-price")
        for idx, odd in enumerate(odds, 1):
            print(f"第{idx}个赔率:{odd.get_text(strip=True)}")
    
    finally:
        # 不管成功失败,最后一定要关闭浏览器
        driver.quit()
    

新手注意事项:

  • 如果遇到定位元素失败,右键浏览器里的赔率元素,选择「复制」→「复制CSS选择器」或「复制XPath」,然后在代码里用By.CSS_SELECTOR或By.XPATH定位,比如:
    # 用CSS选择器定位
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "替换成你复制的CSS选择器"))
    )
    
  • Winamax可能有反爬机制,如果频繁访问被限制,可以加随机等待时间(代码里已经加了),或者用瑞士本地的代理IP。
  • 用soup.prettify()打印解析后的HTML,能让结构更清晰,方便你找元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:26:22