Урок 1.1. Пишем парсер каталога интернет магазина на Delphi
На сегодняшнем уроке перед нами будет стоять следующая задача: написать
программу парсер для считывания каталога интернет магазина в базу
данных MS Access 2003 – 2007.
Как правило не существует универсальных парсеров для работы с HTML
кодом, поэтому такие парсеры пишутся индивидуально для каждого интернет
магазина. В нашем случае я расскажу как создать парсер для одной
страницы каталога интернет магазина http://price.portalkirov.ru/cat/index.php?cPath=418209_463431.
Немного теории.
Парсинг - автоматизированный сбор контента или данных с какого-либо сайта или сервиса. Результат парсинга чаще всего складывается в базу данных.
Скрипт или программа, занимающаяся, непосредственно, сбором, анализом и преобразованием требуемой информации называется парсером.
Любой парсер состоит из трех частей, которые отвечают за три отдельных процесса парсинга:
1. Получение контента в исходном виде. Под получением контента, чаще всего подразумевается скачивание кода веб-страницы, из которой необходимо извлечь данные или контент; 2. Извлечение и преобразование данных. В этой фазе происходит извлечение требуемых данных из полученного, на первом этапе, кода страницы. Чаще всего для извлечения используют регулярные выражения. Также на этом этапе происходит преобразование извлеченных данных к нужному формату, если это требуется; 3. Генерация результата. Завершающий этап парсинга. На нем происходит вывод или запись полученных, на втором этапе, данных, в требуемый формат. Чаще всего, запись ведется напрямую в базу данных.
В нашем случае парсить будем код товара, фото, наименование товара, цену. Для этого нам понадобится скачать компонент для работы с регулярными выражениями (TRegExpr). Скачать компонент можно с официального сайта (там же находится описание на русском языке как с ним работать) http://regexpstudio.com/RU/TRegExpr/TRegExpr.html или здесь. Для его подключения достаточно просто скопировать в папку с проектом файл RegExpr.pas и в проекте в разделе Uses прописать модуль RegExpr.
Далее нам необходимо в MS Access 2003 – 2007 создать базу данных katalog.mdb с таблицей catalog содержащей следующие поля:
id – тип данных «Счетчик»; code – тип данных «Текстовый»; foto – тип данных «Поле объекта OLE»; ext – тип данных «Текстовый»; name_tovara – тип данных «Поле МЕМО»; cost – тип данных «Числовой», размер поля «Одинарное с плавающей точкой».
Приступим к созданию парсера. Для этого запускаем Delphi и создаем новый проект, сохраняем проект в отдельной папке и копируем в нее нашу созданную базу и файл RegExpr.pas. Далее приступим к созданию формы. Разместим на ней следующие компоненты:
Пять компонентов TEdit, в edit5 свойство text пропишем адрес интернет магазина http://price.portalkirov.ru/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. Все подключение к базе активировано;
Большинство компонентов, размещенных на форме необходимы для отладки программы. Поэтому после завершения парсера их можно будет удалить.
Приступим непосредственно к созданию парсера. Первое, что необходимо сделать это проанализировать 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 Len<>0 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;
Запускаем и видим, что русский текст отображается нормально:
Какой способ использовать решать вам, а я остановлюсь на втором.
Теперь находим в HTML коде, информацию о товарах:
Из кода видно, что информация о товарах начинается с тега <tr class="productListing-odd"> или <tr class="productListing-even">.
На этом урок закончен. Продолжение читайте на следующем уроке…