【问题标题】:Jsoup Issue scraping non-hardcoded dataJsoup 问题抓取非硬编码数据
【发布时间】:2016-07-17 10:01:46
【问题描述】:

我正在尝试使用 Jsoup 从Surfline.com 收集波高信息。我在屏幕截图中有我想要的元素,它在开发工具中显示。当我用 Jsoup 抓取网站时,返回的字符串包括在开发工具中看到的所有内容,但我需要的是“1-2ft”。该网站是 Javascript 繁重的,我假设 jsoup 在 javascript 实际运行之前捕获了 html(我真的不知道)。我是否需要专门告诉 jsoup 等待页面加载,或者我是否缺少其他一些关键组件?

这是我正在使用的代码。

    Document doc = Jsoup.connect("http://www.surfline.com/surf-report/folly-beach-pier-southside-southeast_5294/").get();
    Elements content = doc.select("div[id=current-surf-range]");
    System.out.println(content);

这是我在 IDE 中看到的输出

<div id="current-surf-range" style="font-size:21px;font-weight:bold;padding-top:7px; padding-bottom: 7px;"></div>

div 的内容不会随它一起返回,这似乎很奇怪。这是我第一次使用 Jsoup,我尽可能地通读文档,但似乎没有涉及到这个特定问题。任何见解都会很棒,非常感谢。

【问题讨论】:

    标签: java web-scraping jsoup


    【解决方案1】:

    您在浏览器中看到的不一定是通过 URL 和您选择的 HTTP 库下载页面时所获得的内容。事实上,你永远不应该期望它们是相同的。在现代网络中,网页是非常动态的,并且是异步加载的,涉及对不同资源提供者的多个 API 调用以及在浏览器(具有 javascript 引擎)中执行的 javascript。

    在这种情况下,您使用JSoup 得到的是浏览器开始形成页面的初始 HTML。然后,对 surfline API 进行一组 XHR 调用,将数据带入浏览器,然后动态填充页面的不同部分,包括当前的 surf 范围。


    解决此问题的最简单方法是切换到名为selenium 的浏览器自动化工具,该工具将启动真正的浏览器。然后,您可以等待当前 surf 范围元素具有值,如果您希望继续使用 JSoup,请获取页面源并将其提供给 JSoup 以进行进一步解析。

    另一种方法是查看页面在浏览器开发人员工具中发出的请求,然后尝试在您的代码中模拟这些请求,解析 JSON 响应并提取冲浪预测数据。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多