Самый простой парсинг и обработка веб-страниц в 1С

07.08.20

Интеграция - WEB-интеграция

Рассмотрим самый простой парсинг веб-страниц средствами платформы 1С и еще некоторые полезные приемы работы с веб-страницами.

Простой, примитивный

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

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

Рассмотрим пару простых примеров и немного коснемся ограничений.

Большие ограничения

Данный материал не подойдет, если Вы решаете следующие задачи:

  • Получение и обработка данных на сервере регламентным заданием или любым другим.
  • Обработка очень большого массива данных.
  • Пытаетесь парсингом заменить работу через API из-за его отсутствия или недоступности.
  • Вам нужен надежный способ получения данных.

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

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

Однако, иногда выхода нет. Да и использование предлагаемого подхода можно считать этичным в каком-то плане, потому что создаем всего лишь помощника работы с браузером и автоматизируем действия пользователя на веб-странице. Хотя это вопрос "холиварный".

В чем плюсы

Все очень просто:

  • Использование поля HTML-документа выполняется полностью на клиенте и не требует серверных мощностей.
  • Выполняется полноценная работа с веб-страницей. Например, если выполнять получение данных веб-страницы с помощью HTTP-запросов, то не всегда можно получить привычную, готовую страницу, т.к. ее содержимое может зависеть от выполняемых JavaScript-скриптов и дополнительных действий.
  • Из второго плюса также можно выделить более простую работу с веб-приложением. Например, для прохождения формы аутентификации не обязательно изучать какие запросы выполняются на сервер и как выполнять обработку ответа. Вместо этого в самом браузере мы вставим значения логина и пароля в форму и просто программно нажмем кнопку "Вход".

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

Далее рассмотрим пару простых примеров. Решать использовать ли такие способы для решения задач только Вам.

Добрались до примера

Два небольших примера. От простейшего к сложному (ну, почти).

Просто получаем данные

А начнем мы с простого примера по парсингу площадки Яндекс.Маркет. Да, конечно, можно было сделать пример намного проще, но тут мы сразу рассмотрим основные способы работы с HTML-документов. Давным-давно, много лет назад, что-то подобное я выкладывал в разработке "Парсер товаров Яндекс.Маркет", но обработка сейчас уже не актуальна и больше служит примером работы с HTML-документов. Код там не лучшего качества :)

Когда мы закончим реализацию примера, то получим следующее.

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

Первое что нам нужно сделать - это добавить на форму поле HTML-документа и основные реквизиты для хранения данных.

 
 Настраиваем форму

Теперь настало время кода! При создании формы установим URL по умолчанию.

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ВебСтраница = "https://market.yandex.ru";
	
КонецПроцедуры

#КонецОбласти

Это позволит при открытии сразу же открывать нужный ресурс. Далее реализуем обработчики команд "Начать парсинг" и "Остановить парсинг".

#Область ОбработчикиКоманд

&НаКлиенте
Процедура НачатьПарсинг(Команда = Неопределено)
	
	ТекущаяОперация = "ПарсингТоваров";
	
	ИнформацияОТоварах.Очистить();
	НомерТекущейСтраницы = ИзвлечьНомерСтраницы();
	
	ПолученыДанные = ВыполнитьПарсингДанных();
	Если ПолученыДанные Тогда
		ВебСтраница = СформироватьАдресСледующейСтраницы();		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОстановитьПарсинг(Команда = Неопределено)
	
	ТекущаяОперация = "НеАктивно"
	
КонецПроцедуры

#КонецОбласти

С командой "ОстановитьПарсинг" все понятно: мы просто устанавливаем имя текущей операции на "НеАктивно", чтобы парсинг не продолжался автоматически. Команда "НачатьПарсинг" устанавливаем имя текущей операции на "ПарсингТоваров" и начинает заново заполнять таблицу с данными (наименование и ссылка на товар). При этом из текущего адреса получаем номер страницы с товарами, который сохраняется в клиентской переменной модуля формы.

#Область ОписаниеПеременных

&НаКлиенте
Перем НомерТекущейСтраницы;

#КонецОбласти

Номер страницы нужен для автоматического переключения на следующие вовремя парсинга. Сам номер страницы хранится в адресной строке в виде параметра "page". Если не указан, то это первая страница.

Если данные парсинга были успешно получены, то переходим на следующую страницу с товарами и так до бесконечности. Ну, пока есть данные. Реализация бесконечного перехода по страницам достигается через событие "ДокументСформирован" поля HTML-документа. Вот такой обработчик событий был для этого сделан:

