You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:23:55