.
Пишем на Delphi SEO-мониторинг: Урок 8. Определяем позицию сайта в Яндексе (TWebBrowser, HTML)
Автор megabax   
10.08.2010 г.
В этой статье будет пошагово описано создание на Delphi приложение

Пишем на Delphi SEO-мониторинг: Урок 8. Определяем позицию сайта в Яндексе (TWebBrowser, HTML,getElementsByTagName)

Исходники у уроку можно скачать здесь.

На прошлом уроке мы научились листать страницу поиска. Сегодня напишем простенькую программа, которая по URL сайта определит его позицию в Яндексе по заданному запросу. Вам понадобятся исходники прошло урока, ссылки на скачивание в нем есть.

Для начала мы напишем функцию:

function TfrmTestWebBrowser.URLSearch(AURL:string):integer;
var cn,i:integer; vTags:OleVariant; s:string;
       vBolds, vH2:OleVariant;
begin
      vTags:=wbWebBrowser.OleObject.Document.getElementsByTagName('Li');
      cn:=vTags.length-1;
      for i:=0 to cn do
      begin
         s:=vTags.item(i).innerHTML;
         if Pos(edRef.Text,s)>0 then
         begin
             s:='';
             vH2:=vTags.item(i).getElementsByTagName('H2');
             vBolds:=vH2.item(0).getElementsByTagName('B');
             Result:=StrToInt(vBolds.item(0).InnerHTML);
             exit;
         end;
      end;
      Result:=-1;
end;

Работает эта функция следующим образом: перебирает все тэги <LI> в странице поиска, ищет в них URL заданного сайта. Если находит, то определяет его позицию, которая содержится в первом тэге <B> первого тэга <H2>:

Пишем на Delphi SEO-мониторинг: Урок 8. Определяем позицию сайта в Яндексе (TWebBrowser, HTML,getElementsByTagName)

Если функция ничего не нашла, она возвращает -1, иначе номер позиции.

Затем переделаем немножко форму, удалим лишние компоненты и добавим новые. вот так она должна выглядеть*:

SEO, Delphi, Урок 8. Определяем позицию сайта в Яндексе (TWebBrowser, HTML,getElementsByTagName)

И так, мы edRef переименовали в edURL, убрали кнопочку "Показать", она нам больше не понадобиться, поле edPage - туда же в урну, кнопочка "Пуст" пусть так и называется btnExec, только заголовок у нее будет другой "Найти". Еще мы добавили прогресс бар TGauge, его так и назовем Gauge. Для отображения результатов проверки  кинем на форму  две метки (TLabel): lbPosition и lbPage. Для поясняющих надписей тоже применим метки, но их название нам не важно.

Ах да, еще таймер (TTimer), имя Timer, интервал 5000. Он нужен для пятисекундной задержки, пока не загрузилась очередная страница поиска.

Функцию URLSearch объявим в секции private класса формы, там же объявим и другие вспомогательные поля:

....

private
    { Private declarations }
    isComplete:boolean;
    currPage:integer;
    isExec:boolean;
    function URLSearch(AURL:string):integer;
public

...

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

procedure TfrmTestWebBrowser.FormCreate(Sender: TObject);
begin
   isExec:=false;
end;

При нажатии на кнопочку "Поиск" запускается процесс поиска:

procedure TfrmTestWebBrowser.btnExecClick(Sender: TObject);
begin
   isExec:=true;
   currPage:=0;
   lbPosition.Caption:='Поиск';
   lbPage.Caption:='Поиск';
   wbWebBrowser.Navigate(GetQuery(CurrPage,edWord.Text));
end;

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

После загрузки струнцы компонент TWebBrawser у нас генерит событие OnDownloadComplete. Правда, генериться оно после загрузки несколько раз, потому пришлось прибегнуть к задержке времени по таймеру. И так, вот обработчик этого события:

procedure TfrmTestWebBrowser.wbWebBrowserDownloadComplete(Sender: TObject);
begin
   isComplete:=true;
end;

Как видим, он просто устанавливает флаг, по которому будет ориентироваться процедура поиска.  А вот и сама процедура, она вызывается по таймеру, поэтому размещена в обработчике события OnTimer:

procedure TfrmTestWebBrowser.TimerTimer(Sender: TObject);
var res:integer;
begin
   if not(isExec) then exit;
   if isComplete then
   begin
       isComplete:=false;
       res:=URLSearch(edRef.Text);
       if res<>-1 then
       begin
          lbPosition.Caption:=IntToStr(res);
          lbPage.Caption:=IntToStr(CurrPage+1);
          isExec:=false;
          exit;
       end;
      Gauge.Progress:=CurrPage+1;
    end;
    CurrPage:=CurrPage+1;
    if CurrPage>99 then
    begin
       lbPosition.Caption:='Не найдено';
       lbPage.Caption:=IntToStr(CurrPage+1);
       isExec:=false;
    end else wbWebBrowser.Navigate(GetQuery(CurrPage,edWord.Text));
end;

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

Если на текущей странице нашли заданный сайт, останавливаем поиск и выводим на экран его результат. В противном случае переходим к следующей странице. Если мы уже просмотрели сто страниц, дальше не ищем, и так искать слишком долго. Говорим "Не найдено".

В принципе все, программу можно запускать на тестирование.

SEO, Delphi, Урок 8. Определяем позицию сайта в Яндексе (TWebBrowser, HTML,getElementsByTagName)

 

Исходники у уроку можно скачать здесь.


Скриншоты, помеченные знаком *, являются цитатами и иллюстрациями  в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит Borland Delphi.. 


Последнее обновление ( 07.11.2011 г. )