Часто при попытке спарсить данные с сайта через HTTPСоединение разработчики сталкиваются с тем, что вместо ожидаемого контента скачивается лишь пустая «обертка» с JavaScript-кодом. Это происходит потому, что сайт загружает данные асинхронно после полной отрисовки страницы в браузере. Давайте разберем, как преодолеть эту проблему и получить доступ к содержимому.
Первая причина, по которой сервер может отдавать «пустую» страницу или капчу — это подозрение, что запрос выполняет бот. Серверы часто проверяют заголовок User-Agent, чтобы убедиться, что запрос пришел от реального браузера, а не из программного кода 1С. Рассмотрим пример, как передать правильные заголовки в 1С:
Процедура УстановкаЗаголовковВHTTPЗапросеИз1С()
Соединение = Новый HTTPСоединение("mysite.ru", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Заголовки = Новый Соответствие;
Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36");
Заголовки.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
Запрос = Новый HTTPЗапрос("/path/to/page", Заголовки);
Ответ = Соединение.Получить(Запрос);
КонецПроцедуры
Важно понимать, что User-Agent — это идентификатор вашего «браузера». Использование актуальной строки (как в примере выше) помогает имитировать поведение популярных обозревателей, таких как Chrome или Firefox, что зачастую снимает базовые блокировки.
Если подмена заголовков не помогла, значит, данные подгружаются через AJAX-запросы. Чтобы найти, откуда именно сайт берет информацию, выполним следующие действия:
Скопировав URL и заголовки такого запроса, мы сможем обращаться напрямую к API сайта из 1С, минуя сложный парсинг HTML.
Если данные защищены сложными механизмами (например, Cloudflare), обычными HTTP-запросами их не получить. В таких случаях нам поможет полноценный рендеринг страницы:
ПолеHTMLДокумента использует движок WebView2. Мы можем программно «пробросить» ссылку в этот элемент и дождаться события ДокументСформирован.Никогда не используйте жесткие задержки через Пауза или цикл ожидания. Если вы используете ПолеHTMLДокумента, лучше реализовать проверку через цикл с выходом по условию, когда нужный HTML-блок (например, getElementById) станет доступен в объектной модели документа. Это сделает ваш код надежным и быстрым.
Помните, что сервер может блокировать запросы, если они идут слишком часто, поэтому для масштабных задач лучше использовать прокси-серверы или делать паузы между обращениями к ресурсу.