Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Парсинг товаров сайта средствами 1С 8
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > База знаний > Не наши статьи > 1С:Предприятие 8.2
Vofka
В этой статье я постараюсь описать процесс парсинга сайтов средствами 1С с примером. Это статья не является инструкцией к применению, а лишь демонстрирует возможности 1С.

Что мы имеем?

1. Сайт в интернете, на котором располагается список товаров. В моем случае – это интернет магазин салона «Связной»
2. Понимание основ сайтостроения… хотя бы знание HTML тегов
3. Умение кодить в 1С 8

Все вышеперечисленные пункты в арсенале? Тогда читаем далее


Для начала парсинга стоит определиться с тем что мы хотим спарсить и какая у нас будет иерархия. В моем случае это категория сотовых телефонов. Верхний уровень иерархии будет производители. Почему именно так? Потомы что я так захотел. Вы же вправе использовать любую иерархию.

Далее нам будут интересны такие поля как: Наименование, Цена, Картинка и Описание... ну и пожалую захватим операционную систему, чтобы пример получился более наглядным.

1. Создаем внешнюю обработку. Те, кто не знают как это сделать - дальше могут не читать
2. Создаем форму обработки с командной панелью снизу и сверху (они могут быть полезными)
3. Размещаем на ней Панель и обзываем первую страницу "СамСайт"
4. Кладем на страницу "СамСайт" ПолеHTMLДокумента и обзываем его к примеру "Сайт"
5. Переименовываем кнопку "Выполнить", которая находится на нижней панели в "Загрузить сайт"
6. Описываем процедуру нажатия на эту кнопку так:

   ЭлементыФормы.Сайт.Перейти("http://www.svyaznoy.ru/catalog/phone/224");//Категория с мобильными телефонами


7. Проверяем работу нашей обработки. У меня появился сайт связного. А у Вас?

Дальше сложнее. Все еще хочешь парсить сайты? Тогда читай

Сам парсинг сайта заключается в обходе всех элементов загруженной страницы, выдергивания необходимой информации и запихивания их в табличную часть. Для это

1. Создадим табличную часть "Производители" с реквизитами "Отметка" (Булево), "Наименование" (Строка 100) и "Ссылка" (Строка 300).
2. Добавляем еще одну страницу на панели и обзываем ее "Производители"
3. Размещаем на этой странице одноименную табличную часть
4. Добавляем на нижней панели кнопку "Заполнить производителей" с кодом:

        Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл
              Если Стр.tagName = "H1" и Стр.innerText = "Производители" Тогда
                  Для Каждого опСтр из Стр.nextSibling.children Цикл
                      новСтр = Производители.Добавить();
                      новСтр.Наименование = опСтр.innerText;
                      новСтр.Ссылка = опСтр.firstChild.href;
                  КонецЦикла;
                  Возврат;
              КонецЕсли;
          КонецЦикла;


Здесь напрашиваются небольшие пояснения:
tagName - имя HTML тега в HTML документе
nextSibling - следующий элемент HTML документа от текущего
children - список дочерних элементов
firstChild - первый дочерний элемент от текущего
5. Проверям. При проверке важно, находиться на странице "СамСайт", чтобы заполнять производителей

Производители заполнены. Теперь к самим телефонам

1. Создаем табличную часть "Товары" с реквизитами "Производитель" (Строка 100), "Наименование" (Строка 100), "Цена" (Число 10,2), "Картинка" (Строка 300), "Описание" (Строка Неограниченная), "ОС" (строка 100), "Ссылка" (Строка,300)
2. Добавляем еще одну страницу на панели и обзываем ее "Товары"
3. Размещаем на этой странице одноименную табличную часть
4. Добавляем на нижней панели кнопку "Заполнить товары" с кодом:

      Для Каждого Стр из Производители Цикл
          //Если отметку сняли - то не трогаем этого производителя
          Если Не Стр.Отметка Тогда
              Продолжить;
          КонецЕсли;
          Форма = ПолучитьФорму("ФормаТоваров");
          Форма.ЭлементыФормы.Сайт.Перейти(Стр.Ссылка);
          Форма.ТекущийПроизводитель = Стр;
          Форма.ОткрытьМодально();
      КонецЦикла;


