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

2022-09-04 04:49:38

现实世界的问题:

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

我提出的解决方案:

如果您还没有,我建议您阅读Google的使AJAX应用程序可抓取的完整规范

想象一下,我有:

  • 在域上的Heroku上托管的Sinatra应用程序http://example.com
  • 该应用程序在页面顶部有选项卡 TabA,TabB 和 TabC
  • 每个选项卡下是 SubTab1、SubTab2、SubTab3
  • 如果 url 是客户端 Javascript 则 onload 通过 AJAX 获取并加载 TabA,SubTab3 内容。http://example.com#!tab=TabA&subtab=SubTab3location.hash

注意:Hash Bang (#!) 是 google 规范的一部分。

我想构建一个简单的“网络服务”托管在Google App Engine(GAE)上,该服务:

  1. 接受 URL 参数,例如 (url 参数应该是 URLEncoded)http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3
  2. 运行 HTMLUnit 以在服务器上打开并运行客户端 javascript。http://example.com#!tab=TabA&subtab=SubTab3
  3. HTMLUnit 在一切完成(或大约 45 秒过去)后返回 DOM。
  4. 返回内容可以通过JSON / JSONP发送回去,或者将URL返回到生成并存储在Google应用引擎服务器上的文件(用于基于文件的“缓存”结果)...在这里接受建议。如果返回了文件的URL,那么您可以CURL来获取源代码(也称为HTML快照)。

我的应用程序需要管理呼叫...基本上:http://example.comhttp://htmlsnapshot.appspot.com

  1. 捕获 Googlebots 调用(googlebot 抓取程序会转义某些字符,例如 %26 = &)。http://example.com/?_escaped_fragment_=tab=TabA%26subtab=SubTab3
  2. 将请求从后端发送到(url参数应为 URLEncoded)http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3
  3. 将返回的 HTML 快照呈现到前端。
  4. 谷歌索引内容,我们欢欣鼓舞!

我对Google App Engine,Java或HTMLUnit没有任何经验。

我也许能弄清楚...如果我这样做,我会发布我的结果。

否则,我觉得这是一个非常好的机会,让某人写一篇踢屁股博客文章,概述新手设置此类Web服务的分步指南

这将向更多的人介绍优秀(和免费!谷歌应用引擎。此外,它无疑将鼓励更多的人采用Google的可抓取AJAX内容规范......我们都可以从中受益!

随着Google的规范越来越被接受,设置无头浏览器的“障碍”将向许多开发人员发送Google搜索答案!现在就带着一个名声和荣耀的答案进入!(编辑:至少我会唱你的赞美)。

在twitter上打我,@_chrisjacob如果你想讨论解决方案。


答案 1

我已经在AppEngine上成功使用了HTMLunit。我的GWT代码可以在gwt平台项目中找到,我得到的结果类似于Amit Manjhi的HTMLunit-AppEngine测试应用程序

使用 GWTP 当前 HTMLunit 支持来执行您描述的确切操作应该相对容易,尽管您可能会在更简单的应用程序中执行此操作。我看到的一个问题是 AppEngine 请求有 30 秒的超时,因此您不能拥有一个需要 HTMLunit 更长时间的页面来处理。

更新:已经有一段时间了,但我终于解决了关于使用GWTP使GWT应用程序可抓取的长期问题。文档并不完全存在,但请查看问题:http://code.google.com/p/gwt-platform/issues/detail?id=1


答案 2

推荐