鼠标悬停代码失效,如何修复1xBet开盘赔率抓取问题
问题:Oddsportal网站1xBet开盘赔率抓取脚本报错修复
我想抓取Oddsportal上这场赛事的1xBet开盘赔率,编写的JavaScript代码无法正常运行,控制台提示undefined错误,希望实现鼠标悬停显示开盘赔率的效果。
赛事链接:https://www.oddsportal.com/football/chile/segunda-division/real-san-joaquin-linares-unido-tOuhZVip/#ht-ft;2;27
原错误代码
hda = 1; bookmaker= '1xBet'; els = document.getElementsByClassName('flex'); for (var i = els.length - 1; i >= 0; i--) { if(els[i].innerText.startsWith(bookmaker) && els[i].innerText.endsWith(`%`)) { el = els[i].children[hda].children[0]; event = new Event('mouseover'); el.dispatchEvent(event); break; } }
问题分析
getElementsByClassName('flex')选取范围过广,包含大量无关元素,导致后续children[hda]可能不存在,触发undefined错误- 直接用
innerText.startsWith(bookmaker)容易因文本格式(空格、换行)匹配失败 - 原生
Event('mouseover')无法触发网站绑定的自定义悬停事件,模拟效果无效
修复后的代码
const bookmaker = '1xBet'; // 精准定位博彩商所在的行元素 const bookmakerRows = document.querySelectorAll('.table-main__row'); for (const row of bookmakerRows) { const bookmakerNameEl = row.querySelector('.table-main__name'); if (!bookmakerNameEl || bookmakerNameEl.textContent.trim() !== bookmaker) continue; // 找到HT/FT对应的赔率单元格(索引根据页面结构调整,对应原hda=1的位置) const oddsCell = row.querySelectorAll('.table-main__odds')[1]; if (!oddsCell) continue; // 创建标准MouseEvent模拟真实鼠标悬停 const hoverEvent = new MouseEvent('mouseover', { bubbles: true, cancelable: true, view: window }); oddsCell.dispatchEvent(hoverEvent); // 可选:触发悬停后读取弹窗内的开盘赔率数据 setTimeout(() => { const popup = document.querySelector('.popup'); if (popup) { const openingOdds = popup.textContent.trim(); console.log('1xBet开盘赔率:', openingOdds); } }, 200); break; }
修复说明
- 使用
querySelectorAll('.table-main__row')缩小元素范围,只定位博彩商数据行 - 通过
table-main__name类精准获取博彩商名称,用trim()处理文本空格,确保匹配准确 - 用
querySelectorAll('.table-main__odds')选取赔率单元格,避免依赖不稳定的children索引 - 替换为
MouseEvent并添加必要参数,模拟真实用户的悬停行为,确保触发网站的自定义事件 - 增加空值判断逻辑,避免因元素不存在导致的报错
- 可选添加延迟读取弹窗内容的代码,直接获取开盘赔率数据
内容的提问来源于stack exchange,提问作者user23637136
相关产品推荐
相关产品推荐

