суббота, 17 октября 2009 г.

Создание RSS робота, перебирающего страницы Digg



Creating an RSS robot that pages through Digg

Это руководство расширяет RSS робота из учебника "Создание RSS робота возвращающего все посты с главной страницы Digg". В нем мы сделали RSS робота, возвращающего все посты с главной страницы Digg, теперь мы собираемся изменить его, так что бы он мог вернуть посты из нескольких страниц Digg, а не только из первой.
Предполагается, что вы читали предыдущие руководства, и знакомы с основами, предполагается, что вы уже скачали среду разработки роботов - RoboMaker и зарегистрированы как пользователь на openkapow.com.
Часть 1 - Создание RSS робота, который возвращает все рассказы с главной страницы Digg.
Это именно то, что было сделано в предыдущем руководстве.Там мы за 6 шагов построили робота, который в цикле перебирал все посты с главной страницы Digg и возвращал название, адрес и описание каждого поста. Руководство описывало Цикл Для Каждого и то как работают итерации в таком цикле.
Этот робот имел четкое ограничения - возвращение постов с первой страницы Digg. Если мы хотим, вернуться посты со стр. 2, 3 и 4 и т.д. наш робот просто не сможет справиться с этим. Эту функциональность робота мы добавим в этом пособии. Тем не менее, нет необходимости менять части существующего робота, он делает именно то, что мы хотим, для каждой отдельной страницы. Так что нам просто нужно добавить еще один цикл, пеербирающий страницы Digg.

Часть 2 - Добавление цикла Repeat-Next

В Цикле "For Each Tag" мы использовали различные посты с главной страницы Digg, что в действительности не соответствует нашим потребностям, если речь идет о цикле через страницы. Переход к новой итерации в цикле страниц, это не переход на новый набор HTML-тегов (или перемещения текущего тега если рассматривать техническую сторону), вместо этого нам нужно нажать на ссылку "Next page" и загрузить следующую страницу перед переходом к следующей итерации.


Это больше чем может цикл "For Each", поэтому мы будем использовать другой вид цикла - "Repeat-Next". Такого рода цикл состоит из двух различных шагов - шага "Repeat" и "Next". Шаг "Repeat" начинает цикл, шаг "Next" переводит цикл к следующей итерации. Давайте добавим начало цикла, т.е. шаг "Repeat". Этот шаг должен быть помещен после загрузки страницы, но перед шагом "For Each Tag" поскольку мы хотим включить цикл ДЛЯ КАЖДОГО внутрь цикла "Repeat-Next". Вставьте шаг "Repeat" кликнув правой кнопкой мыши на шаге "Load Page" выбрав "Insert Step After".Мы вставили пустой шаг после шага "Load Page".Теперь мы должны определить тип этого шага. Щелкните правой кнопкой мыши на пустом шаге и выберите команду "Configure Step".



В окне "Step Configuration", которое открылось выберите Loops -> Repeat  в списке "Select an Action" - этим вы создаете новый шаг "Repeat". Еще один способ сделать это же, нажать на пустой шаг, а затем выбрать действие непосредственно в конфигурации шага, в правой части окна RoboMaker.


Для завершения цикла "Repeat-Next" нам нужен шаг "Next", чтобы добавить этот шаг, мы добавляем новую ветку для робота. Щелкните по шагу "Repeat", тем самым выделив его, затем нажмите на маленький значок в меню "Add branch for selected step".


На наш робот теперь мы будет иметь 2 ветки - верхняя с циклом "Для Каждого", а нижняя с одним пустым шагом. Настройте новый пустой шаг как "Next" так же как мы это сделали для шага "Repeat".
Если мы сейчас выполним этого робота он выполнит шаги "Load Page" и "Repeat", а затем выполнит ветку "For Each", пока у этого цикла нет больше итераций. Затем робот будет выполнять шаг "Next", который перемещает цикл "Repeat-Next" к следующей итерации. Эта итерация выполнит вновь цикл "For Each" и т.д. Шаг будет возвращать посты с главной страницы Digg снова и снова, поскольку сейчас он  не может перейти к следующей странице - мы создали бесконечный цикл. Это конечно не совсем то, что мы хотим, и поэтому мы должны добавить функциональность ветке "Next". За более подробной информацией о ветках и порядке исполнения, пожалуйста, обращайтесь к документации RoboMaker.
Часть 3 - Добавление функциональности к ветке "Next"


