воскресенье, 8 ноября 2009 г.

Создание RSS робота с входным значением для поиска на Digg


Creating an RSS robot with an input value to search Digg

В этом руководстве мы рассмотрим, как создать и проверить RSS робота, использующего входные значения. На вход робот будет принимать значения, которые он будет использовать для поиска на Digg, робот должен будет вернуть канал основан на результатах поиска.
Это руководство основано на следующих учебных пособиях:
  1. Построение базового RSS робота;
  2. Использование цикла Для Каждого;
  3. Использование цикла Next-Repeat;
Предполагается, что вы прочитали и поняли эти руководства, что вы уже скачали среду разработки роботов - RoboMaker и зарегистрирован как пользователь на openkapow.

Часть 1 - Создание RSS робота, с входным значением.

Мы начнем с открытия RoboMaker и создания нового RSS робота, который стартует с www.digg.com. Когда мастер создания нового робота "New Robot Wizard" спрашивает  "Use input values?" (Использовать входные значения?) мы выбираем "Yes".
Введите "searchText" в текстовое поле и нажмите кнопку "Добавить". Для этого робота нам не нужно больше значений, в противном случае мы просто добавим их по мере необходимости.
На следующем экране мы добавляем значение по умолчанию для поля "searchText". Это значение мы будем использовать при разработке роботов. В этом случае нам потребуется текстовый поиск с целью получения каких-либо результатов с Digg. Так давайте же использовать значение "robot" в ходе разработки. После того, как этот робот будет сделан и опубликован на openkapow.com входное значения "searchText" не будет зафиксировано на значении "robot", это будет что то вроде параметра, который можно будет определить при вызове робота (подробнее об этом позже).
Теперь нажмите кнопку "Готово", и мы получим стандартного RSS робота с шагами "Load Page" и "Return Item". Поскольку мы определили одно входное значение мы должны увидеть различия, давайте посмотрим на входные объекты нашего нового робота. Oбъект  RSSInput состоит из 10 пар "Name-Value". В этом случае мы имеем только одно заполненное значение, так атрибут "name1" = "searchText" и атрибут "value1" = "robot". Это означает, что когда кто-то вызывает робота через URL openkapow.com с помощью параметра "searchText" (например http://service.openkapow.com/....?searchText=robot "), то значение параметра будет доступно внутри робота в атрибуте "value1". Заметим, что если робот имеет несколько входных параметров, (порядок не имеет значения), параметр "searchText" всегда будет определен name1-value1 (в данном случае).

Часть 2 - Использование входного знаения для поиска Digg

Теперь нам необходимо использовать входные значения для взаимодействия с этой страницой. Это очень просто сделать. Щелкните правой кнопкой мыши в окне поиска в верхней части Digg.com. Затем выберите "Enter Text from Attribute" и выберите атрибут "RSSInput.Value1 (searchText)".
Мы добавили новый шаг в нашего робота - "Enter Value 1". Когда он выполняется вы можете видеть, что он пишет слова "robot" в поле поисках, как если бы Вы ввели его на веб-странице.
После того как мы ввели текст поиска нам нужно добавить шаг Click, который нажимает на кнопку поиска.
Нажав кнопку поиска будет загружена новая страница с результатами поиска, результаты поиска - это то что нам нужно, чтобы вернуться RSS канал. Давайте добавим цикл ДЛЯ КАЖДОГО, и цикл Repeat-Next, который возвращает все посты с первых 3 страницах результатов поиска . Если вы не знакомы с тем, как это сделать Существуют другие руководства, которые подробно это описывают. В конечном итоге наш робот должен выглядеть примерно так:
Мы все знаем, что робот, отлично работает, когда входное значение "robot", но мы не знаем, как робот будет реагировать на другие значения. Чтобы проверить это, мы должны начать тестирование робота.
Часть 3 - Отладка робота и добавление обработки ошибок
Откройте RoboDebugger. В отладчике мы можем видеть какие входные значения будут использоваться при выполнении робота, в данном случае это будет, конечно же, "robot".
Запустите робота в отладчике один раз, чтобы убедиться, что он работает как следует. Затем измените текст "Value1" в объекте RSSInput на "cool" и запустите робота снова. Надеемся, он будет работать, а это означает, что вы создали робота, который может использовать динамические входные значения. Конечно, пользователи нашего робота могут использовать любые значения, и мы до сих пор тестировали робота с участием входных значений, которые возвращали несколько постов с Digg. Но что произойдет, если мы используем значение "searchText", которое не возвращает каких-либо результатов поиска? Давайте попробуем, ввести текст "asdfgh", а затем запускать отладчик. Результат не очень хороший, возникает ошибка в шаге "For Each" поскольку он не находит обозначенные нами тэги.
Если мы перейдем к вкладке "Windows" то увидим, что ошибка возникла именно из за отсутствия результатов поиска текста "asdfgh".
Таким образом, робот не может справиться с любым значением "searchText". Для того чтобы наш робот мог избежать этих проблем, мы должны добавить обработку определенных ошибок, это должно быть сделано в RoboMaker, а не в RoboDebugger. Чтобы перейти от отладчика к RoboMaker просто нажмите кнопку на вкладке ошибки в RoboDebugger. Откроется RoboMaker в том же состоянии, что и RoboDebugger в момент возникновения ошибки. Это означает, что текущим будет шаг "For Each" и RSSInput.Value1 будет равно "asdfgh".
Есть несколько способов, с помощью которых мы могли бы улучшить робота.Мы могли бы обработать ошибку на шаге "For Each", или мы могли бы выполнить тест на наличие результата еще до перехода к шагу  "For Each". В этом случае давайте проверим страницу на наличие текста "No results found" после поиска, и если страница содержит этот текст, то мы знаем, что ничего не было найдено. После того, как мы решили, где будет происходить обработка ошибок мы также должны решить, как справиться с ошибкой. Достаточно, то что робот не вызывает ошибки, или мы должны возвратить сообщение об ошибке вызывающей программе нашего робота? Поскольку это RSS робот, вероятно, достаточно пропустить ошибку. При построении REST роботов гораздо важнее, вернуть сообщение об ошибке.
Давайте добавим обработку ошибок для робота. Сделайте активным шаг "Repeat", нажав на него, затем щелкните на тексте "No results found" в представлении браузера. Возвращайтесь в DOM (нажимая на иконку стрелки в HTML пути, в представлении браузера, либо в представлении источника HTML) до тех пор, пока вы не определите Div с классом "notice", который содержит текст "No results found". Щелкните правой кнопкой мыши по этому Div и добавьте условие "Test Tag".
Для того чтобы получить шаг "Test Tag" нужный нам, необходимо его немного настроить. Когда мы добавили шаг, Tag Finders будет пытаться найти Div "notice", но теперь мы должны определить, что шаг должен проверить в этом Div. Сделаем это в шаге на закладке "Action -Basic". Введите шаблон ".*No results found.*" (без кавычек), измените Match Against на "Only text", и действия на "Continue if pattern matches found tag" (Продолжить, если найден тэг по шаблону). Все это означает, что шаг будет проверять Div, и если он содержит текст "No results found", шаг позволит потоку исполнения приступить к следующему шагу.
Если уведомление Div не содержит текст "No results found", мы хотим, чтобы робот извлек все данные и вернул RSS канал. Для этого нам необходимо изменить еще 2 вещи в шаге "Test Tag". Первая заключается в том, что шаг должен генерировать ошибку, если в тексте Div не содержится "No results found". Для этого мы идем к закладке "Error Generation" и включаем "Generate Error When Stopping" (Генерировать ошибку при остановке).
Сейчас Есть 2 сценария, шаг "Test Tag" будет генерировать ошибку - когда уведомление Div не содержит "No results found", и если не найден Div  "notice" (то есть имеется результат поиска). Идем на закладку "Error Handling" шага и определяем "Own errors" как "Sent backwards". Это означает, что если шаг "Test Tag" генерирует ошибку эта ошибка будет перенесена обратно на предыдущий шаг. Зачем мы это cделали  вы скоро поймете.
Шаг "Test Tag" теперь полностью настроен, однако шаги в роботе расположены не в должном порядке.В настоящее время шаг "Test Tag" находится между "Click Submit" и "Repeat", что означает, что если поиск на Digg не приносит результатов, робот приступит к попытке извлечения, в противном случае "Test Tag" порождает ошибки, которые он транслирует в шаг "Click Submit", но этот шаг не обрабатывает эту ошибку. Безусловно нужно немного изменить робота. Первое, что нужно сделать, это добавить новое соединение между шагами "Click Submit" и "Repeat". Переместите мышь к концу этого шага "Click Submit", появится небольшая белая стрелка, затем, удерживая кнопку мыши  переместите стрелку на шаг "Repeat".
Щелкните правой кнопкой мыши на связи между шагами "Test Tag" и "Repeat" и выберите Delete. Теперь у нас есть робот, который распадается на 2 ветви после шага "Click Submit".
Если мы запустим робота прямо сейчас вначале будет выполняться верхняя ветвь и шаг "Test Tag", а затем (если робот не вызовет ошибку) будет выполнятся нижняя ветвь, которая начинается с шага "Repeat". Мы не хотим этого, мы хотим, чтобы робот для теста выполнял верхнюю ветвь и если (только если) в ветви произойдет ошибка, он должен перейти к нижней ветви и начать цикл извлечения. Для этого нам нужно, настроить обработку ошибок в шаге "Click Submit" - изменить "Branching Mode" из значения по умолчанию "All Branches" в "Until Successful Branch". Это означает, что шаг "Click Submit" приступит к нижней ветви только в том случае, если верхняя ветвь возвратит сообщение об ошибке. Заметим, что линии соединения шагов стали отображаться пунктирными линиями.
Это путь к созданию структур "if-then" в RoboMaker. Шаг, который получает ошибку и имеет "unitl successful branch" переходит на другую ветвь, если в первой произошла ошибка. В данном примере мы имеем 2 ветви, но вы можете добавить сколько угодно ветвей после шага "Click Submit". За более подробной информацией о ветвях и способах обработки ошибок, обратитесь к документации RoboMaker.
Робот будет готов к испытанию в RoboDebugger еще раз, но до этого давайте добавим еще один шаг, который не добавляет каких-либо функций, но но с ним гораздо легче отлаживать робота. Просто добавьте шаг "Do Nothing" после шага "Test Tag" Чтобы сделать это, достаточно добавить новый шаг после "Test Tag", а затем выбрать действие "Do Nothing" . Этот новый шаг не только облегчает тестирование, но и позволяет понять логику работы робота.
Если мы в настоящее время испытаем робота в RoboDebugger, мы увидим, что он работает как с "хорошими" так и с "плохими" входными данными!

Часть 4 - Запуск робота

Робот протестирован и готов к опубликованию так что мы сможем вызывать его из нашего RSS Reader`а для получения последних новостей о конкретной теме с Digg. Начните с опубликования робота на openkapow (если вам интересно, как сделать это, то прочитайте данное учебное пособие). Публикация дает нам URL http://service.openkapow.com/tutorial/rssdigginput.rss по которому мы можем запустить робота на openkapow сервере.
Если загрузить этот адрес(страницу) в браузере, мы получим страницу, где можно задать входные значения. Здесь вы можете запустить робота с разными входными значениями. Это страница формирует URL с указанием параметра "searchText". Например, если Вы ищете "robot" этот URL будет называться:
http://service.openkapow.com/tutorial/rssdigginput?searchText=robot
Если вместо этого Вы ищете Digg рассказы о Марсе вы получите этот URL:
http://service.openkapow.com/tutorial/rssdigginput?searchText=mars
Эти URL-адреса, конечно, могут быть запрошены с вашего RSS Reader, а не через страницу, где вы можете указать входные значения.

Заключение

В этом учебнике мы еще больше расширили робота  Digg RSS, чтобы иметь возможность принимать входные значения, использовать эти значения для поиска на Digg, а затем вернуть RSS канал основанный на результатах поиска. Мы также можем корректно обрабатывать остувтие результатов поиска на Digg. Этот робот немного медленнее предыдущего, и в следующем учебном пособии мы взглянем на то, как повысить эффективность этого робота.

P.S. Если Вы заинтересованы в использовании роботов совместно с Digg и создании RSS-каналов, то посмотрите на демо Личный Digg RSS канал и оцените, каким образом это можно сделать с помощью сочетания роботов и JavaScript.