Python+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解析。
具体步骤(新手友好版):
安装必要的库
打开终端,输入这两行命令:pip install selenium beautifulsoup4 requests还要下载对应浏览器的驱动:比如用Chrome的话,去Chrome官网下载和你当前Chrome版本匹配的ChromeDriver,把它放到Python能找到的路径里(或者直接加到系统环境变量)。
完整代码示例(带详细注释)
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