5. Создаем форму обработки "ФормаТоваров"
6. Кладем на "ФормаТоваров" ПолеHTMLДокумента и называем его "Сайт"
7. На событие ДкументСформирован у ПоляHTMLДокумента пишем код:

 Если ЭлементыФормы.Сайт.Документ.body.all.length>1 Тогда
          ГрузимТовары();
      КонецЕсли;


8. Создаем переменную в модуле формы
перем ТекущийПроизводитель Экспорт;
9. Создаем процедуру ГрузимТовары():

  Процедура ГрузимТовары()
          Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл
              Если Стр.className = "ct_desc cleared" Тогда
                  новСтр = Товары.Добавить();
                  Для Каждого опСтр из Стр.children Цикл
                      Если опСтр.className = "pic_and_comp" Тогда
                          новСтр.Картинка = СтрЗаменить(Сред(опСтр.firstChild.style.backgroundImage,5),")","")
                      КонецЕсли;
                      Если опСтр.className = "name" Тогда
                          новСтр.Наименование = опСтр.innerText;
                          новСтр.Ссылка = опСтр.firstChild.href;
                      КонецЕсли;
                      Если опСтр.className = "price" Тогда
                          новСтр.Цена = Число(СтрЗаменить(СтрЗаменить(опСтр.innerText,"-","")," ",""));
                      КонецЕсли;
                      Если опСтр.className = "desc" Тогда
                          новСтр.Описание = опСтр.innerText;//опСтр.innerHTML - если нужно вместе с тегами

                      КонецЕсли;
                  КонецЦикла;

              КонецЕсли;

          КонецЦикла;
          Закрыть();
      КонецПроцедуры




10. Проверям. Все работает.

Дело осталось за "операционной системой" и еще надо загрузить картинки. Давайте по порядку. Чтобы получить "ОС" нам надо открыть этот товар и считать "ОС" оттуда. Для этого делаем следующее:

1. Добавляем на нижней панели кнопку "Доп Инфо" с кодом:

  Для Каждого Стр из Товары Цикл
          Форма = ПолучитьФорму("ФормаДопИнфо");
          Форма.ЭлементыФормы.Сайт.Перейти(Стр.Ссылка);
          Форма.ТекущийТовар = Стр;
          Форма.ОткрытьМодально();
      КонецЦикла;


2. Создаем форму обработки "ФормаДопИнфо"
3. Кладем на "ФормаДопИнфо" ПолеHTMLДокумента и называем его "Сайт"
4. На событие ДкументСформирован у ПоляHTMLДокумента пишем код:

   Если ЭлементыФормы.Сайт.Документ.body.all.length>1 Тогда
          ГрузимДопИнфо();
      КонецЕсли;


5. Создаем переменную в модуле формы
перем ТекущийТовар Экспорт;
6. Создаем процедуру ГрузимДопИнфо():

  Процедура ГрузимДопИнфо();
          Для Каждого Стр из ЭлементыФормы.Сайт.Документ.body.all Цикл
              Если Стр.className = "card_spec" Тогда
                  Для Каждого опСтр из Стр.children Цикл
                      Если Найти(опСтр.innerText,"Операционная система:") Тогда
                          ТекущийТовар.ОС = СокрЛП(СтрЗаменить(опСтр.innerText,"Операционная система:",""));
                      КонецЕсли;
                  КонецЦикла;
              КонецЕсли;
          КонецЦикла;
          Закрыть();
      КонецПроцедуры


7. Проверяем и переходим к последнему пункту

Заметили как похожи две последние инструкции? То-то же. Стремился к универсальности. Ну и наконец последний этап - Сохраним все изображения к примеру на диск "С" в папку "связной". Поехали

