Среда, 22.11.2017, 01:53
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

Меню сайта
Категории раздела
Парсинг [2]
Статьи по написанию парсеров
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


















Тиц
Главная » Статьи » Парсинг » Парсинг

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

Содержание

Урок 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 – тип данных «Числовой», размер поля «Одинарное с плавающей точкой».

Скачать готовую базу можно здесь, а почитать подробно как создать базу можно тут http://basicsprog.ucoz.ru/publ/3-1-0-1.

      Приступим к созданию парсера. Для этого запускаем 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. Все подключение к базе активировано;

Компонент 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 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, позволяющий работать с различными кодировками. Класс TStringsTStringList) используют 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">.

На этом урок закончен. Продолжение читайте на следующем уроке…




Категория: Парсинг | Добавил: xaramamburu (01.12.2011)
Просмотров: 21216 | Комментарии: 3 | Рейтинг: 3.4/10
Всего комментариев: 3
2  
Автор, достаточно грамотно написал для тех кто разбирается.
Если влезть первый раз в делфу и начать творить мастер-классы сразу не получиться.

1  
В дельфи написать пример поставил, дельфи разные бывают уточнять надо какой

3  
В статье вроде написано, что моя Delphi 2010.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 532
Уголок общения



Copyright MyCorp © 2017Конструктор сайтов - uCoz