Парсинг сайта без использования встроенного браузера для начинающих

20.11.14

Интеграция - Сайты и интернет-магазины

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

Скачать файлы

Наименование Файл Версия Размер
Итоговая версия обработки "Парсинг сайта"
.epf 13,53Kb
214
.epf 0.0.1 13,53Kb 214 Скачать

Задача: научиться парсить сайт на конкретном примере

Будем парсить сайт brass.ru - крупного поставщика фурнитуры

Способ парсинга аналогичен тому, что указан в публикации //infostart.ru/public/88106/ , но имеет другой подход.

Далее следует большое полотно текста вперемешку с кодом, если нет желания читать – внизу можно скачать обработку и сразу разбираться в коде – он прокомментирован.

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

Поехали!

Парсить будем не с помощью элемента ДокументHTML на форме, а с помощью ЧтениеHTML (класс для загрузки html-документа) и ПостроительDOM (класс, загружающий в себя всю структуру и информацию документа). Суть этого метода заключается в том, что нам нужно подключиться к серверу, получить необходимую нам html-страницу (только html-код) и разобрать ее, а не загружать всё содержимое страницы на форму и потом рендерить его.

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

Я использовал для этого Google Chrome.

Теоритическая часть

1. Парсим каталоги

Начнем собирать данные. Заходим в каталог товаров, клацаем правой клавишей на список товаров -> Показать код элемента. Видим, что список подкаталогов содержится в элементе TABLE с классом navCatalog, глядим на ссылки на подкаталоги – они представляют из себя элементы A. Это значит, что нам нужно найти элемент TABLE с классом navCatalog и получить из него все элементы A. Если мы перейдем в первый каталог, то увидим, что там есть еще каталоги – это не проблема, ведь эта страница подчиняется все тем же правилам, а наша процедура парсинга каталогов будет рекурсивна.

2. Парсим список товаров

Переходим в следующий подкаталог и, наконец, видим наши товары. Они, конечно, распределены по страницам, но, добавив в ссылку «?SHOWALL_1=1», мы сможем посмотреть весь список товаров из этого каталога. Смотрим код элемента, и видим, что все товары так же заключены в элементе TABLE, но уже с классом catalog. Этот элемент содержит в себе блоки TD с классом item – это и есть блоки с нашими товарами. В каждом из них содержится по два блока DIV с именами img и name – они содержат изображение и имя (ссылку на товар), соответственно. Все, с этой страницы мы вытянули все, что нам было нужно.

3. Парсим страницу товара

Все, что нам осталось найти – ссылка на картинку большого разрешения и описание товара. Переходим на страницу товара, все тем же способом видим, в каком блоке находится картинка (блок DIV класса big) и описание (блок DIV класса text). Все, осталась только техническая часть.

Техническая часть

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

  1. Парсим страничку каталога верхнего уровня и получаем список остальных каталогов;
  2. Рекурсивно парсим страницы каталогов на подкаталоги;
  3. Парсим подкаталоги нижнего уровня на список товаров;
  4. Парсим страницу каждого товара для получения информации о нем.

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

Создадим обработку. Добавим реквизиты:

- Сервер (будем хранить адрес нашего сайта);

- КаталогЗагрузки (путь к папке на диске, в которую будут загружаться временные файлы).

Добавим на форму табличную часть «СписокКаталогов» с реквизитами

- Раздел (для хранения имени каталога);

- СсылкаНаСтраницу (для хранения ссылки на каталог).

Будем грузить артикул, наименование, описание и большую картинку.

Добавим на форму табличную часть «Товары» с реквизитами:

- Артикул;

- Наименование;

- Описание;

- СсылкаНаКартинку (будем хранить ссылку на маленькую картинку);

- СсылкаНаТовар (будем хранить ссылку на страницу товара);

- ПутьКФайлу (будем хранить путь к картинке, которую загрузили на диск).

Все реквизиты должны быть типа строка неограниченной длины. Можно добавить реквизит-пометку для обозначения тех строк, которые нам нужно будет загрузить.

Собственно, реквизитов нам больше не нужно, приступим к написанию кода.

В комментариях дали ссылку на отлично расписанный способ получить страницу (я использую его же, но очень худо)

