使用Selenium筛选Pinnacle在线投注元素,解决DataFrame索引不匹配问题
问题:爬取Pinnacle NBA球员投注数据时排除离线投注项
我正在爬取pinnacle.com的NBA球员投注数据,目标是排除离线投注的标题,避免生成DataFrame时出现球员名称(作为索引)和数据长度不匹配的问题。目前代码通过By.CLASS_NAME获取所有投注标题、投注项名称和赔率,但没法区分在线/离线投注,试过逻辑判断但返回的布尔值不能用作索引,求解决办法。
当前代码
driver.get("https://www.pinnacle.com/en/basketball/nba/brooklyn-nets-vs-charlotte-hornets/1564479365#player-props") # 获取球员/投注类型名称 player_name_bet_search = driver.find_elements(By.CLASS_NAME, "style_titleText__35WhH") # 获取投注项名称 odds_name_search = driver.find_elements(By.CLASS_NAME, "style_label__2KJur", "market-btn style_button__34Zqv style_pill__1NXWo style_horizontal__10PLW style_disabled__2uBLz") # 获取赔率值 odds_values_search = driver.find_elements(By.CLASS_NAME, "style_price__15SlF")
解决方案
核心思路是按投注组过滤,只保留在线状态的投注组,避免全局取数导致的长度不匹配问题:
1. 按投注组筛选(推荐)
页面中每个球员的投注项会被包裹在一个父容器里,离线投注组会带有特定的禁用类(如style_disabled__2uBLz),通过遍历这些组并过滤离线项,就能保证数据关联正确:
driver.get("https://www.pinnacle.com/en/basketball/nba/brooklyn-nets-vs-charlotte-hornets/1564479365#player-props") # 定位所有投注组的父容器(类名需根据页面实际结构确认,示例为常见结构) bet_groups = driver.find_elements(By.CSS_SELECTOR, "div.style_group__2x3rX") # 初始化存储数据的列表 player_bets = [] odds_names = [] odds_values = [] for group in bet_groups: # 检查当前组是否为离线状态(不包含禁用类则为在线) if "style_disabled__2uBLz" not in group.get_attribute("class"): # 提取当前组的球员/投注类型标题 title = group.find_element(By.CLASS_NAME, "style_titleText__35WhH").text player_bets.append(title) # 提取当前组内的投注项名称 group_odds_names = group.find_elements(By.CLASS_NAME, "style_label__2KJur") odds_names.extend([elem.text for elem in group_odds_names]) # 提取当前组内的赔率值 group_odds_values = group.find_elements(By.CLASS_NAME, "style_price__15SlF") odds_values.extend([elem.text for elem in group_odds_values])
2. 直接筛选非禁用的标题(备选)
如果暂时找不到合适的父容器,也可以直接用CSS选择器筛选非离线的投注标题,同时对应筛选投注项和赔率:
# 筛选所有非离线的投注标题 player_name_bet_search = driver.find_elements(By.CSS_SELECTOR, "div:not(.style_disabled__2uBLz) .style_titleText__35WhH") # 对应筛选所有非离线的投注项和赔率 odds_name_search = driver.find_elements(By.CSS_SELECTOR, "div:not(.style_disabled__2uBLz) .style_label__2KJur") odds_values_search = driver.find_elements(By.CSS_SELECTOR, "div:not(.style_disabled__2uBLz) .style_price__15SlF")
3. 验证数据一致性
处理完成后,检查数据长度是否匹配:
print(len(player_bets), len(odds_names), len(odds_values)) # 正常情况下,odds_names和odds_values的长度应该是player_bets的整数倍(比如每个球员对应2个投注项)
内容的提问来源于stack exchange,提问作者maxi2
相关产品推荐
相关产品推荐

