使用Python BeautifulSoup爬取赛事主客队概率遇阻求助
解决BayesBet网站赛事概率数据爬取问题
针对你爬取https://bayesbet.everettsprojects.com/时遇到的主队/客队概率获取问题,结合类名重复、BeautifulSoup和Selenium的使用痛点,给你以下具体解决方案:
核心思路:利用上下文限定元素范围
网站类名重复是常见问题,关键是不要全局查找元素,而是先定位单个赛事条目容器,再在容器内部查找概率相关元素,这样就能避开其他赛事的重复类名干扰。
BeautifulSoup 实现方案
假设你已经能拿到赛事条目容器(比如通过.event-item类,你可以根据实际HTML结构替换),在每个容器内部定位概率:
from bs4 import BeautifulSoup import requests url = "https://bayesbet.everettsprojects.com/" response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 遍历所有赛事条目 for event in soup.select(".event-item"): # 替换成你实际用的赛事容器选择器 # 方法1:通过文本标签定位(如果页面有"Home Probability"这类明确标签) home_label = event.find("span", string="Home Probability") if home_label: home_prob = home_label.find_next_sibling("span").text.strip() away_label = event.find("span", string="Away Probability") if away_label: away_prob = away_label.find_next_sibling("span").text.strip() # 方法2:通过类名索引(如果概率元素类名相同但顺序固定) prob_elements = event.select(".probability-value") # 替换成实际概率值的类名 if len(prob_elements) >= 2: home_prob = prob_elements[0].text.strip() away_prob = prob_elements[1].text.strip() # 输出或保存数据 print(f"主队概率: {home_prob}, 客队概率: {away_prob}")
Selenium 实现方案
如果页面是动态加载(比如概率数据通过JS渲染),用Selenium时同样要限定查找范围在单个赛事条目内,同时注意等待元素加载:
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 driver = webdriver.Chrome() driver.get("https://bayesbet.everettsprojects.com/") # 等待赛事条目全部加载完成 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".event-item")) ) events = driver.find_elements(By.CSS_SELECTOR, ".event-item") for event in events: # 方法1:相对XPath定位(精准匹配文本标签) home_prob = event.find_element( By.XPATH, ".//span[text()='Home Probability']/following-sibling::span" ).text.strip() away_prob = event.find_element( By.XPATH, ".//span[text()='Away Probability']/following-sibling::span" ).text.strip() # 方法2:类名索引(如果概率元素顺序固定) prob_values = event.find_elements(By.CSS_SELECTOR, ".prob-value") if len(prob_values) >= 2: home_prob = prob_values[0].text.strip() away_prob = prob_values[1].text.strip() print(f"主队概率: {home_prob}, 客队概率: {away_prob}") driver.quit()
额外建议
- 先检查浏览器开发者工具的「网络」标签,看看是否有直接返回赛事数据的API接口,直接请求API比解析HTML效率高得多;
- 如果用requests拿不到动态加载的数据,要么用Selenium渲染页面,要么抓包分析AJAX请求的参数,模拟请求;
- 定位元素时,尽量用组合选择器(比如父容器类名+子元素类名),减少重复匹配的可能。
内容的提问来源于stack exchange,提问作者Lones
相关产品推荐
相关产品推荐

