Jsoup问题抓取非硬编码数据

时间:2016-07-17 01:42:09

标签: java web-scraping jsoup

我尝试使用Jsoup从Surfline.com收集波高信息。我在截图中有我想要的元素,它在开发工具中显示。当我用Jsoup刮取网站时,返回的字符串包括开发工具中看到的所有内容,但是" 1-2ft"这就是我需要的。该网站是Javascript沉重的,我假设jsoup在javascript实际运行之前抓住了html(我真的没有线索)。我是否需要专门告诉jsoup等待页面加载还是我错过了其他一些关键组件?

surfline.com

这是我正在使用的代码。

    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,我试图尽可能地阅读文档,但似乎没有任何关于这个特定问题的内容。任何见解都会很棒,非常感激。

1 个答案:

答案 0 :(得分:2)

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

在这种情况下,您使用JSoup获得的是浏览器开始构建页面的初始HTML。然后,有一组XHR调用 surfline API ,它将数据带入浏览器,然后动态填充页面的不同部分,包括当前的冲浪范围。

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

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