#Область ОбработчикиСобытийЭлементовФормы

&НаКлиенте
Процедура ВебСтраницаДокументСформирован(Элемент)
	
	Если ТекущаяОперация = "ПарсингТоваров" Тогда
		
		ПолученыДанные = ВыполнитьПарсингДанных();
		
		Если ПолученыДанные Тогда
			НомерТекущейСтраницы = ИзвлечьНомерСтраницы();
			ВебСтраница = СформироватьАдресСледующейСтраницы();
		Иначе
			ОстановитьПарсинг();	
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

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

Далее рассмотрим служебные процедуры работы с адресом и парсингом.

 
 Извлечение номера страницы из адреса
 
 Формируем адрес следующей страницы

А теперь перейдем к более сложной части - извлечению данных со страницы.

 
 Парсинг данных

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

Конечно, данное решение не идеальное, т.к. не учитывает множества факторов и вариантов страниц Я.Маркета, но мы этого и не пытались сделать. Это лишь простейший пример для понимания как это можно реализовать. Готовой обработки не выкладываю специально, потому что если разобраться самостоятельно, то это будет намного полезней.

Проходим авторизацию

Пример парсинга мы рассмотрели, но бывают ситуации сложнее. Например, перед парсингом может понадобиться пройти аутентификацию на сайте. Например, на сайте releases.1C.ru для просмотра списка релизов, даже те, которые недоступны, необходимо пройти аутентификацию. Конечно, можно использовать HTTP-запросы, проанализировать как именно нужно эти запросы сделать и все это поведение эмулировать. А можно пройти аутентификации с помощью поля HTML-документа, не погружаясь на низкий уровень запросов.

Например, для прохождения аутентификации на том же сайте с релизами достаточно использовать такой код:

&НаКлиенте
Процедура ВходНаСайтРелизов(Команда)
	
	Логин = "<Ваш логин>";
	Пароль = "<Ваш пароль>";
	
	// Внешний объект документа из поля HTML-документа
	document = Элементы.ВебСтраница.Документ;
	
	// Устанавливаем логин и пароль в поля ввода
	document.querySelector("#username").value = Логин;
	document.querySelector("#password").value = Пароль;
	
	// Нажимакм на кнопку "Войти"
	document.querySelector("#loginButton").click();
	
КонецПроцедуры

В режиме 1С:Предприятие выглядит это вот так.

Все просто как никогда и никаких HTTP-Запросов. Все что нужно - это получить CSS-селекторы, получить доступ к соответствующим элементам на странице, а дальше заполнить поля и нажать на кнопку "Войти". Далее можно парсить, но все на Вашей ответственности! :)

Парсинг это плохо

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

Все примеры здесь даны лишь в демонстрационных целях. Любое использование информации только на Вашу ответственность.

Ниже добавил ссылки на интересные и более глубокие публикации по этой теме. Если Вас интересует использование JavaScript в связке с 1С, то там Вы найдете отличные материалы для изучения этой темы.

Удачи в делах и отличного настроения!

Другие ссылки

Авторские разработки

 
 Другие разработки (8 штук, бесплатные и за $m)

парсинг web html клиент поле документа

См. также

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

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

5040 руб.

04.05.2021    19003    10    16    

17

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

Подсистема интеграции Amo CRM с 1С: технические требования, порядок работы, возможности, доработки и обновления. Бесплатный период техподдержки - 1 месяц.

60000 руб.

07.05.2019    31873    62    40    

23

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

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

36000 руб.

03.08.2020    16748    15    19    

15

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

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    17000    45    49    

26

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13372    36    8    

15
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. BairamovTM 07.08.20 09:13 Сейчас в теме
Юрий отличная статья, как всегда написано в простой и понятной форме, однозначный плюс.
Было бы интересно еще узнать какие есть ограничения в работе у HTML-документа по сравнению с обычной работой в браузере, надеюсь увидеть в ваших будущих статьях.
botokash; YPermitin; +2 Ответить
2. пользователь 07.08.20 09:35
(1) спасибо!