Первым делом грузим и парсим страницу основного каталога – brass.ru/catalog/.

 При открытии формы нам следует запомнить сервер, с которого будем загружать страницы – www.brass.ru (адрес должен выглядеть именно так), каталог на диске. Так же откроем соединение с сервером.

Перем Соединение;
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Сервер = "www.brass.ru";
    КаталогЗагрузки = "C:/1c82/brass";
    Соединение = Новый HTTPСоединение(Сервер);
КонецПроцедуры

Так же нам обязательно нужно создать в этом каталоге еще три других, в них будут загружаться временные файлы:

- "/catalog/"
- "/temp/"
- "/img/"

Что бы понять, что будет происходить далее, нужно обязательно при запуске кода смотреть, что из себя прадставляют полученные нами структуры (табличцы значений) ДокументХТМЛ, ЭлементыTABLE, ЭлементыTD и прочие подобные - сразу все встанет на свои места.

Обозначим процедуру (сразу с параметрами, т.к. она будет рекурсивно парсить все каталоги).

Процедура ПропарситьКаталог(Каталог = "", Раздел = "")
	ЧтениеХТМЛ = Новый ЧтениеHTML; 
	ПостроительДОМ = Новый ПостроительDOM;
	//Генерируем имя файла на диске, в который запишется страница сайта
	ИмяФайла = КаталогЗагрузки + "/catalog/" + СтрЗаменить(Каталог, "/", "_") + ".html"; 
	//Загружаем нужную нам страницу в каталог
	Соединение.Получить(Каталог, ИмяФайла);
	//Начинаем чтение нашего файла
	ЧтениеХТМЛ.ОткрытьФайл(ИмяФайла, "UTF-8"); 
	//Загружаем всю структуру документа в DOM
	ДокументХТМЛ = ПостроительДОМ.Прочитать(ЧтениеХТМЛ);
	
	//Получаем все элементы TABLE
	ЭлементыTABLE = ДокументХТМЛ.ПолучитьЭлементыПоИмени("TABLE");
	//Находим в них нужный нам блок, содержащий ссылки на подкаталоги
	Для Каждого ЭлементTABLE из ЭлементыTABLE Цикл
	ОбработкаПрерыванияПользователя();
		Если ЭлементTABLE.ИмяКласса = "navCatalog" Тогда
		    //Нашли, собираем из него все ссылки (элементы А)
			ЭлементыA = ЭлементTABLE.ПолучитьЭлементыПоИмени("A");
			Если ЭлементыA.Количество() > 0 Тогда
				//Начинаем парсить каждую найденную ссылку как каталог этой же процедурой рекурсивно
				Для Каждого ЭлементA из ЭлементыA Цикл
					ПропарситьКаталог(ЭлементA.Гиперссылка, Раздел + " / " + ЭлементA.ТекстовоеСодержимое);
				КонецЦикла;
			Иначе
				//Если ссылок не найдено, значит подкаталогов нет и это конечный подкаталог
				//Добавляем его в нашу табличную часть
				НоваяСтрока = СписокКаталогов.Добавить();
				НоваяСтрока.Раздел = Раздел;
				НоваяСтрока.СсылкаНаСтраницу = Каталог;	
			КонецЕсли;	
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Лепим на форму кнопку - при ее нажатии у нас загрузятся все каталоги и заполнится табличная часть каталогов, в событие при нажатии вставляем следующее:

ПропарситьКаталог("/catalog/", "Каталог");

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

Далее создадим кнопку для загрузки товаров в соответствующую табличную часть и пропишем ей следующий код:

Товары.Очистить();

ЧтениеХТМЛ = Новый ЧтениеHTML(); 
ПостроительДОМ = Новый ПостроительDOM;
//Добавляем к адресу ссылки обозначение, которое позволит нам получить полный список товаров выбранного каталога, а не постранично	
АдресСайта = ЭлементыФормы.СписокКаталогов.ТекущиеДанные.СсылкаНаСтраницу + "?SHOWALL_1=1";
//Загружаем страницу с товарами
Соединение.Получить(АдресСайта, КаталогЗагрузки + "/site.html");
//Начинаем чтение нашего файла
ЧтениеХТМЛ.ОткрытьФайл(КаталогЗагрузки + "/site.html", "UTF-8"); 
//Загружаем всю структуру документа в DOM
ДокументХТМЛ = ПостроительДОМ.Прочитать(ЧтениеХТМЛ); 