1. Добавляем на нижней панели кнопку "Сохранить Картинки" с кодом:

    Для Каждого Стр из Товары Цикл
              путьСамФайл = Лев(Стр.Картинка,Найти(Стр.Картинка,".jpg/") + 3);
              самФайл = СтрЗаменить(СтрЗаменить(ПутьСамФайл,"http://static.svyaznoy.ru/upload/iblock/",""),"/","");
              Стр.Картинка = СохранитьКартинкуСайта("C:\Svyaznoy",ПутьСамФайл,СамФайл);
          КонецЦикла;


2. Добавляем функцию СохранитьКартинкуСайта:

   Функция СохранитьКартинкуСайта(КаталогСохранения,КартинкаНаСайте,КартинкаУНас)
              ИмяФайлаКартинки = КаталогСохранения + "\" + КартинкаУНас;
              ГетЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
              ГетЗапрос.SetTimeouts(10000, 10000, 10000, 10000);
              БазовыйУРЛ = КартинкаНаСайте;
              Хидер1 = "Content-Type";
              Хидер2 = "image/jpg"; // Тип рисунка.
              ГетЗапрос.Open("GET", БазовыйУРЛ, False); // Синхронный режим.
              ГетЗапрос.setRequestHeader(Хидер1, Хидер2);
              ГетЗапрос.Send();
              СтатусОтправки = ГетЗапрос.status;
              Если СтатусОтправки <> 200 Тогда
                  Сообщить("Ошибка отправки запроса на: "
                      + КартинкаНаСайте);
                  Возврат "";
              КонецЕсли;        

              Стрим = Новый COMОбъект("ADODB.Stream");
              Стрим.Mode = 3;
              Стрим.Type = 1;
              Стрим.Open();
              Стрим.Write(ГетЗапрос.responseBody);

              Стрим.SaveToFile(ИмяФайлаКартинки, 2);
              Стрим.Close();
              Возврат ИмяФайлаКартинки;
      КонецФункции


На этом наша эпопея с парсингом закончена. Это всего лишь пример того, как это можно сделать. Приложив сюда немного своего кода - можно сделать парсер для любого сайта.

Имя парсер 1С - я могу спарсить все, кроме этого парсера. Имя два парсера 1С - я могу спарсить все smile.gif



необходимо зарегистрироваться для просмотра ссылки

необходимо зарегистрироваться для просмотра ссылки
W-divin
Тема прикольная. Пара замечаний:
1) ссылки битые (((
2) Работает не со всеми сайтами - у меня некоторые нужные мне сайты в полеHTMLдокумента рисует следующее:

<div class="b-message-error">
Извините, работа этого сайта в вашем браузере не поддерживается.
</div>


<div class="b-message-info">

Установите современную версию браузера:

<div id="browser-upgrade-box">
<a class="chrome-link" href="http://www.google.com/chrome/">&nbsp;</a>
<a class="firefox-link" href="http://www.mozilla.com/">&nbsp;</a>
<a class="safari-link" href="http://www.apple.com/safari/">&nbsp;</a>
<a class="ie8-link" href="http://www.microsoft.com/windows/internet-explorer/">&nbsp;</a>
<a class="opera-link" href="http://www.opera.com/browser/">&nbsp;</a>
</div>

</div>
Movel
Что-то эта обработка не работает - точнее не заполняет таблицу "Производители", а в чем проблема не понятно. В Синтаксис-помощнике про ДокументHTML данных мало. А где их можно найти?
pablo
Цитата(W-divin @ 22.09.11, 23:34) необходимо зарегистрироваться для просмотра ссылки
<div class="b-message-error">
Извините, работа этого сайта в вашем браузере не поддерживается.
</div>

Здесь все очень просто. 1с использует для работы средства ОС, а именно IE, установленный в системе. Который многие веб-разработчики любят ярко и пламенно, из-за чего и делают такие заглушки. Чтобы лишняя любовь не воспылала... 32541510.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.