В цикле "Repeat-Next" робота мы должны перейти к следующей странице Digg перед шагом "Next" для получения всех постов Digg со всех страниц. Добавьте шаг "Click" до шага "Next". Шаг "Click" будет нажимать ссылку "Next page" в нижней части страницы Digg. Для этого выберите шаг "Next" и нажмите правую кнопку на ссылке "Next" в пердставлении браузера.


Если выполнить робота сейчас, мы сможем вернуть все посты со всех страницах Digg. Мы можем проверить это на RoboDebugger, но чтобы не ждать длительное время, давайте использовать точки останова в отладчике. Начните с открытия RoboDebugger, щелкните правой кнопкой на шаг "Next" и выберите "Toggle breakpoint". Теперь вы можете запустить робота в отладчике. Каждый раз, когда выполняется шаг "Next" отладчик останавливается, и если вы хотите выполнить следующую итерацию цикла Repeat-Next нажмите на иконку запустить снова. Это должно перемещать робота по страницам Digg и возвращать все посты с этих страницах. Сейчас робот имеет серьезные проблемы, уделите минуту отладке робота в RoboDebugger и вы сможете найти их.


Тестирование прошло удачно? Проблема заключается в том, что впервые выполнив шаг "Click Next" мы загружаем следующую страницу, а при втором выполнении этого шага происходит возврат на предыдущую страницу. Таким образом, робот будет мотаться туда, сюда между первой и второй страницей. Очевидно мы должны это исправить, и для этого нам необходимо уточнить Tag Finders шага "Click Next" так чтобы, что он не просто нажимал на ссылку класса "nextprev" (так как ссылки "next" и "previous" имеют одинаковый класс). Это можно сделать, добавив шаблон поиска тега в Tag Finder. Этот шаблон, как и все остальные в RoboMaker, используют регулярные выражения. Если вы не знакомы с регулярными выражениями, не волнуйтесь, в справке по RoboMaker и документации, много информации по данной теме. Шаблон который мы используем здесь - ".*Next.*", ищет в тэге ссылки текст начинающийся с "Next".


Сейчас в нашем роботе есть точка останова , позволяющая избежать долгого тестирования. Чтобы создать робота, без данной точки останова (точка останова работает только в отладчике, а не когда робот будет опубликован на openkapow.com) давайте заставим робота, остановится на 4 странице. Этот шаг необходимо добавить между шагами "Click Next" и "Next", достигнув 4 страницы, в шаге "Click Next" мы не должны выполнять шаг "Next" . Если мы посмотрим на страницу Digg в представлении браузера RoboMaker мы увидим, что текущая страница выделена в списке страниц. В представлении HTML кода мы видим, что текущая страница находится в тэге класса "current"- это нам подходит идеально. Давайте добавим шаг "Test Tag" чтобы проверить этот тэг и его содержимое. Выберите шаг "Next", а затем щелкните правой кнопкой мыши на текущей странице Digg в представлении браузера, и выберите "Test Tag".


Чтобы новый шаг "Test Tag" работал, как нам необходимо, потребуется изменить конфигурацию шага, поэтому щелкните по нему, чтобы выбрать, а затем перейдите на вкладку Action. Там нам нужно добавить шаблон для проверки найденных тегов - Tag Finders. В данном случае мы добавляем "4" и убедитесь, что переключатель действия установлен в положение "Stop if Pattern Matches Found Tag". Это означает, что если текущая страница 4, шаг "Test Tag" будет остановлен, если "Test Tag" останавливается и нет никаких других шагов для выполнения, тогда робот останавливается целиком.

Снова испытайте робота в отладчике. Вначале используйте точку останова, чтобы избежать бесконечного цикла. Затем удалите точку останова с используя "Toogle breakpoint", и проверьте всего робота в отладчике. Если вы уверены в том, что робот работает как следует, то настало время, чтобы еще раз опубликовать робота на openkapow.com. Это руководство не описывает детали публикации робота, это было очень подробно изложено в руководстве "Создание базового RSS робота".
Заключение
Мы создали робота, который возвращает все посты с первых 3 страниц Digg, в RSS канал. При этом мы узнали о том, как использовать вид цикла "Repeat-Next", а также о том, как использовать в роботе ветки и условия .
Наш робот был бы более полезнее, если бы не просто возвращал посты из первых нескольких страниц Digg, а возвращал посты по определенной строке поиска, например "Ipod Nano". Именно это мы будем делать в следующем руководстве.