Парсинг Сервис

Пишем парсер каталога интернет магазина на delphi.

Пять компонентов TEdit, в edit5 свойство text пропишем адрес интернет магазина price.portalkirov/cat/index.php?cPath=418209_463431;
Два компонента TMemo;
Два компонента TButton, для Button1 свойство Caption пишем «Грабим», для Button2 свойство Caption пишем «Очистить базу»;
Компонент TImage;
Компонент TADOConnection и подключаем его к базе katalog.mdb. Выделяем компонент TADOConnection и в свойстве LoginPromt ставим на False. Это делаем для того, чтобы при подключении к БД пароль у нас не запрашивался, дальше в свойстве ConnectionString нажимаем на кнопку с «…». В открывшемся окне нажимаем на кнопку «Build…» и появляется следующее окно. В нем выбираем провайдера, а именно Microsoft Jet 4.0 OLE DB Provaider и нажимаем кнопку «Далее». В открывшемся окне мы указываем путь к нашей БД и имя пользователя по умолчанию Admin , жмем кнопку «Ок». Если ваша БД находится в корневом каталоге с программой, то в данном поле достаточно указать ее имя с расширением, примерно так katalog.mdb. Обратите внимание, если вы укажите полный путь к базе, то при переносе на другой компьютер путь к БД будет не найден!!!
В свойстве компонента TADOConnection – Mode выбрать из выпадающего списка cmShareDenyNone, а свойство TADOConnection – Connected ставим True. Все подключение к базе активировано;
Компонент TADOTable, свойство Connection -->ADOConnection1; свойство TableName --> catalog;
Компонент TDataSource, свойство DataSet --> ADOTable1;
Компонент TDBGrid, свойство DataSource --> DataSource1;
Компонент TADOQuery, свойство Connection -->ADOConnection1;
Из вкладки Indy Clients компонент TIdHTTP.
Большинство компонентов, размещенных на форме необходимы для отладки программы. Поэтому после завершения парсера их можно будет удалить.
Приступим непосредственно к созданию парсера.
Первое, что необходимо сделать это проанализировать HTML код страницы которую собираемся парсить. Для этого используя компонент IdHTTP и метод get загрузим код HTML в Memo1.
Добавим в разделе Var переменную html:
var
html:string;
А на событие OnClick кнопки «Грабим» повесим код:
procedure TForm1.Button1Click(Sender: TObject);
begin
html:=IdHTTP1.Get(edit5.Text);
memo1.Text:=html;
End;
Запускаем и проверяем содержимое Memo1 поля:
Сразу видим первую проблему. Русский текст выводится иероглифами. Это связано с тем, что кодировка страниц сайта windows-1251, а моя Delphi 2010 использует строки Unicode.
Для решения данной проблемы можно использовать несколько способов:
Первый способ использовать функцию, которую я нашел в Интернете. К сожалению, автор был не указан.
function RussianToUnicode(S: String): String;
var Wrd:Word;
pW,pR:PWord;
len:Integer;
begin
pW:=S[1];
len:=Length(S);
SetLength(Result,len);
pR:=Result[1];
while Len0 do begin
Wrd:=pW^;
case Wrd of
$C0..$DF,$E0..$FF:pR^:=Wrd+$0350;
else pR^:=Wrd;
end;
inc(pW);
inc(pR);
dec(Len);
end;
end;
Тогда на событие OnClick кнопки «Грабим» повесим код:
procedure TForm1.Button1Click(Sender: TObject);
begin
html:=RussianToUnicode(IdHTTP1.Get(edit5.Text));
memo1.Text:=html;
End;
Второй способ:
В Delphi 2009 и выше появился класс TEncoding, позволяющий работать с различными кодировками. Класс TStrings (и TStringList) используют TEncoding для определения кодировки файла и всех преобразований.
Для использования второго способа в разделе Var добавим еще две переменные:
DestEncoding:TStream;
mm:TStringList;
А на событие OnClick кнопки «Грабим» повесим код:
procedure TForm1.Button1Click(Sender: TObject);
begin
//Получаем HTML код сайта в переменную html и мемо поле
DestEncoding:= TMemoryStream.Create;
IdHTTP1.Get(edit5.Text,DestEncoding);
DestEncoding.Position :=0;
mm:=TStringList.Create;
mm.LoadFromStream(DestEncoding);
html:=mm.Text;
memo1.Text:=html;
DestEncoding.Free;
mm.Free;
//End;