Synapse + NativeXML. Обробка Sitemap в Delphi., HTML, XML, DHTML, Інтернет-технології, статті

Якщо попередній пост призначався виключно для користувачів програми "Пінговалка", то цей – для розробників. Сьогодні будемо розбиратися з sitemap.xml.


В цілому sitemap може стане в нагоді для чого завгодно, починаючи від того, щоб просто отримати список всіх сторінок, так і, наприклад, для того, щоб по отриманому списку надалі Спарс назви сторінок, перевірити індексацію в пошукових системах і т.д. Знаючи шлях до sitemap, можна заощадити досить багато часу на отримання необхідної інформації з сайту.


Як і сказано в заголовку поста – використовувати будемо дві безкоштовні, Кросплатформені бібліотеки – Synapse і NativeXML.


Перш, ніж перейдемо до реалізації читання sitemap в Delphi, Трохи розберемося з тим, що нас чекає.


Небагато слів про Sitemap

Файл Sitemap являє собою XML-файл, в якому перераховані URL-адреси веб-сайту в поєднанні з метаданими, пов'язаними з кожним URL-адресою. Як мета-даних, в sitemap може міститися наступна інформація: дата останнього зміни, частота змін, пріоритетність на рівні сайту.


Sitemap використовується для того, щоб пошукові системи могли більш грамотно сканувати сайт.


Наприклад, запис окремого URL з мета-даними може виглядати так:




Якщо сайт більш менш старенький, то його Sitemap може налічувати тисячі URL. Приміром, sitemap мого блогу налічує зараз 865 сторінок, включаючи сторінки за тегами. А якщо взяти який-небудь виразника де оновлення можуть проходити по 100 штук на день? Або розкручений, популярний форум? Там sitemap може налічувати досить велика кількість сторінок. Тому розробники протоколу Sitemap зробили обмеження – 50000 URL на один файл. Також файл повинен бути розміром до 10 Мб.


Якщо передається інформація по 50000 + сторінок, то в пошукову систему відправляється індексний файл Sitemap. У цьому фалі перераховані шляху до XML-файлів в яких міститися вже URL "и сторінок. Запис в індексному файлі може виглядати так:




Всі дані в Sitemap передаються в кодуванні UTF-8. Ось, мабуть, вся та інформація, яка нам стане в нагоді для розробки. Тепер перейдемо до реалізації нашої програми.


Парс Sitemap в Delphi


Напишемо невелику програму, яка буде без зайвих питань завантажувати і парсити sitemap будь-якого виду – як з індексним файлом, так і без нього. Для цього, спочатку трохи визначимося з алгоритмом. Працювати будемо так:



  1. Викачуємо файл по заданому URL

  2. Читаємо файл і визначаємо є він індексним

  3. Якщо ми завантажили індексний sitemap, то отримуємо з нього посилання на інші файли і викачуємо ці файли

  4. Парс все викачані файли на предмет інформації по URL.

Отримувати будемо всю доступну інформацію – адреси, явки, паролі, дати зміни, пріоритети і т.д.


Почнемо з опису необхідних типів даних. Кожен елемент в sitemap буде представлений у вигляді запису (record):




type
TSitemapElement = record
loc: string; / / URL сторінки
lastmod: TDate; / / дата останньої зміни
changefreq: string; / / частота поновлення
priority: currency; / / пріоритет усередині сайту
end;

Завантажувати і обробляти Sitemap будемо в окремому потоці:




 TOnGetElement = procedure (Element: TSitemapElement) of object;
 
TSitemapLoader = class(TThread)
private
FHeaderXML: TNativeXML; / / індексний файл XML
FSitemapURL: string; / / URL базового сайтмапа
FURLList: TStrings; / / список всіх url де є сайтмапи
FChankedXML: array of TNativeXML; / / масив всіх сайтмапов
FOnGetElement: TOnGetElement;
FOnLoadDone : TNotifyEvent;
function TryLoadHeadSitemap: boolean; / / пробуємо закачати головний сайтмап
function IsChanked: boolean;
procedure LoadFile(URL: string);
procedure ParseXML(XML: TNativeXML);
public
constructor Create(Syspended: boolean; AAddress: string);
property OnGetElement: TOnGetElement read FOnGetElement write FOnGetElement;
property OnLoadDone: TNotifyEvent read FOnLoadDone write FOnLoadDone;
protected
procedure Execute; override;
end;

Для потоку визначено всього дві події:


Тепер тиснемо Ctrl + Shift + C і, якщо у вас Delphi не Starter Edition, то IDE створить вам "скелети" методів потоку. розглянемо їх детальніше.


Конструктор:




 constructor TSitemapLoader.Create (Syspended: boolean; AAddress: string);
begin
inherited Create(Syspended);
FHeaderXML := TNativeXML.Create;
FSitemapURL := AAddress;
FURLList := TStringList.Create;
end;

