使 AJAX 应用程序可爬网?如何在Google App Engine上构建一个简单的Web服务来生成HTML快照?
现实世界的问题:
我的应用程序托管在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=SubTab3
location.hash
注意:Hash Bang (#!) 是 google 规范的一部分。
我想构建一个简单的“网络服务”托管在Google App Engine(GAE)上,该服务:
- 接受 URL 参数,例如 (url 参数应该是 URLEncoded)
http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3
- 运行 HTMLUnit 以在服务器上打开并运行客户端 javascript。
http://example.com#!tab=TabA&subtab=SubTab3
- HTMLUnit 在一切完成(或大约 45 秒过去)后返回 DOM。
- 返回内容可以通过JSON / JSONP发送回去,或者将URL返回到生成并存储在Google应用引擎服务器上的文件(用于基于文件的“缓存”结果)...在这里接受建议。如果返回了文件的URL,那么您可以CURL来获取源代码(也称为HTML快照)。
我的应用程序需要管理呼叫...基本上:http://example.com
http://htmlsnapshot.appspot.com
- 捕获 Googlebots 调用(googlebot 抓取程序会转义某些字符,例如 %26 = &)。
http://example.com/?_escaped_fragment_=tab=TabA%26subtab=SubTab3
- 将请求从后端发送到(url参数应为 URLEncoded)
http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3
- 将返回的 HTML 快照呈现到前端。
- 谷歌索引内容,我们欢欣鼓舞!
我对Google App Engine,Java或HTMLUnit没有任何经验。
我也许能弄清楚...如果我这样做,我会发布我的结果。
否则,我觉得这是一个非常好的机会,让某人写一篇踢屁股博客文章,概述新手设置此类Web服务的分步指南。
这将向更多的人介绍优秀(和免费!谷歌应用引擎。此外,它无疑将鼓励更多的人采用Google的可抓取AJAX内容规范......我们都可以从中受益!
随着Google的规范越来越被接受,设置无头浏览器的“障碍”将向许多开发人员发送Google搜索答案!现在就带着一个名声和荣耀的答案进入!(编辑:至少我会唱你的赞美)。
在twitter上打我,@_chrisjacob
如果你想讨论解决方案。