четверг, 29 октября 2009 г.

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


Это руководство подробно останавливается на RSS роботе из руководства Создание базового RSS робота, там мы сделали RSS робота, который возвращал первый пост Digg. Теперь мы собираемся изменить его, так что бы он возвращал все посты с главной страницы Digg, а не только первый. Предполагается, что вы читали предыдущие руководства, и знакомы с основами, предполагается, что вы уже скачали среду разработки роботов - RoboMaker и зарегистрированы как пользователь на openkapow.com.


Часть 1 - Создание робота в цикле ДЛЯ КАЖДОГО



Начинаем с создания нового RSS робота, который стартует с www.digg.com и не использует каких-либо входных значений. В результате получаем робота 2 шагами: "Load Page" и "Return Item". Теперь нам необходимо выяснить, каким образом вернуть все посты с главной страницы Digg. Необходимо извлечь заголовок(title), URL и описание(description) каждого поста, сохранить данные в объект RSSItem и вернуть данный объект. Это означает, что мы должны вернуть столько объектов сколько постов содержится на главной странице Digg. Один из способов сделать это, поочередно добавить шаги для каждого поста для 1, 2 и т.д. Это не очень хороший подход, поскольку мы не всегда знаем сколько будет постов, кроме того, это создаст много проблем, как в разработке так и поддержке робота. Вместо этого мы собираемся использовать цикл, чтобы решить все наши проблемы. В каждой итерации цикла мы будем извлекать и возвращать данные из одного поста Digg, а затем переходить к следующей итерации.
Как нам создать цикл в RoboMaker? Первое, что нам необходимо сделать, это выяснить, какой HTML тег будет образовывать цикл, а для этого нужно определить, каким образом каждый пост определяется в HTML. Начните с нажатия на заголовке первого поста в представлении браузера RoboMaker.


Мы выделили линк первого поста. Но это не тот тип тега, мы хотим использовать в цикле пост целиком, а не каждую ссылку. Поэтому мы должны двигаться в HTML пока не найдем тег, который определяет целиком один пост. Есть несколько способов сделать это. Вы можете использовать иконки  движения наружу и внутрь, в HTML-тегах. Если попробовать нажать  значок мы переместимся на тег h3 вокруг текущего тега, нажмите на него еще раз, и вы будете на внешнем Div теге, нажмите кнопку еще раз, чтобы перейти в Div класс "news-summary" (класс вы можете увидеть  в представлении HTML источника). Если мы продолжим двигается дальше мы выйдем на div, который содержит все посты - мы явно ушли далеко, так что давайте вернемся к div с классом "news-summary".
Вместо того чтобы использовать стрелки для перемещения в HTML, мы могли бы щелкнул прямо в представлении браузера, пути HTML или DOM предствлении. Эти 4 представления все связаны между собой, и выделение в одном представлении, автоматически подсвечивается в других. Это позволяет легко передвигаться по HTML и быстро выяснить, структуру страницы.

Теперь мы предполагаем, что каждый пост  Digg содержится в Div с классом "news-summary".Проверка других постов, подтверждает, что это действительно так. Теперь нам нужно создать цикл, для каждого из этих divs. Щелкните правой кнопкой на HTML пути (или, в DOM представлении, или в представлении HTML источника ...) на выделенном Div, и выберите Loop, а затем "For Each Tag".


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


При проверке нашего цикла, мы заметили не интересующие нас цикл через 2 divs после первого поста и 1 div перед последним постом. Поэтому нам нужно изменить автоматически созданную конфигурацию шага "For Each Tag". Прежде чем мы сделаем это давайте взглянем закладку Tag Finders шага "For Each Tag". Существует только один Tag Finder (поисковик тегов) определенный на закладке Tag Finders и он указывает, что перебирать в цикле мы будем div с идентификатором "contents". Если мы проверим представление браузера, то увидим, что выделенный div шага "For Each Tag" действительно содержит все посты на странице. Это означает, что робот будет работать корректно, на этой странице,даже если Digg реорганизует, переименует или удалит эти div. Небольшой редизайн не проблема, и мы можем спать спокойно.


Давайте взглянем на конфигурацию шага "For Each Tag". Вот ее настройка, цикл будет для всех div тегов внутри тега определенного в Tag Finder, именно то, что нам и нужно. Есть также настройки определяющие, с каких итераций нужно начинать и на каких заканчивать цикл. Чтобы наш цикл игнорировал 2 div сначала и 1 последний div, давайте изменим эти параметры: "First Tag Number"= 2 и "Last Tag Number"=1. Попробуйте перейти к первой и последней итерации теперь, и вы увидите, что для цикл "For Each Tag" теперь охватывает только необходимые данные.


Время добавить действия робота для каждой итерации цикла. Перейдите к первой итерации и выделите шаг "Return Item" Теперь просто щелкните правой кнопкой мыши на заголовок в голубом поле, которое окружает первый пост Digg и выберите "Extract Title".


У нашего робот возникнет шаг "Extract Title". Tag Finder шага "Extract Title" должен действовать на тэг " в пределах "Current Tag 1", так что это такое "Current Tag 1"? Если вы внимательно посмотрите на синий квадрат с указанием текущей итерации в представлении браузера вы увидите небольшой символ "1" в верхнем левом углу - это и есть "Current Tag 1". Для каждой итерации этот Current Tag 1 указывает на новый тэг, таким образом, обращаясь к текущему тэгу в Tag Finder шага Extract Title, мы говорим примерно следующее - "используй первый тэг в пределах итерации, независимо от того какая итерация происходит". Очень практично. Есть также много других видов использования существующих тегов в цикле, но они не рассматриваются в данном руководстве.


При выводе объекта RSSItem, атрибут "title" сейчас заполнен. Если мы теперь перейдем к следующей итерации в цикле, то мы увидим, что значение изменилось в соответствии со значениями текущей итерации.

Теперь давайте добавим шаги "Extract URL" и "Extract Description". Еще раз щелкните правой кнопкой мыши на ссылку и описание внутри текущей итерации и выберите "Extract URL" или "Extract description", чтобы создать эти шаги. Убедитесь в том, что эти шаги будут добавлены в робота между шагами "For Each Tag" и "Return Item", так как мы хотим, чтобы они выполнялись для каждой итерации.

Важно отметить, что на самом деле происходит, когда вы запускаете этого робота. Страница digg.com загружена, тогда в цикл происходит перебор всех постов. Для каждой итерации заголовок, URL и описание взяты из тега текущей итерации. Извлеченные данные помещается в объект RSSItem. В конце итерации заполненный RSSItem возвращается, т.е. добавляется в роботом в исходящий RSS канал. Затем робот движется к следующей итерации.
Давайте отладим робота и убедимся, что он работает так как нам необходимо.

Часть 2 - Отладка робота




Мы хотим проверить, что этот робот работает как следует, и что он будет возвращать верные данные. Откройте RoboDebugger и нажмите кнопку "Выполнить", чтобы проверить это.


Теперь в отладчике выполнить весь цикл робота и во всех итерациях и посмотрите что возвращает робот. Проверьте, соответствие возвращаемых данных и постов с главной страницы Digg. Если ваш робот возвращает разные названия, разные URL-адреса, но описание одинаковое вполне вероятно, что вы добавили шаг "Extract Description" за тегом текущей итерации. Если это так, просто удалите шаг "Extract Description" и добавить его правильно (Вы можете изменить настройки существующего шага, но легче просто удалить и добавить).
Отлично, робот работает, время опубликовать его. Это руководство не описывает детали публикации робота, это было очень подробно изложено в руководстве Создание базового RSS робота.


Заключение

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