Самый простой парсинг и обработка веб-страниц в 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 клиент поле документа

См. также

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

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

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15661    9    17    

9

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

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

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

22656 руб.

25.05.2021    12809    30    8    

10

Интеграция 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    17429    6    15    

13

[Расширение] БОР-Навигатор.Культура

Зарплата Бюджетный учет WEB-интеграция Обмен с ГосИС Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Расширение конфигурации, включающее в себя объекты, необходимые для подготовки и сдачи отчета "Штатная численность" системы "БОР-Навигатор.Культура" в программе "1С:Зарплата и кадры государственного учреждения", редакция 3.1.

8400 руб.

01.02.2019    25687    9    0    

7

Интеграция с сервисом vetmanager

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

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

12000 руб.

02.02.2021    16260    41    49    

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

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

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

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

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

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

Советую прочитать https://infostart.ru/1c/articles/1196479/ - как раз по теме получения "сырья" для парсинга, коротко и понятно обо всех вариантах.
Forest_Owl; YPermitin; +2 Ответить
10. пользователь 07.08.20 17:29
(9) спасибо, яркий человек :)
11. Yashazz 4707 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 1678 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 117 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 3031 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 277 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 938 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 Сейчас в теме
Оставьте свое сообщение