Подумаю над этим. Но информацию подобную можно найти в публикациях, список которых в конце статьи.
12. Yashazz 4761 07.08.20 20:01 Сейчас в теме
(1) Ну, "работа HTML-документа" это слишком обще сказано. Есть ограничения по части деклараций и вообще допустимости некоторых блоков в head, есть ограничения на пространства имён, есть иногда проблемы с хаотично раскиданными кусками скриптов по коду (как это любит делать битрикс) и кстати с DHTML-ными фишками. Джумловое что-то, например, плоховато обрабатывается. Есть несколько ограничений на значения, возвращаемые функциями скриптов или получаемые в свойствах методов (1С их приводит к строке, иногда уродует). Есть ограничения с кодировкой, но это решается через 2 функции перекодирования (а не как мучились 10 лет назад). Есть в скриптах некоторые трудности (и в объектной модели, и в обещаниях, и в случае js-функций как переменных). Глобальные переменные js не работают и вообще глобальный контекст теряется. Ну и традиционно стык между 1С и хтмл для всего, кроме потоков, требует внимания. Всё, пожалуй.

А вот с DOM-моделью, и с трансляцией обычной разметки в подходящие объекты 1С (хмл или хтмл) проблем не замечено.
3. Ibrogim 1319 07.08.20 12:09 Сейчас в теме
получается практически Selenium и vebdriver
YPermitin; +1 Ответить
5. пользователь 07.08.20 12:26
(3) что-то вроде этого.

Я нашел еще способ использовать веб-клиент, хоть и не 1Сный, на стороне сервера.
Там не все просто, но можно теоретически и об этом написать или примеры дать.
Не знаю на сколько это нужно вообще коллегам.
7. Fox-trot 161 07.08.20 15:28 Сейчас в теме
слишком узковато для практического применения, так что вряд ли оно кому-то надо
YPermitin; +1 Ответить
4. bulpi 216 07.08.20 12:12 Сейчас в теме
Очень интересно . Вот бы еще дать примеры по таким методам :
"Можно явно указывать путь через элементы DOM, можно пытаться парсить страницу с помощью объекта ДокументDOM"
Я , увы, не знаю, как это сделать. И думаю, я не один такой.
YPermitin; +1 Ответить
6. пользователь 07.08.20 12:26
(4) А примеры все в конце публикации, набор ссылок "Другие ссылки".
По DOM вот коллега хорошо описал https://infostart.ru/public/314045/
8. Yashazz 4761 07.08.20 17:18 Сейчас в теме
(4) Советую глянуть https://infostart.ru/public/328533/ как одно из решений, и https://infostart.ru/public/280340/ как способ быстро и удобно искать информацию в DOM.
RustIG; YPermitin; +2 Ответить
9. Yashazz 4761 07.08.20 17:23 Сейчас в теме
А если честно, в этот раз не айс. Потому что получилось ни то, ни сё - ни обзор вариантов, как заявлено, ни пошаговое обучение подробно одному из вариантов, ни готовая разработка.

Описывать же надо совершенно разные вещи: статические или динамические сайты, получение контента, и отдельно просто разбор структурированной информации. А тут всё, особенно для новичка, кучно. Между скачиванием исходника страницы и парсингом есть разница.

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

Советую прочитать https://infostart.ru/1c/articles/1196479/ - как раз по теме получения "сырья" для парсинга, коротко и понятно обо всех вариантах.
Forest_Owl; YPermitin; +2 Ответить
10. пользователь 07.08.20 17:29
(9) спасибо, яркий человек :)
11. Yashazz 4761 07.08.20 18:33 Сейчас в теме
(10) На самом деле тебе спасибо за статьи - иногда наводит на мысль чего-то самому раскопать, ранее некопанное.
YPermitin; +1 Ответить
13. Cyberhawk 135 14.08.20 08:36 Сейчас в теме
14. smirnovserg.s@gmail.com 14.08.20 08:58 Сейчас в теме
Самое большое зло из-за отсутствия АПИ - это получение релизов с сайта releases.1c.ru
Парсинг/авторизация по токенам и прочая головная боль
starik-2005; YPermitin; +2 Ответить
15. пользователь 14.08.20 09:20
16. DrAku1a 1730 15.08.20 16:00 Сейчас в теме
Прочитать со страницы сайта одно какое-то значение:
ТекстHTML = ПолучитьИсходныйТекстСтраницы();
НужнымМнеТекст = ТекстМежду(ТекстHTML, ТекстСлеваОтНужного, ТекстСправаОтНужного);

Функция "ТекстМежду" - использует СтрНайти() для поиска нужного текста, текст слева и справа - уникальный текст со страницы, между которым заключен нужный мне фрагмент.
Получается быстро и экономно по ресурсам, но есть минус: не очень надёжно, т.к. при изменении исходного текста страницы - перестаёт работать (отредактировали шаблон генерируемой страницы и ТекстСлева или ТекстСправа перестал находиться).