//Получаем все элементы TABLE
ЭлементыTABLE = ДокументХТМЛ.ПолучитьЭлементыПоИмени("TABLE");

Для Каждого ЭлементTABLE из ЭлементыTABLE Цикл
	//Находим блок, содержащий все товары
	Если ЭлементTABLE.ИмяКласса = "catalog" Тогда
		//Теперь получаем все блоки TD, входящие в блок TABLE класса catalog
		ЭлементыTD = ЭлементTABLE.ПолучитьЭлементыПоИмени("TD");
		Для Каждого ЭлементTD из ЭлементыTD Цикл
			//Находим блок каждого товара
			Если ЭлементTD.ИмяКласса = "item" Тогда
				//Теперь получаем все блоки DIV, входящие в блок TD класса item
				ЭлементыDIV = ЭлементTD.ПолучитьЭлементыПоИмени("DIV");
				//Мы знаем, что в каждом таком блоке лежат еще два блока с картинкой и ссылкой на страницу товара
				Если ЭлементыDIV.Количество() = 2 тогда
					НоваяСтрока = Товары.Добавить();
					//Добавили новую строку в табличную часть товары, переходим к её заполнению
					Для Каждого ЭлементDIV из ЭлементыDIV Цикл
						//Нашли блок с картинкой маленького разрешения
						Если ЭлементDIV.ИмяКласса = "img" Тогда
							//Т.к. в этом блоке есть еще один блок, а в нем еще один, то мы можем спокойно обращаться к ним через ПервыйДочерний
							//Таким образом мы спускаемся вниз по дереву структуры до нужных нам данных
							НоваяСтрока.СсылкаНаТовар = ЭлементDIV.ПервыйДочерний.Гиперссылка;
							Если НЕ ЭлементDIV.ПервыйДочерний.ПервыйДочерний = Неопределено Тогда
								НоваяСтрока.СсылкаНаКартинку = ЭлементDIV.ПервыйДочерний.ПервыйДочерний.Источник;
							КонецЕсли;
						КонецЕсли;
						//Нашли блок с именем товара
						Если ЭлементDIV.ИмяКласса = "name" Тогда
							//Получаем текстовое содержимое - артикул и наименование в одной строке! Не беда.
							ПолученнаяСтрока = ЭлементDIV.ТекстовоеСодержимое;
							//Артикул состоит из цифр и латинских символов, разберем строку по этому принципу
							Н = 1;
							Пока Н  1000 Тогда
									Прервать;
								КонецЕсли;
								Н = Н + 1;
							КонецЦикла;
							
							Артикул = Лев(ПолученнаяСтрока, Н - 1);
							Если СтрДлина(Артикул) > 0 Тогда
								Наименование = Прав(ПолученнаяСтрока, СтрДлина(ПолученнаяСтрока) - Н);
							Иначе
								Наименование = Прав(ПолученнаяСтрока, СтрДлина(ПолученнаяСтрока) - Н + 1);
							КонецЕсли;
							
							НоваяСтрока.Артикул = Артикул;
							НоваяСтрока.Наименование = Наименование;
						КонецЕсли;
					КонецЦикла;	
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
КонецЦикла;

Поздравляю, теперь наша обработка может загрузить все товары из выбранного в первой табличной части каталога!

Следующим шагом создаем кнопку для загрузки дополнительной информации (картинки большого разрешения и описания) путем парсинга страницы товара:

ЧтениеХТМЛ = Новый ЧтениеHTML(); 
ПостроительДОМ = Новый ПостроительDOM;

