Интернет бурлит сообщениями про землетрясения в Японии, кое-где обсуждаются итоги выборов-2011 в регионах, ну а у меня блог про Delphi :). И сегодня я решил заняться немного практической стороной – не рассматривать возможности библиотек, а применить их на практике. Самое простое, что пришло в голову – написать небольшую программку по проверке странички в индексе Google. Конечно, есть сервис для веб-мастера от того же самого Google где можно эту информацию посмотреть. Однако небольшое исследование “интернетов” показало, что подобный софт всё ещё пользуется успехом у оптимизаторов. Опять же есть пара идей на будущее, но об этом я пока умолчу (кто его знает, что случится завтра?) – будет время расскажу и, возможно, даже покажу.
Так вот. Года этак полтора назад я рассказывал о том, как проверить наличие страниц сайта в Яндекс. Скажем так, представленный в том посте способ не отличается стабильностью и универсальностью :) Смысл работы был следующим – составляем правильный запрос, скачиваем страницу и парсим-парсим-парсим. Все бы хорошо, но добрый Яндекс периодически отправляет программку на страничку с каптчей и надо все время держать в уме как минимум возможность установки достаточной задержки между запросами, либо использовать кучу проксей, или, как я недавно рассказывал – юзать сервисы, использующие Яндекс.XML.
C Google в этом отношении все намного проще и удобнее – есть нормальный Search API. А где есть API – там есть и то, что нам необходимо. Все, что необходимо – правильно его (API) использовать, чтобы:
- Затратить как можно меньше трафика (несмотря на то, что безлимит рулит);
- Получить сведения о том, проиндексирована страница или нет;
Вот этим мы сегодня и займемся.
Так как действие программы предполагается одно, то предлагаю следующий интерфейс программы:
В левый ListBox будем добавлять все URL для проверки, а в два Memo будем делить все исходные URL’ы в зависимости от их индексации в Google.
Теперь остановимся на вопросе о том, как понять есть ли страница в индексе или нет? Для этого обратимся к справочнику языка запросов Google, который нам говорит, что есть два замечательных оператора:
- site: выполняет поиск на определенном сайте
- 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 потоков? Начало положено – дописать, думаю, проблем никаких не возникнет.
Ну, а ниже представлен результат работы программы:
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
спасибо интересно
Интересует такая программа, но как ее запустить человеку далекому от программирования? :)
Через freelancer.ru :) Заказываете программку — Вам напишут — Оплачиваете — Работаете
Здравствуйте, Влад. Я хотел связаться через мэйл (админ_вебдельфи) ящик уже не работает или через соцсети (у вас блок на добавление). Дайте контакт. За небольшую помощь готов материально отблагодарить.
Здравствуйте, Андрей! Напишите на bvv36@yandex.ru