【问题标题】:HtmlUnit to take snapshot of Ajax applicationsHtmlUnit 拍摄 Ajax 应用程序的快照
【发布时间】:2014-07-15 16:03:49
【问题描述】:

我创建了一个基本的 GWT (Google Web Toolkit) Ajax 应用程序,现在我正在尝试创建 snapshots to the crawlers read the page

我使用 HtmlUnit 创建了一个 Servlet 来响应爬虫。

当我在浏览器上时,我的应用程序运行良好。但是在 HtmlUnit 中,它会引发很多关于我在 HTML 中的特殊字符的错误。但是这些字符是内容,我不想用特殊代码替换它,一旦它正在工作,只是因为 HtmlUnit。 (至少我应该先检查一下我是否正确使用了 HtmlUnit)

我认为 HtmlUnit 应该读取页面的字符集信息并将其呈现为浏览器,一旦这是我认为的项目目标。

我没有找到关于这个问题的好信息。这是 HtmlUnit 限制吗?我是否需要更改我网站的所有内容才能使用这个 java 库来拍摄快照?

这是我的代码:

if ((queryString != null) && (queryString.contains("_escaped_fragment_"))) {
            // ok its the crawler
            // rewrite the URL back to the original #! version
            // remember to unescape any %XX characters

            url = URLDecoder.decode(url, "UTF-8");

            String ajaxURL = url.replace("?_escaped_fragment_=", "#!");


            final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_24);


            HtmlPage page = webClient.getPage(ajaxURL);

            // important!  Give the headless browser enough time to execute JavaScript
            // The exact time to wait may depend on your application.
            webClient.waitForBackgroundJavaScript(3000);

            // return the snapshot
            response.getWriter().write(page.asXml());

【问题讨论】:

  • 您是否在主机页面中设置了编码?
  • 是的,当然。 UTF8。如果我删除像“ç”这样的特殊字符,HtmlUnit 效果很好。
  • 您确定 'ç' 是用 utf-8 编码的,并且这不是 HtmlUnit 警告您不一致的方式吗?该字符来自哪里 - 它是在编译的 html/js 中,还是在呈现页面时对服务器调用的响应的一部分?
  • 另外,您是否确定 htmlunit 是此错误的来源,而不是浏览器本身?快速搜索错误中的文本似乎不是特定于 htmlunit,而是建议使用 xhtml doctype。
  • @ColinAlworth 哦,也许你是对的。我从 HTML 单元调用 asXml() 方法,这可能与原始 xml 的标头元标记相冲突。我会检查它...

标签: java gwt htmlunit googlebot google-crawlers


【解决方案1】:

问题在于 XML 与 HTML 冲突。 @ColinAlworth cmets 帮助了我。

我按照谷歌的例子,没有工作。

要让它工作,你需要删除 XML 标记,只响应 HTML,改变行:

 // return the snapshot
 response.getWriter().write(page.asXml());

 response.getWriter().write(page.asXml().replaceFirst("<\\?.*>",""));

现在正在渲染。

但是虽然它正在渲染,但 CSS 没有工作,并且 DOM 没有更新(GWT 在页面打开时更新页面标题)。 HTMLUnit 引发了很多关于 CSS 的错误,我正在使用 twitter bootstrap 没有任何更改。显然,HtmlUnit 项目有很多 bug,适合小型测试,但不适合解析复杂(甚至简单)的 HTML。

【讨论】:

  • 请记住,HtmlUnit 实际上并没有以可见的方式呈现内容。这意味着它实际上并不需要了解所有现代 CSS - 当然如果它知道它会很方便,这样您就可以检查您的应用程序。只要它返回正确的内容,我就不会担心它不知道如何呈现相同的内容。如果你想用更真实的浏览器来支持你的服务器,请查看 PhantomJS - 它是一个原生二进制文件,但它是一个无头 chromium 版本,甚至可以让你截取屏幕截图。
  • @ColinAlworth,我得到 asXml() 输出并在我的浏览器中打开,它与 Chrome 完全不同。在 GWT 中,您设置页面标题动态调用导致 javascript 的框架的方法。执行这些 javascripts ajax 方法后,HTMLUnit 不会返回更新的 DOM。我不知道人们有 ajax 网站是如何让爬虫做好他们的工作的。
猜你喜欢
  • 2018-12-03
  • 2016-04-11
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 2014-12-03
相关资源
最近更新 更多