//Т.к. ссылки на страницы с товарами у нас уже есть в табличной части, то мы просто загружаем и парсим их страницы
Для Каждого Строка из Товары Цикл
	Если Строка.Пометка Тогда
		//Код аналогичен предыдущим этапам, поэтому комментарии излишни
		ИмяФайла = КаталогЗагрузки + "/temp/site_" + Строка.НомерСтроки +".html";
		Соединение.Получить(Строка.СсылкаНаТовар, ИмяФайла);
		ЧтениеХТМЛ.ОткрытьФайл(ИмяФайла, "UTF-8");
		ДокументХТМЛ = ПостроительДОМ.Прочитать(ЧтениеХТМЛ); 
		//Получаем все блоки DIV
		ЭлементыDIV = ДокументХТМЛ.ПолучитьЭлементыПоИмени("DIV");
		Для Каждого ЭлементDIV из ЭлементыDIV Цикл
			//Находим интересующий нас блок с картинкой большого разрешения
			Если ЭлементDIV.ИмяКласса = "big" Тогда
				Если НЕ ЭлементDIV.ПервыйДочерний = Неопределено Тогда
					Строка.СсылкаНаКартинку = ЭлементDIV.ПервыйДочерний.Источник;	
				КонецЕсли; 
			КонецЕсли;
			//Находим интересующий нас блок с описанием товара
			Если ЭлементDIV.ИмяКласса = "text" Тогда
				//В строке содержатся лишние символы, поэтому просто обрежем их
				ПолученнаяСтрока = ЭлементDIV.ТекстовоеСодержимое;	
				Н = 1;
				Пока Н  1000 Тогда
						Прервать;
					КонецЕсли;
					Н = Н + 1;
				КонецЦикла;
				
				Строка.Описание = Прав(ПолученнаяСтрока, СтрДлина(ПолученнаяСтрока) - Н + 1);
			КонецЕсли;
		КонецЦикла;	
	КонецЕсли;
КонецЦикла;

Отмечаем галочками несколько товаров, жмем кнопку и видим, как загружается описание и ссылка на картинку заменяется новой. 

По сути, текстовые данные мы получили, задача выполнена, но осталось еще загрузка картинок - это будет бонусом и без комментариев кода. Или другой, более эффективный способ сохранения картинки от Поручика

Для этого создадим функцию для загрузки картинки, которая вернет нам путь к ней:

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

		Stream = Новый COMОбъект("ADODB.Stream");
		Stream.Mode = 3;
		Stream.Type = 1;
		Stream.Open();
		Stream.Write(Request.responseBody);

		Stream.SaveToFile(ИмяФайлаКартинки, 2);
		Stream.Close();
	Исключение
	КонецПопытки;
	Возврат ИмяФайлаКартинки;
КонецФункции

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

Строка.ПутьКФайлу = ЗагрузитьКартинку(КаталогЗагрузки + "/img/", Сервер + Строка.СсылкаНаКартинку, ЗаменитьСимволы(Строка.Артикул) + ".jpg");

Имена картинок формируются из артикулов, а артикулы могут содержать неприемлимые знаки, избавимся от них функцией ЗаменитьСимволы, которая у нас использована в предыдущем отрывке кода:

Функция ЗаменитьСимволы(мСтрока)
	Строка = СтрЗаменить(мСтрока, "", "");
	Н = 1;
	ДС = СтрДлина(Строка) - 1;
	Пока Н  90) И (КодСимвола(Строка, Н) < 48 ИЛИ КодСимвола(Строка, Н) > 57) И (КодСимвола(Строка, Н) < 97 ИЛИ КодСимвола(Строка, Н) > 122) Тогда
			Строка = СтрЗаменить(Строка, Сред(Строка, Н, 1), "-");
		КонецЕсли;
		Н = Н + 1;
	КонецЦикла;
	
	Возврат Строка;
КонецФункции

Алилуя! У нас есть артикул, наименование, описание и картинка в большом разрешении! Осталось только перенести эти данные в номенклатуру, но если вы дошли до этого момента, то, надеюсь, вы это сможете сделать сами.

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

Спасибо за внимание!

 

 

 

 

парсинг сайта программирование

См. также

API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3

Сайты и интернет-магазины Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Беларусь Россия Управленческий учет Платные (руб)

Модуль для интеграции с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress. При помощи расширения поддерживаются следующие методы: обмен остатками товаров, обмен ценами, обработка заказов, печать стикеров, загрузка отчетов комиссионеров по API (в том числе Я.Маркет). Подходит для конфигураций Беларуси. Поддержка искусственного интелекта GigaChat

