使用Jsoup爬取FanDuel网站Moneyline赔率数据遇阻求助
问题分析
- 动态内容渲染限制:Jsoup只能抓取初始静态HTML,而FanDuel的赔率数据是页面加载后通过JavaScript异步拉取并渲染的,直接用Jsoup请求拿不到完整的内容。
- 动态类名不可靠:你使用的
jo jp fk fe jy jz bs是前端框架生成的临时动态类名,这类名称会随网站更新频繁变化,完全不能作为定位元素的稳定依据。
解决方案
方法1:用支持JS渲染的工具(推荐Selenium)
Selenium可以模拟浏览器完整加载页面,等JavaScript执行完毕后再获取包含数据的完整HTML。示例代码如下:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; public class ExtractSportsBookData { public static void extractData(String url) { // 配置ChromeDriver路径,替换成你本地的实际路径 System.setProperty("webdriver.chrome.driver", "你的chromedriver路径"); ChromeOptions options = new ChromeOptions(); options.addArguments("--headless"); // 无头模式,无需弹出浏览器窗口 WebDriver driver = new ChromeDriver(options); try { driver.get(url); // 等待页面加载完成,可根据实际加载速度调整等待时长 Thread.sleep(5000); String fullPageSource = driver.getPageSource(); Document doc = Jsoup.parse(fullPageSource); // 改用语义化属性定位,比如优先找带data-testid的元素(可通过浏览器F12查看实际属性) Elements moneylineOdds = doc.select("[data-testid*=moneyline]"); moneylineOdds.forEach(elem -> System.out.println(elem.text())); } catch (Exception e) { e.printStackTrace(); } finally { driver.quit(); } } }
方法2:直接调用网站API接口
打开浏览器开发者工具(F12),切换到Network标签页,刷新页面后筛选XHR/Fetch请求,找到返回赔率数据的API接口。直接请求该接口获取JSON格式数据,比解析HTML更高效稳定。
注意事项
- 爬取前务必遵守FanDuel的服务条款和
robots.txt规则,确保行为合法合规。 - 定位元素时避开动态类名,优先使用语义化属性(如data-testid、id)或层级选择器。
内容的提问来源于stack exchange,提问作者gBarry
相关产品推荐
相关产品推荐

