小编典典

使AJAX应用程序易于抓取?如何在Google App Engine上构建简单的Web服务以生成HTML快照?

ajax

现实世界中的问题:

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

我建议的解决方案:

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

想象一下我有:

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

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

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

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

我的http://example.com应用将需要管理对http://htmlsnapshot.appspot.com… 的调用,基本上是:

  1. 捕获对Googlebots的呼叫http://example.com/?_escaped_fragment_=tab=TabA%26subtab=SubTab3(googlebot搜寻器会转义某些字符,例如%26 =&)。
  2. 将请求从后端发送到http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3(URL参数应为URLEncoded)
  3. 将返回的HTML快照渲染到前端。
  4. Google将内容编入索引,我们很高兴!

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

我也许可以弄清楚……如果可以的话,将发布我的结果。

否则,我觉得这是一个 非常好的机会, 对于某人来说,写一个踢屁股博客文章概述 了新手如何逐步 建立这样的Web服务的 指南

这会将更多的人介绍给出色的(免费的)Google App
Engine。毫无疑问,这还将鼓励更多的人采用Google的可抓取AJAX内容规范…我们都可以从中受益!

随着Google规范的获得越来越多的接受,设置无头浏览器的“障碍”将使 许多
开发人员谷歌搜索答案!立即获得名誉和荣耀的答案!(编辑:至少我会唱歌给你赞美)。

@_chrisjacob 如果您想讨论解决方案,请在Twitter上打我。


阅读 213

收藏
2020-07-26

共1个答案

小编典典

我已在AppEngine上成功使用HTMLunit。我的GWT代码可在gwt-
platform项目中找到
,我得到的结果与Amit Manjhi 的HTMLunit-
AppEngine测试应用程序
的结果相似。

使用GWTP当前的HTMLunit支持来完全按照您的描述进行操作应该相对容易,尽管您可以在更简单的应用程序中进行操作。我看到的一个问题是AppEngine请求的超时时间为30秒,因此您的页面处理HTMLunit的时间不能超过该时间。

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

2020-07-26