59990 руб.

05.09.2023    7116    87    74    

68

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    15744    10    17    

11

Оплата покупок "Долями" в 1С:Розница 2.3 (для работы с сервисом dolyame.ru)

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку.

18000 руб.

19.12.2023    1175    6    1    

6

SALE! 15%

Обмен данными с сайтом. БП 3.0

Оптовая торговля Розничная торговля Сайты и интернет-магазины Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обмен данными с сайтом на платформе 1С:Битрикс (и подобными) для 1С: Бухгалтерия предприятия 3.0.

12000 10200 руб.

18.03.2019    31271    109    100    

62

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17548    6    15    

13

SALE! 33%

«Мониторинг цен» – сервис для отслеживания цен конкурентов на ведущих маркетплейсах России

Маркетплейсы Сайты и интернет-магазины 8.3.14 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Сервис помогает отслеживать цены на ведущих маркетплейсах России только для одного региона – Москва и Московская область. Выполняйте анализ и контролируйте цены Ваших конкурентов сразу в системе 1С.

2400 1608 руб.

29.05.2023    6652    25    37    

15

Выгрузка для АВИТО

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 Россия Платные (руб)

Выгрузка товаров услуг из 1С для сайта "Авито" раздел "Автозагрузка" выполнена в виде обработки. Обработка подходит для конфигураций УТ, УНФ и Розница. Данная обработка позволяет создавать шаблон с объявлениями для "Авито" - "Автозагрузка".

4200 руб.

07.06.2022    15341    42    56    

37
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4709 20.11.14 19:39 Сейчас в теме
Эхх... Опередил меня... Ну ладно, всё в дело, всё в копилку. Правда, я предпочитаю работать через HTTPRequest, и активно использую XPath.
2. angernaughts 128 21.11.14 12:47 Сейчас в теме
(1) Yashazz, Поделись. Я сам не так давно влез в это дело: появилась задача, начал гуглить, рыл, копал, нашел только про парсинг с браузером на форме. Случайно наткнулся на комментарий про DOM и решил поглядеть, что это. Для таких же, как я и написал эту статейку. Хотя бы вкратце опиши свой подход.
4. cool.vlad4 2 22.11.14 03:35 Сейчас в теме
(2) angernaughts, просто ради интереса. а сколько времени у вас ушло на написание этого парсера? и второй вопрос: сколько времени уйдет на починку парсера (примерно), в случае если изменится дизайн на сайте, т.е. поменяются теги и т.п.?
6. Yashazz 4709 22.11.14 20:11 Сейчас в теме
(2) angernaughts, (4) cool.vlad4, не раньше начала декабря. Ну или могу совсем куски кода вывалить. Парсинг с браузером вообще не катит ввиду совсем устаревшего встроенного браузера, и ввиду того, что многие сайты такие заходы считают ботами и банят. Могу самое общее сюды выложить. Сделать?

Достраиваю до валидного игрищами с DOM, копирую-импортирую узлы, нормализую... Всякие извраты чисто средствами 1С, и прокатывает. XPath нормально пашет.

Картинки читаю GET-запросом. Структуру, если меняется, реадаптирую за 10-15 минут, давеча тренировался на парочке порносайтов)))
9. Bublik2011 9 24.11.14 17:18 Сейчас в теме
(2) angernaughts, у меня тоже "захотелось" ДокументХТМЛ распарсить с помощью XPATH , который дает преимущества при парсинге. Но рассматривать HTML верстку как MXL мне не удалось, пришлось поступить еще проще и без многочисленных итераций поиска по DOM элементам.

http://forum.infostart.ru/forum24/topic114816/message1242204/#message1242204

В этом-же посте ссылка на софт и описание
36. user1052625 15.05.20 17:59 Сейчас в теме
(2)
(34)
появляется потребность изучать сторонние технологии, но если мы не развиваемся - значит мы деградируем)


