уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Интернет бурлит сообщениями про землетрясения в Японии, кое-где обсуждаются итоги выборов-2011 в регионах, ну а у меня блог про Delphi :). И сегодня я решил заняться немного практической стороной – не рассматривать возможности библиотек, а применить их на практике. Самое простое, что пришло в голову – написать небольшую программку по проверке странички в индексе Google. Конечно, есть сервис для веб-мастера от того же самого Google где можно эту информацию посмотреть. Однако небольшое исследование “интернетов” показало, что подобный софт всё ещё пользуется успехом у оптимизаторов. Опять же есть пара идей на будущее, но об этом я пока умолчу (кто его знает, что случится завтра?) – будет время расскажу и, возможно, даже покажу.

Так вот. Года этак полтора назад я рассказывал о том, как проверить наличие страниц сайта в Яндекс. Скажем так, представленный в том посте способ не отличается стабильностью и универсальностью :) Смысл работы был следующим – составляем правильный запрос, скачиваем страницу и парсим-парсим-парсим. Все бы хорошо, но добрый Яндекс периодически отправляет программку на страничку с каптчей и надо все время держать в уме как минимум возможность установки достаточной задержки между запросами, либо использовать кучу проксей, или, как я недавно рассказывал – юзать сервисы, использующие Яндекс.XML.

C Google в этом отношении все намного проще и удобнее – есть нормальный Search API. А где есть API – там есть и то, что нам необходимо. Все, что необходимо – правильно его (API) использовать, чтобы:

  • Затратить как можно меньше трафика (несмотря на то, что безлимит рулит);
  • Получить сведения о том, проиндексирована страница или нет;

Вот этим мы сегодня и займемся.

Рассматриваемый в статье способ более не используется, т.к. Google закрыл Google Search API и рекомендует воспользоваться Google Custom Search API. Однако, приведенная ниже информация может Вам пригодиться для понимания основ работы с протоколом HTTP в Delphi, формирования и отправки запросов к серверу и так далее.

Так как действие программы предполагается одно, то предлагаю следующий интерфейс программы:

indexer

В левый ListBox будем добавлять все URL для проверки, а в два Memo будем делить все исходные URL’ы в зависимости от их индексации в Google.

Теперь остановимся на вопросе о том, как понять есть ли страница в индексе или нет? Для этого обратимся к справочнику языка запросов Google, который нам говорит, что есть два замечательных оператора:

  1. site: выполняет поиск на определенном сайте
  2. info: выводит информацию о сайте

Оба этих параметра в запросе позволяют определить индексируемость страницы в Google. Другой вопрос – на сколько точно, но это мы оставим на откуп матёрым SEOшникам (к которым я себя не отношу) и воспользуемся…вторым параметром – info:

Теперь определимся с запросом. Шаблон у нас будет следующим:

http://www.google.com/uds/GwebSearch?v=1.0&q=info:%s

В результате выполнения GET-запроса по этому URL мы получим JSON-объект содержащий результаты поиска. Если массив результатов будет пустым – значит страница отсутствует в индексе. Всё просто.

Ну, а обработать JSON мы уже вполне в силах – достаточно использовать библиотеку SuperObject.

Таким образом функция проверки страницы в индексе Google будет у нас выглядеть следующим образом:

function TChecker.Indexed(URL: string): boolean;
var Ob: ISuperObject;
    Stream: TStringStream;
begin
  Stream:=TStringStream.Create;
try
  with THTTPSend.Create do
    begin
      if HTTPMethod('GET',Format(cBaseURL,[URL])) then
        begin
          Stream.LoadFromStream(Document);
          Ob:=SO(Stream.DataString);
          if Ob.I['responseStatus']=200 then
             Result:=Ob.A['responseData.results'].Length>0
          else
            Result:=false;
        end
      else
        Result:=false;
    end;
finally
  Stream.Free;
end;
end;

Идем дальше. Как будем реализовывать проверку нескольких страниц? Если торопиться некуда – банальный Application.ProcessMessages вполне сгодится для работы. В свое время я как-то писал многопоточную проверялку по Google и Яндекс, поэтому, чтобы лишний раз не переписывать исходник я просто вытащил часть кода из старой программки и адаптировал его под текущую задачу. Сам класс потока имеет следующий код:

const
  cBaseURL = 'http://www.google.com/uds/GwebSearch?v=1.0&q=info:%s';
 
type
  TOnCheck = procedure (InIndex:boolean;URL: string)of object;
 
type
  TChecker = class(TThread)
  private
    FURls: TStringList;
    FOnCheck:TOnCheck;
    function Indexed(URL:string):boolean;
    procedure ClearLine;
  protected
     procedure Execute; override;
  public
    constructor Create(Suspended: boolean; aURLs: TStrings);
    property OnCheck: TOnCheck read FOnCheck write FOnCheck;
  end;

TOnCheck — событие, обработчик которого будет выполняться после того, как получен результат по одному из URL’ов для проверки. Метод Execute в потоке выглядит следующим образом:

procedure TChecker.Execute;
var i:integer;
begin
  for i:=FURls.Count-1 downto 0 do
    begin
      if Assigned(FOnCheck) then
        OnCheck(Indexed(FURls[i]),FURls[i]);
      FURls.Delete(i);
      Synchronize(ClearLine);
    end;
end;

ClearLine просто удаляет из ListBox последний проверенный URL. Программа создает один поток в котором и проверяются все URL’ы. Можно было бы обойтись и вовсе без потока, но кто знает – вдруг кто-то решит на базе моего исходника написать программку для проверки индексации страниц, скажем в 10 потоков? Начало положено – дописать, думаю, проблем никаких не возникнет.

Ну, а ниже представлен результат работы программы:

indexer2

Скачать исходник: Исходники —> API онлайн-сервисов —> Google API

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
5 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Вася
Вася
10/04/2011 01:09

спасибо интересно

arxbud
arxbud
20/04/2011 13:34

Интересует такая программа, но как ее запустить человеку далекому от программирования? :)

Андрей Карпишин
Андрей Карпишин
06/12/2020 02:26

Здравствуйте, Влад. Я хотел связаться через мэйл (админ_вебдельфи) ящик уже не работает или через соцсети (у вас блок на добавление). Дайте контакт. За небольшую помощь готов материально отблагодарить.