2010-08-19 8 views
14

Real World Problema:Rendere le applicazioni AJAX estraibili? Come creare un semplice servizio web su Google App Engine per produrre snapshot HTML?

ho la mia applicazione ospitata su Heroku, che (a mia conoscenza) non sono in grado di offrire una soluzione per l'esecuzione di un browser (GUI-less) Headless - quali HTMLUnit - per la generazione di HTML Snapshots per Googlebot per indicizzare il mio contenuto AJAX.

mio Soluzione proposta:

Se non lo hai già fatto, vi suggerisco di leggere Google Full Specification for Making AJAX Applications Crawlable.

Immaginate che ho:

  • un'applicazione Sinatra ospitato su Heroku sul dominio http://example.com
  • l'applicazione ha schede nella parte superiore della pagina TabA, Tabb e TABC
  • sotto ogni tab è SubTab1, SubTab2, SubTab3
  • onload se l'url è http://example.com#!tab=TabA&subtab=SubTab3 quindi lato client Javascript prende le location.hash e carichi a Taba, contenuti SubTab3 tramite la tecnologia AJAX.

Nota: Hash Bang (#!) Fa parte di google spec.

Vorrei costruire un semplice "servizio web" ospitato su Google App Engine (GAE) che:

  1. accetta un URL param esempio http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3 (il parametro url deve essere URLEncoded)
  2. Esegue HTMLUnit per aprire http://example.com#!tab=TabA&subtab=SubTab3 ed eseguire il javascript sul lato client sul server.
  3. HtmlUnit restituisce il DOM una volta che tutto è completo (o qualcosa di simile 45 secondi è passato).
  4. Il contenuto ritorno potrebbe essere rispediti tramite JSON/JSONP, o in alternativa un URL è tornare a un file generato e memorizzato sul server di Google App Engine (per i file based "cache" risultati) ... aperto a suggerimenti qui. Se un URL di un file è stato restituito allora si potrebbe CURL per ottenere il codice sorgente (aka un'istantanea HTML).

mio http://example.com applicazione avrebbe bisogno per gestire la chiamata a http://htmlsnapshot.appspot.com ... in fondo: Googlebots

  1. cattura chiamata a http://example.com/?_escaped_fragment_=tab=TabA%26subtab=SubTab3 (Googlebot crawler sfugge certi caratteri ad esempio% 26 = &).
  2. Invia richiesta dal backend a http://htmlsnapshot.appspot.com?url=http://example.com#!tab=TabA&subtab=SubTab3 (il parametro url deve essere URLEncoded)
  3. Renderizza l'istantanea HTML restituita al frontend.
  4. Google indicizza il contenuto e ci rallegriamo!

Non ho alcuna esperienza con Google App Engine o Java o HTMLUnit.

Potrei riuscire a capirlo ... e pubblicherò i risultati se lo faccio.

Altrimenti sento che questo è un un'ottima opportunità per qualcuno di scrivere un post sul blog kick-ass che delinea un novizi passo-passo guida per la creazione di un servizio web come questo.

Questo introdurrà più persone all'eccellente (e gratuito!) Google App Engine. Inoltre incoraggerà indubbiamente più persone ad adottare le specifiche di Google per contenuti AJAX crawlable ... qualcosa di cui tutti possiamo beneficiare!

Come guadagni specifiche di Google più l'accettazione del "ostacolo" di creare un browser senza testa sta per inviare molti sviluppatori Googling per le risposte! Entra ora con una risposta per fama e gloria! (modifica: per lo meno canterò le tue lodi).

Hit me su twitter @_chrisjacob se si desidera discutere soluzioni.

+0

interessante lettura: "Get HtmlUnit per funzionare su Google App Engine (GAE)" http://sourceforge.net/tracker/index.php?func= detail & aid = 2962074 & group_id = 47038 & atid = 448269 –

+0

Vedere le note sulla versione di htmlunit 2.8. –

+0

htmlunit 2.8 note di rilascio: http://htmlunit.sourceforge.net/changes-report.html#a2.8 - hai ragione affermano che il supporto GAE è funzionale (o almeno "corretto"). –

risposta

2

Ho utilizzato con successo HTMLunit su AppEngine. Il mio codice GWT per farlo è disponibile nello gwt-platform project i risultati che ho ottenuto erano simili a quello dello HTMLunit-AppEngine test application di Amit Manjhi.

Dovrebbe essere relativamente facile utilizzare il supporto HTMLunit corrente di GWTP per fare esattamente quello che viene descritto, anche se probabilmente lo si potrebbe fare in un'applicazione più semplice. Un problema che vedo è che le richieste di AppEngine hanno un timeout di 30 secondi, quindi non è possibile avere una pagina che richiede HTMLunit più lungo di quello da elaborare.

UPDATE: E 'stato un po', ma alla fine ho chiuso la questione di lunga data su come rendere le applicazioni GWT individuabili utilizzando GWTP. La documentazione non è del tutto lì, ma guarda che la questione: http://code.google.com/p/gwt-platform/issues/detail?id=1

+0

Quindi HtmlUnit funziona su GAE ora? Eventuali avvertenze che conosci? –

+0

Ho ancora problemi nell'accesso alla mia applicazione con HTMLunit, il che rende difficile per un'app servire al crawler. I dettagli del mio problema sono sottili ma li descrivo qui (http://bit.ly/bViIMr). Non l'ho provato da un po ', quindi forse il problema è andato via. –

+0

Sull'app di prova di Amit Manjhi sembra funzionare bene con lo stesso URL. Forse questo ha risolto se stesso, o forse dipende da una moltitudine di fattori. –