【问题标题】:Retrieve rendered HTML DOM in pure Java在纯 Java 中检索呈现的 HTML DOM
【发布时间】:2012-02-23 08:41:09
【问题描述】:

我知道这里已经有一些类似的问题。但我不想用 Java 构建浏览器,我只想看到完全生成(或“渲染”)的源代码。好像我在浏览器中查看生成的 DOM。有人知道这方面的工具吗?

我查看了CobraHtmlUnit,但它们似乎无法正确呈现更复杂的网站。特别是如果在加载后有 AJAX 调用将内容添加到站点。我真的需要一个与浏览器一样的工具,而不需要实际显示它。到底要不要远程控制浏览器?

有人有这方面的经验吗?

可以找到一个非常相似但没有任何令人满意的答案的问题here

【问题讨论】:

  • 您需要查看呈现的 HTML 还是源代码?
  • 我不需要看视觉渲染的页面,我需要看生成的源代码。就像萤火虫在你查看 DOM 时显示的那样。
  • 你看过 Selenium 吗?我不确切知道您如何使用它来完成您的要求,但其中一个浏览器驱动程序可能存在后门 API。
  • 如果您只需要提供 URL 的呈现 HTML,您可以尝试docs.oracle.com/javase/tutorial/networking/urls/readingURL.html
  • 我也很想知道一个解决方案,而无需专门使用带有 javascript 生成的元素的浏览器

标签: java javascript ajax browser rendering


【解决方案1】:

我必须自己回答这个问题...最后我找到的最佳解决方案实际上是 HtmlUnit。这对我的需求来说太慢了。所以我建立了自己的工具,当然需要手动设置才能调用所需的链接。但因此它不必等待任何 js 超时等,而是从页面解析请求的信息并进行所需的调用。它需要大量的手动工作,但似乎没有其他解决方案能够运行得足够快。

【讨论】:

    【解决方案2】:

    Selenium 做了一些类似的事情。您需要在您的机器上安装 selenium 遥控器。然后你可以将 url 请求传递给 selenium。 Selenium 将打开一个浏览器来渲染 url 中提到的 html/dhtml 页面。之后,您可以通过查询 selenium 来获取整个 dom。你可以通过编码来完成所有这些事情

    http://seleniumhq.org/ 请注意:您需要安装 slenium webdriver 或 selenium 遥控器,而不是 selenium ide。

    【讨论】:

    • 非常感谢您的提示,最终可能确实是解决方案。但我宁愿不实际启动浏览器。它可能太慢了......我需要评估一段时间。
    • 启动浏览器真的很奇怪。也许你可以使用一些浏览器引擎来代替浏览器。但在那种情况下,我认为你不能使用硒,这可能会增加开销。我认为通过读取 url 来生成整个 dom 并不容易。在正文 onload 或 aftet ajax 请求中会有动态操作之类的东西。
    • 是的。我也刚刚从另一篇帖子stackoverflow.com/a/9088811/518587 中意识到 selenium 支持“无头”处理,但随后再次使用 HtmlUnit。而且 HtmlUnit 做得很好,但似乎很慢,有时还不如常见的浏览器。
    • selenium RC(远程控制)通常非常慢。如果您的目标是网络爬虫,那么这不是正确的方法。如果获取渲染的 Dom 是您项目的核心,那么您可以使用一些 javascript 渲染引擎。
    • 是的,我需要速度。你知道有哪些可以很好地集成到java中的javascript渲染引擎吗?
    【解决方案3】:

    我认为不存在在页面加载后抓取异步调用的库。

    我的建议是:

    1. 使用 Cobra 或类似库获取页面的 HTML。
    2. 解析 AJAX 请求的源。 (例如,ajax 调用将有一个 URL 参数和一个可用于请求的“数据”JSON 字符串)
    3. 对于每个 AJAX 调用,向您捕获的 URL 参数发出另一个请求。
    4. 将每次 AJAX 调用的结果附加到原始页面中的 HTML 源。

    这不是一个完美的解决方案,并且在需要用户触发事件的场景中对您没有帮助。此外,您用于捕获 AJAX 事件 URL 的代码也会因网站用于进行异步调用的 JavaScript 库而异。

    希望对您有所帮助。

    【讨论】:

    • 我已经在很多情况下这样做了,但是在更复杂的情况下它非常不方便。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多