Строим тематический робот-краулер (окончание)

Программное обеспечение. Программное забезпезпечення представляет собой описание структурной (программной) части подсистем, технологий которые были использованы при создании поисковой системы. Описание этих частей также целесообразно привести с точки зрения каждого модуля.

Модуль поиска тематической информации. Вообще каждый из вариантов реализации робота-поисковика возможен с использованием стандартных инструментов и средств многих объектно ориентированных языков программирования. Так, например используя язык C # платформы. Net Framework, мы можем создать асинхронный веб-запрос в избранное ресурса и получить полные данные со страницы с полученной веб-ответы:

HttpWebRequest request = (HttpWebRequest)

HttpWebRequest.Create (requestData.BaseRequestURL) request.AllowWriteStreamBuffering = true;

request.AllowAutoRedirect = requestData.AllowAutoRedirect; request.Method = requestData.Method; request.ContentType = requestData.ContentType; request.UserAgent = requestData.UserAgent;

request.Accept = requestData.Accept;

request.CookieContainer = requestData.Cookies;

if (requestData.WriteContentLength> 0) {

request.ContentLength = requestData.WriteContentLength; request.GetRequestStream (). Write (requestData.WriteContentEncoded, 0, requestData.WriteContentLength);}

if (requestData.Header.Count> 0) {

foreach (KeyValuePair <string, string> header

in requestData.Header) {request.Headers.Add (header.Key, header.Value);}} if (! string.IsNullOrEmpty (requestData.ProxyServer)) {

WebProxy proxy = new WebProxy ();} NetworkCredential credent =

new NetworkCredential (requestData.ProxyUserName, requestData.ProxyUserPassword) proxy.Credentials = credent;

proxy.Address = new Uri (requestData.ProxyServer) request.Proxy = proxy;

AsyncCallback async = new AsyncCallback (SiteResponse) IAsyncResult result =

request.BeginGetResponse (async, request) ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle,

new WaitOrTimerCallback (TimeoutCallback), request, DefaultTimeout, true);

Здесь SiteResponse – функция, которой будет передано ответ на наш веб-запрос.Так циклически используя данный код, мы сможем взять передан нам набор веб-адресов в параллельных потоках, данные из которых будут поступать к исходному модулю, через общий интерфейс доступа передаются в робота-анализатора.

Модуль анализа и сбора информации. При описании модуля анализа и сбора информации, нас больше интересует, как именно наша система будет получать необходимые данные со страницы. Здесь на помощь приходят несколько инновационных технологий в сфере Web и XML запросов.

Язык XPath основана на представлении XML документа в виде дерева, и предоставляет возможность навигации внутри дерева, выбирать узлы по различным критериям. В просторечии (хотя это не официальная спецификация) XPath выражение часто называют просто XPath.

В начале мотивированный желанием предоставить общий синтаксис и модель поведения между XPointer и XSLT, XPath быстро получил признание разработчиков как язык малых запросов, и его подмножества используются в других спецификациях W3C, например XML Schema и XForms.

Одной из главных идей спецификации XPath, это идентифицировать набор узлов, которые удовлетворяют специфические условия для XML документа. По сути дела, данные получении со страницы нашим поисковым роботом, представлены в виде HTML документа. То есть четко структурированного документа с набором древовидных тегов с атрибутами. Имея специальные средства мы можем легко проверить правильность синтаксиса такого документа и перевести его в соответствующий структурированного XML документа. А дальше дело уже берется XPath и XSH. ! Дея заключается в том, что благодаря специально структурированным запросам (похожих на SQL запросы), мы можем легко получить любые данные из созданного дерева XML документа. Для примера можно привести небольшой код типовой страницы имеющий определенную текстовую информацию с определенным характерным стилевым обрамлением:

<TR …> <TH …>

<ANAME=”text”…>

<TH …> <TR …>

I это заканчивается следующим аналогичным строкой

<TR …> <TH…>

<A. .. >

<TH …> <TR …>

В данном случае “…” использовано для указания дополнительной, менее важной информации. Задача стоит в том, чтобы получить текст находящийся в теге <A NAME=”text”…>.

Итак, теперь, когда перед нами поставлена ​​конкретная задача, у нас есть возможность использовать два различных подхода, один использования xsh, а другой использования HTML :: TreeBuilder :: XPath. (Можно увидеть, что код почти идентичен, поэтому целесообразно привести только один пример.).

Используя диалоговый режим xsh команды, можно найти выражения XPath для данных, в которых мы заинтересованы. Спецификация для узла включающий нужную нам информацию выглядеть следующим образом: / / tr [th / a / @ name = ‘text’]