Метод TryLoadHeadSitemap пробує завантажити XML-файл, URL якого був заданий у конструкторі. Якщо файл успішно завантажений і поміщений в поле FHeaderXML (скачати ми можемо і не XML), то метод поверне нам True:




function TSitemapLoader.TryLoadHeadSitemap: boolean;
begin
with THTTPSend.Create do
begin
if HTTPMethod(GET, FSitemapURL) then
begin
try
FHeaderXML.LoadFromStream(Document);
Result := true;
except
Result := false;
end;
end
else
Result := false;
end;
end;

IsChanked перевіряє чи є завантажений в методі TryLoadHeadSitemap XML-файл індексним. Якщо файл індексний, то в цьому ж методі зчитуються URLи всіх sitemap, що містять дані по сторінках сайту:




function TSitemapLoader.IsChanked: boolean;
var
NodeList: TXmlNodeList;
i: integer;
begin
if FHeaderXML.IsEmpty then Exit;
Result := FHeaderXML.Root.NodeByName(sitemap) <> nil;
FURLList.Clear;
if Result then
begin
NodeList := TXmlNodeList.Create;
FHeaderXML.Root.NodesByName(sitemap, NodeList);
for i := 0 to NodeList.Count – 1 do
FURLList.Add(NodeList[i].NodeByName(loc).ValueAsString);
end
end;

LoadFile вантажить XML-файл, засположенний за адресою URL і, якщо файл завантажений успішно, то цей файл заноситься в масив FChankedXML:




procedure TSitemapLoader.LoadFile(URL: string);
var
XML: TNativeXML;
begin
with THTTPSend.Create do
begin
if HTTPMethod(GET, URL) then
begin
XML := TNativeXML.Create;
try
XML.LoadFromStream(Document);
SetLength(FChankedXML, length(FChankedXML) + 1);
FChankedXML [length (FChankedXML) – 1]: = TNativeXML.Create;
FChankedXML[length(FChankedXML) – 1].Assign(XML);
finally
XML.Free
end;
end
end;
end;

Ну і, власне, Execute в якому всі ці методи зібрані воєдино:




procedure TSitemapLoader.Execute;
var i:integer;
begin
try
if TryLoadHeadSitemap then
begin
if IsChanked then
begin
for i:=0 to FURLList.Count-1 do
LoadFile(FURLList[i]);
for i:=0 to Length(FChankedXML)-1 do
ParseXML(FChankedXML[i]);
end
else
ParseXML(FHeaderXML);
end
finally
FURLList.Free;
for i:=Length(FChankedXML)-1 downto 0 do
FChankedXML[i].Free;
FChankedXML:=nil;
if Assigned(FOnLoadDone) then
FOnLoadDone(self)
end;
end;

Тепер нам залишається лише розробити GUI для нашого застосування. Так як всі операції із завантаження Sitemap будуть у нас виконуватися по одному кліку, то GUI буде аскетичним:)




1 Edit, 1 кнопка та 1 ListView для виведення результатів – все, що нам потрібно. Спочатку визначимо обробники подій потоку:




procedure TFMain.GetElement(Element: TSitemapElement);
begin
ListView1.Items.BeginUpdate;
try
with ListView1.Items.Add do
begin
Caption:=Element.loc;
SubItems.Add(Element.lastmod);
SubItems.Add(CurrToStr(Element.priority));
SubItems.Add(Element.changefreq)
end;
finally
ListView1.Items.EndUpdate;
end;
end;
 
procedure TFMain.LoadDone(Sender: TObject);
begin
ShowMessage (Завантаження завершена)
end;

Тепер, в обробнику OnClick кнопки нам залишається тільки правильно запустити потік. Робимо це так:




procedure TFMain.Button1Click(Sender: TObject);
var Loader: TSitemapLoader;
begin
ListView1.Items.Clear;
Loader:= TSitemapLoader.Create(true,Edit1.Text);
Loader.OnGetElement:=GetElement;
Loader.OnLoadDone:=LoadDone;
Loader.Start;
end;

Запускаємо програму, вводимо в edit адресу до Sitemap, тиснемо кнопку і через кілька секунд отримуємо результат:




Як і очікувалося, при кожному отриманні елемента Sitemap наш список оновлюється, але із за досить високої швидкості роботи NativeXML оновлення перетворюється на швидке мельтешение ListView, тому по-хорошому, оновлення слід було б проводити тільки в самому кінці роботи потоку, а для візуалізації процесу заповнювати ProgressBar, відраховувати що-небудь у Label і т.д. Також було б непогано передбачити висновок повідомлень, у випадку, якщо скачаний файл не містить XML або скачування взагалі неможливо, але нехай реалізація цих моментів залишиться в якості самостійної роботи тим, хто скачає исходники програми :).

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*