Получение html кода web страницы с помощью http запроса

1. Kudus 15.05.24 23:00 Сейчас в теме
Коллеги, доброго времени суток!
При попытке получить html код веб страницы с помощью http запроса получаю непонятные символы в ответе. В постмане запрос выполняется нормально и в ответе читаемый html текст.

использую такой код для запроса:
       Сервер = "www.wildberries.ru";
	Соединение = Новый HTTPСоединение(Сервер,,,,,, Новый ЗащищенноеСоединениеOpenSSL);
	Запрос = Новый HTTPЗапрос("/catalog/34939243/detail"); 
	Ответ =Соединение.Получить(Запрос);
	Если Ответ.КодСостояния = 200 Тогда 
		Содержимое= Ответ.ПолучитьТелоКакСтроку("UTF8"); 

Ответ с такими вот символами: n� ��}ksǵ�w�
По теме из базы знаний
Найденные решения
4. Kudus 16.05.24 09:31 Сейчас в теме
(2)
Использовал вот такой код:
Содержимое= Ответ.ПолучитьТелоКакДвоичныеДанные(); 		
		
		///////////////////////////////////////////
		
		РазмерПрефиксаGZip = 10;
		РазмерПостфиксаGZip = 8;
		
		ЧтениеДанных = Новый ЧтениеДанных(Содержимое);
		ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
		РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip; 
		
		ПотокZip = Новый ПотокВПамяти(ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD() + ZipРазмерCDH() + ZipРазмерEOCD());
		ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
		ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
		
		ЗаписьДанных.Закрыть();
		ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
		
		CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
		РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
		ЧтениеДанных.Закрыть();
		
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
		ЗаписьДанных.Закрыть();
		
		Каталог = ПолучитьИмяВременногоФайла();
		ЧтениеZip = Новый ЧтениеZipФайла(ПотокZip);
		ИмяФайла = ЧтениеZip.Элементы[0].Имя;
		Попытка
			ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
		Исключение
			// Игнорируем проверку целостности архива, просто читаем результат
			ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		КонецПопытки;
		ЧтениеZip.Закрыть();
		
		Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
		УдалитьФайлы(Каталог); 
		
		Нашрез = Base64Строка(Результат);
Показать
patheticneatness; +1 Ответить
5. laperuz 46 17.05.24 05:17 Сейчас в теме
(4)Так вы читаете файл как Base64, зачем?

Вместо
Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
УдалитьФайлы(Каталог);

Нашрез = Base64Строка(Результат);


Читайте файл Каталог + ПолучитьРазделительПути() + ИмяФайла через ЧтениеТекста

P.S. В 8.3.26 появится нативная поддержка распаковки GZIP и RAR
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. laperuz 46 16.05.24 05:49 Сейчас в теме
Ответ приходит сжатым в gzip.
Платформа не умеет распаковывать ответ в gzip.

identity в Accept-Encoding не сработало, все равно сервер шлет в gzip.

Как вариант - получить тело как двоичные данные, двоичные данные сохранить как zip-архив. Внутри архива будет файл, который содержит в себе несжатые данные.

P.S. сейчас, когда большая часть страницы генерится на лету с помощью JS, особого смысла получать содержимое страницы через httpсоединение нет, там все равно будет пустышка.
3. Kudus 16.05.24 09:30 Сейчас в теме
(2)
Пробовал распаковать как вы описали, ответ получается нормальными латинскими символами, но все равно нечитаемый. Примерно вот так: BodG1sPgo8aHRtbCBsYW5nPSJydSIgdHJhbnNsYXRlPSJubyIg
4. Kudus 16.05.24 09:31 Сейчас в теме
(2)
Использовал вот такой код:
Содержимое= Ответ.ПолучитьТелоКакДвоичныеДанные(); 		
		
		///////////////////////////////////////////
		
		РазмерПрефиксаGZip = 10;
		РазмерПостфиксаGZip = 8;
		
		ЧтениеДанных = Новый ЧтениеДанных(Содержимое);
		ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
		РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip; 
		
		ПотокZip = Новый ПотокВПамяти(ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD() + ZipРазмерCDH() + ZipРазмерEOCD());
		ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
		ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
		
		ЗаписьДанных.Закрыть();
		ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
		
		CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
		РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
		ЧтениеДанных.Закрыть();
		
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
		ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
		ЗаписьДанных.Закрыть();
		
		Каталог = ПолучитьИмяВременногоФайла();
		ЧтениеZip = Новый ЧтениеZipФайла(ПотокZip);
		ИмяФайла = ЧтениеZip.Элементы[0].Имя;
		Попытка
			ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
		Исключение
			// Игнорируем проверку целостности архива, просто читаем результат
			ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
		КонецПопытки;
		ЧтениеZip.Закрыть();
		
		Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
		УдалитьФайлы(Каталог); 
		
		Нашрез = Base64Строка(Результат);
Показать
patheticneatness; +1 Ответить
5. laperuz 46 17.05.24 05:17 Сейчас в теме
(4)Так вы читаете файл как Base64, зачем?

Вместо
Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
УдалитьФайлы(Каталог);

Нашрез = Base64Строка(Результат);


Читайте файл Каталог + ПолучитьРазделительПути() + ИмяФайла через ЧтениеТекста

P.S. В 8.3.26 появится нативная поддержка распаковки GZIP и RAR
6. Kudus 17.05.24 15:19 Сейчас в теме
(5)
Спасибо! Действительно, код исходной страницы я увидеть смог, но как вы и заметили ранее, страница формируется динамически и сразу конечный результат я получить не смог. Не думал я, что так нелегко окажется читать веб страницы, раньше как то не приходилось сталкиваться с задачами такого рода.
7. Kudus 17.05.24 16:33 Сейчас в теме
(5)
нашел способ для получения текста страницы, попроще:

WinHttp = Новый COMОбъект("MSXML2.xmlHttp");
	WinHttp.Open("GET", "https://www.wildberries.ru/catalog/34939243/detail", 0);  
	WinHttp.Send();    
	Если WinHttp.Status = 200 Тогда
		РезультатСтр = WinHttp.ResponseText();     
	КонецЕсли;


Вдруг кому нибудь пригодится.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот