Делать приложения AJAX доступными для сканирования?Как создать простой веб-сервис на Google App Engine для создания снимков HTML? - PullRequest
14 голосов
/ 19 августа 2010

Проблема реального мира:

У меня есть мое приложение на Heroku , которые (насколько я знаю) не могут предложить решение для запуска Headless (Без GUI) Браузер - например, HTMLUnit - для генерации HTML-снимков для Googlebot для индексации моего содержимого AJAX.

Мое предлагаемое решение:

Если вы еще этого не сделали, я предлагаю прочитать полную спецификацию Google по созданию приложений AJAX, которые можно сканировать .

Представьте, что у меня есть:

  • a Sinatra приложение, размещенное на Heroku в домене http://example.com
  • , приложение имеет вкладки в верхней части страницы TabA, TabB и TabC
  • под каждой вкладкой - SubTab1, SubTab2, SubTab3
  • onload, если URL-адрес http://example.com#!tab=TabA&subtab=SubTab3, тогда клиентский Javascript принимает location.hash и загружает в TabA, Содержимое SubTab3 через AJAX.

Примечание: Hash Bang (#!) Является частью google spec .

Я хотел бы создать простой "веб-сервис", размещенный на Google App Engine (GAE), который:

  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. HTMLUnit возвращает DOM, когда все завершено (или прошло около 45 секунд).
  4. Возвращаемое содержимое может быть отправлено обратно через JSON / JSONP, или, в качестве альтернативы, URL-адрес возвращает файл, сгенерированный и сохраненный на сервере механизма приложений Google (для файловых «кэшированных» результатов) ... открытый дляпредложения здесь.Если 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 должен быть в кодировке URLE)
  3. Визуализировать возвращенный моментальный снимок HTML на веб-интерфейс.
  4. Google индексирует содержимое, и мы радуемся!

НадеюсьУ меня нет опыта работы с Google App Engine, Java или HTMLUnit.

Возможно, я смогу выяснить это ... и опубликую свои результаты, если я это сделаю.

В противном случае я чувствую это ОЧЕНЬ хорошая возможность для того, чтобы кто-то написал офигенное сообщение в блоге, в котором изложено пошаговое руководство для новичков по настройке подобного веб-сервиса.

Это познакомит больше людей с отличным (и бесплатным!) Google App Engine.Кроме того, это, несомненно, будет способствовать тому, что все больше людей примут спецификации Google для контента AJAX для сканирования ... что-то, от чего мы все сможем извлечь выгоду!

По мере того, как спецификация Google получает все большее признание, "препятствие" для установки браузера без головы будетотправить много разработчиков Поиск в Google для ответов!Получить сейчас с ответом на славу и славу!(отредактируйте: по крайней мере я буду петь ваши похвалы).

Нажмите меня в твиттере @_chrisjacob, если вы хотите обсудить решения.

1 Ответ

2 голосов
/ 19 августа 2010

Я успешно использовал HTMLunit в AppEngine.Мой код GWT для этого доступен в проекте gwt-платформы , результаты которого были схожи с результатами тестового приложения HTMLunit-AppEngine от Amit Manjhi.

Должно быть относительно легко использовать текущую поддержку HTMLWit GWTP, чтобы делать именно то, что вы описываете, хотя вы, вероятно, могли бы сделать это в более простом приложении.Одна проблема, которую я вижу, состоит в том, что запросы AppEngine имеют 30-секундный тайм-аут, поэтому у вас не может быть страницы, которая обрабатывает HTMLunit дольше, чем эта.но я наконец закрыл давнюю проблему о том, чтобы сделать приложения GWT доступными для сканирования с помощью GWTP.Документация не полностью там, но проверьте проблему: http://code.google.com/p/gwt-platform/issues/detail?id=1

...