Примерно так:
ТекстHTML = ПолучитьИсходныйТекстСтраницы("https://yandex.ru/search/?text=current+time");
ТекстСлева = "yandex.ru/time"" data-counter=""[&quot;b&quot;]"">";
ТекстСправа ="</a>";
ТекВремя = ТекстМежду(ТекстHTML, ТекстСлева, ТекстСправа);
YPermitin; +1 Ответить
17. CyclesOfID 121 20.08.20 16:18 Сейчас в теме
"Парсинг сайтов - это плохо!!"


Другие ссылки:
Парсинг сайтов из 1С на примере ломбарды.рф с помощью XPATH для ДокументDOM

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

Пример парсинга сайта средствами 1С

Парсинг (сканирование) сайта из 1С на примере сайта по криптовалюте....
YPermitin; +1 Ответить
18. пользователь 20.08.20 16:20
19. piton66 2 04.03.21 13:46 Сейчас в теме
А как парсить например такое? На странице кнопка показать телефон. По кнопке открывается окно с телефоном.
20. starik-2005 3060 17.03.21 14:19 Сейчас в теме
(19)
По кнопке открывается окно с телефоном.
Ну так кнопка или дергает запрос, или просто hide=false для элемента делает, в который телефон мутится. Так что или где-то на странице этот телефон есть, или нужно дернуть запрос (авиты и всякие такие сайты). Но спамерам помогать - себя не уважать.
Capitullo; +1 1 Ответить
21. piton66 2 18.03.21 09:23 Сейчас в теме
Сам уже разобрался. Запрос отдельный.
Зачем обзываешься урюк.. я не спамер.
22. Boudybuilder 35 26.04.21 23:01 Сейчас в теме
23. binex 279 01.10.21 00:03 Сейчас в теме
У меня ругается на querySelector - Метод объекта не обнаружен (querySelector)

Как подружить?

	document = Элементы.ХТМЛДокумент.Документ;
	queryResult = document.querySelector("#__APP > div > main");
24. voleg2 09.12.21 14:12 Сейчас в теме
Что то ваш парсинг криво работает. Когда запускаешь, через 8 часов сьедает всю оперативку.
25. voleg2 09.12.21 14:14 Сейчас в теме
"Парсинг сайтов - это плохо!!"


Другие ссылки:
Парсинг сайтов из 1С на примере ломбарды.рф с помощью XPATH для ДокументDOM

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


А как ты собрался парсить если интерактивная Java?
26. пользователь 09.12.21 14:31
(25) Вот поэтому я и перестал писать статьи на ИС и отвечать на комментарии.

>> Что то ваш парсинг криво работает
Ни конкретного вопроса, ни желания самому разбираться что там и как. Почему?

>> А как ты собрался парсить если интерактивная Java?
Мы уже на ты?) И причем тут Java в браузере?

>> "Парсинг сайтов - это плохо!!"
>>Другие ссылки:
>>Парсинг сайтов из 1С на примере ломбарды.рф с помощью XPATH для ДокументDOM
>>Парсинг сайта без использования встроенного браузера для начинающих
И троллинг.

Вот они все комментарии :)

Неужели после таких вопросов ждут люди ответов?

Наверное стоило и дальше игнорировать комментарии. Так что после этого продолжу :D
27. Serginio 940 17.12.21 11:19 Сейчас в теме
Я бы еще оставил свое поделие
https://infostart.ru/1c/articles/466196/

https://infostart.ru/1c/articles/466052/

Учитывая развитие anglesharp https://anglesharp.github.io/ можно использовать JavaScript для формирования HTML
или
Я бы еще добавил Silenium прежде всего как построитель DOM в заскриптованных таблицах http://www.seleniumhq.org/docs/05_selenium_rc.jsp#c

Для того что бы добраться до сформированного DOM можно использовать вместо PageSource
вычисляемый скрипт

http://stackoverflow.com/questions/26584215/selenium-page-source-does-not-return-modified-dom-tree

var pageSource = (string)driver.ExecuteScript("return document.body.outerHTML");
28. user1828764 15.08.22 16:51 Сейчас в теме
Добрый день!
Интересует возможность написания парсера для загрузки данных в 1С.
Вы занимаетесь данным написанием?
29. Pluto 04.11.22 11:08 Сейчас в теме
И всё бы ничего, но данным методом даже не открывается требуемая страница.
При попытке зайти на https://agent.taxcom.ru просто тихо и молча закрывается вся платформа 1С. Без всяких ошибок, сообщений, тупо берёт и закрывается. Вот такое поведение мне честно говоря вообще не понятно.
30. user1888681 25.12.22 20:31 Сейчас в теме
Оставьте свое сообщение