Надо заметить, что мы не заботимся, сочиняя это с помощью XPath о любых другие свойства, или, даже, если наше значение text находится в единичных или двойных кавычках (если цитируется вообще). Это значительно лучше, чем использование регулярных выражений.

Что в действительности означает это выражение? Сначала будет найдем все узлы с именем tr, после чего в данном узле будут искаться все остальные узлы на одном уровне, имеющие имя th. Далее для найденного узла будет искаться узел с именем а, и тот, что имею атрибут name со значения text. Проход по узлам начиная с th будет происходить циклически.

Формирование набора таких запросов, к найденной страницы, позволяет получить любые данные из документа, несмотря на корректность или синтаксис использован при создании HTML документа. Еще одним преимуществом использования такого подхода является то, что технология XPath позволяет формировать запросы с использованием не латинских символов, поэтому для

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

Полученные данные после обработки документа модулем анализа и сбора информации можно легко привести к единому стандарту, который впоследствии можно занести в базу знаний.

Модуль синхронизации данных с базой знаний. Для оптимизации создания БЗ и его связи с физическими сущностями существующей той или иной системы, можно использовать достаточно новое средство Nffibernate, что придает более упрощенную структуру взаимодействия.

Целью Nffibernate является освобождение разработчика от значительных типовых задач по программированию взаимодействия с базой данных. Разработчик может использовать Nffibernate как при разработке с нуля, так и для уже существующей базы данных.

Nffibernate заботится о связи классов с таблицами базы данных (и типов данных языка программирования с типами данных SQL), и предоставляет средства автоматического построения SQL запросов и чтения / записи данных, и может значительно уменьшить время разработки, которое обычно тратится на ручное написание типового SQL и JDBC кода. Nffibernate генерирует SQL вызовы и освобождает разработчика от ручной обработки результирующего набора данных, конвертации объектов и обеспечения совместимости с различными базами данных.

Основой использования сущностей Nffibernate, является создание так сказать файлов мапинг. Каждый такой файл, полностью описываю какое поле таблицы БЗ соответствует физической сущности системы (классу). Преимуществами проектирования систем с использованием средств Nffibernate, в отличие, от стандартных библиотек доступа к базам данных объектно ориентированных языков программирования, является упрощенная система доступа к данным.Разработчик может легко модифицировать классы системы под структуры БЗ, не волнуясь об изменении всех запросов, ведь за формирование соответствующих запросов на обновление и выборку данных с БЗ, отвечает соответственно система Nffibernate. Также такая структура менее подвержена использования ложных запросов, и потери информации при разрывов транзакций. Таким образом все внимание разработчиков сводится к разработке соответствующих, необходимых, физических сущностей системы и их отнесения к соответствующим полям БД.

Недостатки такого конструирования, связи модели данных с данными базы, небольшие, но все же присутствуют, и связаны они больше с наложенными ограничениями на возможности Nffibernate. К сожалению этот способ позволяет связывать только одну сущность модели системы с одной сущностью базы данных. Поэтому создание более сложных взаимосвязанных типов пока невозможно. Однако каждый сложный тип можно разложить на простые и связать их между собой.

Примером структуры типичной сущности с использованием технологии Nffibernate может быть примерно таким.

<? Xml version = “1.0” encoding = “utf-8”?>

<Hibernate-mapping xmlns = “urn: nhibernate-mapping-2.2”

namespace = “NHibernate_1” assembly = “NHibernate_1 ‘”> <class name=”Urls” table=”Urls”> <id name=”TD” unsaved-value=”G”> <column name = “TD” not-null = “true” />

<generator class=”identity”/>

</ Id>

<Property name = “Url” /> <property name=”PageName” /> </ class>

</ Hibernate-mapping>

Данный код описывает файл мапинг, для соотношения физического класса системы Urls с таблицей базы данных Urls.

<class name=”Urls” table=”Urls”> – описывает класс который будет представлять выбранную таблицу базы данных.

Тег id – описывает уникальный идентификатор, с помощью класса identity.

<Property name = “Url” /> и <property name = “PageName” /> – описывает другие свойства нашего класса.

Таким образом создав такой класс мапинг и соответствующий файл конфигурации соединения Nffibernate с базой данных, мы получим класс, способный без дополнительного кода запросов, взаимодействовать с базой данных, то есть обновлять, удалять, добавлять и получать данные.

Построение современного робота-краулера является  многошаговой и своего рода рационализаторской работой. Не существует единого стандарта, описывающего структуру таких систем. Как правило разрабатывается система отраслевого назначения, в которую впоследствии пишется, более узкого профиля, краулер. Исключение, пожалуй, составляющие самые современные поисковые системы Интернета, однако и они больше специализируются на поиске и индексации информации, а не на ее сборе и анализе.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

%d такие блоггеры, как: