Как распарсить данные сайта, находящиеся внутри тега script?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике интеграции 1С с веб-ресурсами мы часто сталкиваемся с задачей парсинга данных. Классический подход подразумевает получение HTML-кода страницы и поиск в нем нужных значений внутри тегов (например, <div>, <span> или <table>). Однако современные веб-технологии (React, Vue, Angular) изменили структуру страниц. Теперь при выполнении GET-запроса мы часто получаем полупустой HTML, в котором нет таблиц с ценами или списками товаров, но есть массивные блоки кода внутри тега <script>.

В этой статье мы подробно разберем, как извлечь полезную информацию из таких контейнеров, проанализируем, почему не стоит использовать методы "в лоб" (например, распознавание с экрана), и рассмотрим современные способы получения данных непосредственно из кода страницы средствами 1С.

Постановка задачи: данные внутри Script

Когда мы пытаемся получить содержимое страницы через HTTPСоединение, мы видим исходный код, который отдал сервер. В современных Single Page Applications (SPA) данные часто "гидратируются" (Hydration) на клиенте. Это значит, что сервер отдает JSON-объект, присвоенный какой-то переменной JavaScript прямо внутри HTML, а браузер уже потом строит из этого красивую верстку.

Типичный пример того, что мы видим в коде:


<script>
    window.__INITIAL_STATE__ = { "products": [ { "id": 1, "name": "Товар", "price": 100 } ... ] };
</script>

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

Стратегия 1: Прямое извлечение JSON из текста (Парсинг текста)

Это самый быстрый и легковесный способ, не требующий запуска браузера. Поскольку 1С отлично умеет работать с JSON, наша задача сводится к тому, чтобы "вырезать" нужный кусок текста из HTML и скормить его объекту ЧтениеJSON.

Шаг 1. Получение HTML

Выполняем стандартный запрос:


Соединение = Новый HTTPСоединение("example.com", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/catalog");
Ответ = Соединение.Получить(Запрос);
ТекстHTML = Ответ.ПолучитьТелоКакСтроку();

Шаг 2. Поиск данных регулярным выражением

Данные внутри <script> обычно начинаются с уникального идентификатора переменной. Например, window.__INITIAL_STATE__ =. Мы можем использовать COM-объект VBScript.RegExp для точного поиска.


Регулярка = Новый COMОбъект("VBScript.RegExp");
Регулярка.Global = Истина;
Регулярка.IgnoreCase = Истина;
// Ищем текст, начинающийся с переменной и заканчивающийся закрывающей скобкой или точкой с запятой
Регулярка.Pattern = "window\.__INITIAL_STATE__\s*=\s*(\{.*?\});";

Matches = Регулярка.Execute(ТекстHTML);
Если Matches.Count > 0 Тогда
    СтрокаJSON = Matches.Item(0).SubMatches.Item(0);
КонецЕсли;

Шаг 3. Чтение JSON

Полученную строку теперь можно легко преобразовать в Структуру или Соответствие 1С:


Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();

// Теперь мы можем обращаться к данным напрямую
Цена = Данные.products[0].price;

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

Стратегия 2: Анализ внутреннего API (Reverse Engineering)

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

Чтобы найти источник данных, выполним следующие действия в браузере:

  1. Откроем инструменты разработчика (F12).
  2. Перейдем на вкладку Network (Сеть).
  3. Выберем фильтр Fetch/XHR.
  4. Перезагрузим страницу сайта.
  5. Найдем в списке запросов тот, который возвращает нужные нам данные (обычно это JSON-файл).

Часто оказывается, что данные можно получить простым GET-запросом к адресу вида api.example.com/v1/products. В 1С это реализуется так же просто, как и получение HTML, но в ответе мы сразу получаем готовый JSON.

Важно: Для успешного запроса к скрытому API часто требуется передавать правильные заголовки (User-Agent, Referer, Cookie), которые можно подсмотреть там же, во вкладке Network.

Стратегия 3: Использование эмуляции браузера (Selenium / WebDriver)

Если данные в скрипте зашифрованы или формируются сложной логикой JS, которую невозможно воспроизвести в 1С, нам поможет подход, упомянутый в теме — использование инструментов тестирования, таких как Selenium.

Selenium позволяет запустить настоящий браузер (Chrome, Firefox) под управлением программы. Схема работы будет следующей:

  1. 1С запускает WebDriver (обычно через внешнюю компоненту или скрипт на Python/C#, вызываемый из 1С).
  2. Браузер загружает страницу и выполняет все скрипты.
  3. Мы обращаемся к DOM-модели уже загруженной страницы или выполняем свой JS-код в контексте страницы.

Пример логики (псевдокод):


// Команда драйверу выполнить JS на странице и вернуть результат
Результат = Драйвер.ExecuteScript("return window.__INITIAL_STATE__;");

Этот метод гарантированно вернет данные, так как скрипты сайта уже отработали. Однако он имеет существенные недостатки: это медленно (нужно ждать загрузку графики) и ресурсоемко.

Стратегия 4: Почему не стоит использовать AutoIt и OCR

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

  1. Нестабильность: Любое изменение разрешения экрана, шрифта на сайте, появление всплывающего баннера или изменение верстки приведет к поломке алгоритма.
  2. Низкая скорость: Эмуляция действий пользователя (скролл, клики) занимает секунды или даже минуты на одну страницу. API или парсинг HTML делают это за миллисекунды.
  3. Сложность поддержки: Поддерживать скрипты, зависящие от координат пикселей на экране, крайне трудоемко.
  4. Однопоточность: Такой бот занимает рабочую станцию целиком (нельзя свернуть окно), что делает невозможным параллельный запуск.

Рекомендации по защите от блокировок

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

Заключение

Если вы видите данные на экране, но не находите их в HTML-тегах, в 99% случаев они лежат внутри блока <script> в формате JSON или подгружаются отдельным запросом. Наиболее эффективный путь решения для 1С-программиста — это:

  1. Попробовать найти API-запрос через Developer Tools.
  2. Если API закрыт — распарсить текст скрипта с помощью регулярных выражений.
  3. Только в крайнем случае использовать тяжеловесную эмуляцию браузера (Selenium).
← На главную