Java 使AJAX应用程序可爬行?如何在Google App Engine上构建一个简单的web服务来生成HTML快照?

Java 使AJAX应用程序可爬行?如何在Google App Engine上构建一个简单的web服务来生成HTML快照?,java,ajax,google-app-engine,seo,htmlunit,Java,Ajax,Google App Engine,Seo,Htmlunit,现实世界问题: 我将我的应用程序托管在上,据我所知,他们无法提供运行无头(无GUI)浏览器的解决方案,例如为Googlebot生成索引以索引我的AJAX内容 我建议的解决方案: 如果你还没有,我建议你阅读谷歌的 想象一下我有: 域Heroku上托管的应用程序http://example.com 该应用程序在页面顶部有选项卡TabA、TabB和TabC 每个选项卡下都有子选项卡1、子选项卡2、子选项卡3 如果url为http://example.com#!tab=TabA&subtab=SubT

现实世界问题:

我将我的应用程序托管在上,据我所知,他们无法提供运行无头(无GUI)浏览器的解决方案,例如为Googlebot生成索引以索引我的AJAX内容

我建议的解决方案:

如果你还没有,我建议你阅读谷歌的

想象一下我有:

  • Heroku上托管的应用程序http://example.com
  • 该应用程序在页面顶部有选项卡TabA、TabB和TabC
  • 每个选项卡下都有子选项卡1、子选项卡2、子选项卡3
  • 如果url为
    http://example.com#!tab=TabA&subtab=SubTab3
    然后客户端Javascript获取
    location.hash
    并通过AJAX加载TabA,SubTab3内容
注意:Hash Bang(#!)是函数的一部分

我想在(GAE)上构建一个简单的“web服务”:

  • 接受URL参数,例如
    http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3
    (url参数应为url编码)
  • 运行HTMLUnit以打开
    http://example.com#!tab=TabA&subtab=SubTab3
    并在服务器上运行客户端javascript
  • HTMLUnit在一切完成后(或45秒后)返回DOM
  • 返回内容可以通过JSON/JSONP发送回来,或者URL返回到生成并存储在google app engine服务器上的文件(用于基于文件的“缓存”结果)。。。在这里接受建议。如果返回了一个文件的URL,那么您可以获取源代码(也称为HTML快照)
  • 我的
    http://example.com
    app需要管理呼叫
    http://htmlsnapshot.appspot.com
    。。。基本上:

  • 捕捉谷歌机器人对
    http://example.com/?_escaped_fragment_=tab=TabA%26subtab=SubTab3
    (谷歌机器人爬虫程序会转义某些字符,例如%26=&)
  • 将请求从后端发送到
    http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3
    (url参数应为url编码)
  • 将返回的HTML快照呈现到前端
  • 谷歌索引的内容,我们高兴 我没有任何使用谷歌应用程序引擎、Java或HTMLUnit的经验

    我也许能弄明白。。。如果我这样做了,我会发布我的结果

    否则,我觉得这是一个非常好的机会,有人可以写一篇精彩的博客文章,概述一个新手建立这样一个web服务的步骤指南

    这将向更多的人介绍优秀的(免费的!)谷歌应用程序引擎。毫无疑问,它还将鼓励更多的人采用谷歌的可爬行AJAX内容规范。。。我们都可以从中受益

    随着谷歌的规范越来越被接受,设置无头浏览器的“障碍”将让许多开发者在谷歌上搜索答案!现在就带着荣誉和荣誉的答案进入吧!(编辑:至少我会赞美你)


    如果您想讨论解决方案,请在twitter上与我联系。

    我已在AppEngine上成功使用了HTMLunit。我的GWT代码可以在中找到,我得到的结果与Amit Manjhi的类似

    使用GWTP当前的HTMLunit支持来完成您所描述的事情应该相对容易,尽管您可以在一个更简单的应用程序中完成。我看到的一个问题是AppEngine请求有30秒的超时时间,所以您不能有一个页面处理的时间超过30秒

    更新: 已经有一段时间了,但我终于解决了一个长期存在的问题,即使用GWTP使GWT应用程序可爬行。文档并不完整,但请查看问题:

    有趣的阅读:“让HtmlUnit在谷歌应用程序引擎(GAE)上运行”参见HtmlUnit 2.8发行说明。HtmlUnit 2.8发行说明:-你是对的,他们说GAE支持是功能性的(或至少是“固定的”)。我仍然在使用HtmlUnit访问我自己的应用程序时遇到问题,这使得应用程序很难向爬虫提供服务。我的问题的细节很微妙,但我在这里描述它们()。我已经有一段时间没有测试过了,所以问题可能已经解决了。在Amit Manjhi的测试应用程序上,它似乎可以在相同的URL上正常工作。也许这已经解决了问题,或者这取决于多种因素。可能是。有一段时间我一直在想,免费AppEngine帐户是否存在某些限制,不会连续生成两个servlet。谢谢Philippe和Matt。我将调查GWTP,看看能得出什么结果。如果你们中的任何一位有兴趣与我合作,我认为作为Web服务的无头浏览器是一个有趣的项目(对于GAE和GWTP应该不是很难)。今天,我设计了自己的解决方案,用于构建可爬行、可访问、深度链接的AJAX web应用程序。当客户端没有javascript时,利用无头浏览器生成HTML快照。。“无头AJAX”我想我会叫它;)。稍后将提供更多信息。Chris,GWTP上有一个未决问题,关于使基于应用程序引擎的GWTP应用程序可爬行的模块。我上面描述的bug阻止了它,但我的最新想法是,按照这里的建议,通过提供一种简单的方法来构建自己的Web服务,从而解决棘手的问题。也许你想在这方面有所贡献?(议题和讨论在:)