Есть ли какой то новый парсер - прогрессивный? Сейчас стоит очень большая нужда в чем то подобном! Под ключ.
3. cool.vlad4 2 22.11.14 03:31 Сейчас в теме
(1) Yashazz, любопытно, а чем достраиваешь html до валидного xml в 1С? не в 1С я знаю библиотек вагон и маленькую тележку. ну и часть из них я использую.
5. Поручик 4670 22.11.14 18:27 Сейчас в теме
(0) Загружать картинки можно без com-объектов. Даже нужно. http://forum.aeroion.ru/topic749.html
angernaughts; ZOMI; BigB; +3 Ответить
7. V_V_V 22.11.14 23:06 Сейчас в теме
Уж сильно заточено под конкретный сайт... Структуру которого тоже, как справедливо было замечено, никто не мешает изменить в любое удобное для владельца время...
Но тем не менее работа проделана большая, плюс не жалко. Как учебный материал статья отличная.
8. Поручик 4670 24.11.14 09:01 Сейчас в теме
(7) Универсальный парсер для любого сайта сделать невозможно. Можно сделать только разбор структуры, которая ничего не даст с практической точки зрения.
rpgshnik; Boudybuilder; +2 Ответить
27. Boudybuilder 35 05.01.15 01:31 Сейчас в теме
(8) Поручик, вы правы! Действительно, были ко мне такие вопросы, чтобы сделать универсальный парсер с настройками. Но не получается. Но, если разбирать детальную страницу товара , а не парсить весь сайт целиком , то можно. Например у меня парсер есть где я могу почти под любой сайт настроить загрузку изображений ,детального описания или строки поиска.
10. monsta 58 24.11.14 19:51 Сейчас в теме
А на каком сервисе картинка публикации сделана? Со звездой которая...
11. angernaughts 128 25.11.14 10:23 Сейчас в теме
(10) monsta, https://tagul.com/
(4) cool.vlad4, я имею некоторые знания в верстке сайта, поэтому база, на которой я строил парсер уже была. За пару часов накатал. Статью дольше писал. А починить парсер, да вообще не проблема. У такого типа сайтов вряд ли часто изменяется дизайн (хтмл-код), поэтому, вряд ли придется часто допиливать.
(5) Поручик, да, спасибо, мой метод - просто как костыль.
12. karpik666 3760 25.11.14 10:56 Сейчас в теме
Подскажите, как получить через httpСоединение страницу, по пути без явного указания типа страницы, например, если взять инфостарт, то здесь "https://infostart.ru/public/314045/" по нему невозможно получить страницу с помощью запроса, пишет, что такая страница не найдена.
13. Поручик 4670 25.11.14 11:29 Сейчас в теме
(12) Я же функцию выше дал. С помощью неё я дёргаю с некоего сайта страницы для разбора на части и картинки для записи в базу.
karpik666; +1 Ответить
14. angernaughts 128 25.11.14 11:39 Сейчас в теме
(12) karpik666, Скорее всего, здесь идет переадресация. В теле полученного файла или в куки посмотри, там должны быть какие-то намеки. Очень хорошо расписано по ссылке в комментарии (5), там даже есть разбор такой ситуации.
15. monsta 58 26.11.14 21:13 Сейчас в теме
Метод неплохой - может выручить по-быстрому
Если работать плотнее то все эти кудрявые Если ЭлементTD.ИмяКласса = "item" лучше уместить в одну строку в XDTO или CSS селекторах
32. TheProW 23.05.16 11:38 Сейчас в теме
{Обработка.Обработка1.Форма.Форма.Форма(15)}: Значение не является значением объектного типа (Получить)
Соединение.Получить(Каталог, ИмяФайла);
16. Sykoku 101 27.11.14 12:21 Сейчас в теме
Изобретатели самокатов...

Вся надежда построена на том, что страницы генерируются со статическими классами тегов. Как только кто-то что-то поменяет (например, просто обновит движок сайта) - пишем заново. Про вход с паролем на сайт и прохождение капчи я вообще молчу...

Своровать описание товаров с сайта можно и быстрее и проще. Но не в 1С.
17. angernaughts 128 27.11.14 13:05 Сейчас в теме
(16) Sykoku, а в 1С всегда так - где-нибудь что-нибудь обновили - переписывай.
Если вы хотите парсить развлекательные сайты, где куча всяких навороченных фич - эта статья не для вас. А для разбора товаров с сайта поставщика - весьма неплохо.
18. Sykoku 101 27.11.14 13:52 Сейчас в теме
(17) angernaughts,

"Парсить сайт поставщика" - это что, для поиска товаров и их описания?! - Даже комментировать не буду...
20. angernaughts 128 27.11.14 15:00 Сейчас в теме
(18) Sykoku, читайте хотя бы часть текста публикации перед комментированием.
21. monsta 58 27.11.14 19:31 Сейчас в теме
(18) Sykoku, а почему не будете комментировать? И как бы хорошо заявлять, что api использовать правильнее чем скрапинг - ну покажите нам его на brass.ru тогда пожалуйста. Про то что "не на 1С" это сделать проще - это понятно. Зацените как это можно сделать на 1С!
19. Elisy 948 27.11.14 14:25 Сейчас в теме
Может, кому-то пригодится опыт по аналогичному решению, но без привязки к конкретному веб-сайту
http://infostart.ru/public/261354/
rpgshnik; monsta; +2 Ответить
22. monsta 58 27.11.14 19:32 Сейчас в теме
Поддержу (19) там все посерьезнее конечно.
23. NOVOPRO 11.12.14 08:01 Сейчас в теме
Выдает глюк при выполнение процедуры и не получается в итоге с ней работать............
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Сервер = "www.brass.ru";
КаталогЗагрузки = "C:/1c82/brass";
Соединение = Новый HTTPСоединение(Сервер);
24. angernaughts 128 11.12.14 14:59 Сейчас в теме
26. monsta 58 17.12.14 21:30 Сейчас в теме
Им отвечаешь что-то в стиле (24), а тебе опять "срочно почините работа встала!!!" и опять тишина....
25. monsta 58 17.12.14 21:30 Сейчас в теме
Классическое описание проблемы пользователем, лол.
28. kolp821 15.05.15 15:13 Сейчас в теме
Не могу понять этот кусок кода, помогите разобраться

Н = 1;
Пока Н 1000 Тогда
Прервать;
КонецЕсли;
Н = Н + 1;
КонецЦикла;
29. karpik666 3760 15.05.15 15:41 Сейчас в теме
(28) kolp821, А что понимать, код видимо не верен, в принципе должно быть так
Н = 1; 
Пока Истина Цикл
Если Н > 1000 Тогда 
Прервать; 
КонецЕсли; 
Н = Н + 1; 
КонецЦикла;
Показать
30. s_uu 22 08.08.15 13:43 Сейчас в теме
На управляемых формах не открывается!
31. Maximuss 01.03.16 18:29 Сейчас в теме
33. echo77 1868 22.02.17 16:06 Сейчас в теме
Что делать, если в HTML-документе есть скрипт, который выполняется после загрузки страницы и достраивает ее содержимое?
rpgshnik; +1 Ответить
34. angernaughts 128 22.02.17 22:22 Сейчас в теме
(33) Сейчас уже есть куча новых технологий, позволяющих делать все лучше и быстрее. Самый правильный выход здесь - создать прослойку с помощью другого программного обеспечения, которое бы парсило и сводило данные с разных источников к одному формату, который скармливался бы конфиге. Для ситуации, описанной в вашем вопросе, лучше всего подошел бы парсер на nodejs. Конечно, появляется потребность изучать сторонние технологии, но если мы не развиваемся - значит мы деградируем)
Gang031; rpgshnik; echo77; +3 Ответить
35. AlexandrSmith 68 08.10.19 21:50 Сейчас в теме
Немного добавлю, что по умолчанию используется IE версии машины с которой отправляется запрос, а следовательно, у большинства Хром и Мозила, а IE плохо с ошибками может отображать и парсить страницы. Может и вообще не загрузить страницу выкинуть ошибку.
Alex1053669; +1 Ответить
37. user1477624 14.10.20 20:03 Сейчас в теме
Во все эти подробности можно не вдаваться. Есть куча специализированных сервисов этого направления. Мы часто тестим подобные ресурсы парсинга, пока нам нравится Allrival. Не требует написания кода, за тебя все сделают программисты, внесут нужные тебе коррективы.. Все быстро, удобно, и за небольшую цену.
Оставьте свое сообщение