Декодирование текста сжатия Brotli в Python

Brotli — это современный алгоритм сжатия с открытым исходным кодом, разработанный Google и предназначенный для обеспечения более быстрой и эффективной передачи данных через Интернет. Он предлагает превосходную степень сжатия и скорость по сравнению с предыдущими методами, такими как gzip. Несмотря на свою полезность, некоторые библиотеки HTTP-запросов не способны обрабатывать Brotli без дополнительного рассмотрения. В этой статье мы обсудим, как обрабатывать сжатие Brotli с помощью Python и библиотеки запросов.

Краткое введение: обнаружение Бротли в дикой природе

Brotli поддерживается большинством современных веб-браузеров и, конечно же, Chrome, Firefox и Safari. Он был официально предложен в 2016 году в RFC 7932 и с тех пор получил все более широкое распространение, в основном на крупных веб-сайтах, из-за проблем с совместимостью сетей. Он предлагает более высокую степень сжатия и, что самое главное, гораздо более высокую скорость распаковки.

Скорее всего, вы видели Бротли в дикой природе во время просмотра и просто не заметили. Только путем проверки заголовков ответов HTTP-запроса можно обнаружить серверы, использующие Brotli. Заголовок Content-Encoding: br— это то, что сообщает клиенту (браузеру), что сервер (веб-сайт) обслуживает контент (загружает страницы) с использованием стандарта сжатия Brotli.

Те, кто занимается парсингом веб-страниц, скорее всего, сначала заметят Бротли при визуальном осмотре компонента content HTTP-ответа и найдут что-то похожее на следующее:

�НВП�^�__ВВ�`�� ����ξb����"]�
�E@2pZ�Fy裬��V��V��V�ņ��Y�bu�ox\u�m�NƖ�,؈��ɉ��S�(��}
^�%S����4�'��R4�9�ƛY
��)��MyL�N�;�������� 2r������F� G/�dy1� �����caϽ�C�r5h� �L@ �#���� HR��//��zv�O�:������bR� ����<%Y�G�
b&3&c,0KW�fş�@sv6M����v�g#�r��ҼR�pzoR'�!�k�_��OO�4-��m��W��Ƙ)�M3g� ��(E����|��kO �
��=��ൿDׇ�uM�=����ύё@�Kf����
'����,�;yB�\�<����õi��9������X�y���t��^��*�y��-@������}� i�9��:�?B�{Wdپ��Ib�2��V}��������/��e��y�/{����[u�K��� �kɷ$SI�]��}`fŒ&����r�0�ؔ������24��24�ƘKA-�J F�yŧ�*.���|q`�c��
p)Кю��D���<����}Zl����~��d3�O�ł������>��q�￑!�w@����F4>��Ɂ� ���d@^�h�D +��%x�d(|��I��Q�g���>4�)��s2�a��w�48�U���� �6�__a@<r@ Vw����u�/}
@$��†W��C�4.�]th��{����̟ٓ��«��]��������]�� �td 34�Н�� ����G >p���뢠��x�?6�F�-ۇ�Q����r��7�8�[nij7�q{����o��W������� �/ �L���MC���x��P�?VLX��|e����V\ҳ�뻧ƅ��l�7�_g���,�Wt�.iYK/� 77/��s3����Ҥе�Ѣ�у�
~����`TEH�'�VA����)1@-v �?c��ʳA1f�E%���PT��Bب��(��ꯁcZ� Rm\l\c��TJ� �LMw*�
�J<ʵ>�L��VF)=RC��&~u�caE�@�L-0����?�EqF5�?

Это все еще декодированная версия текста, и в большинстве случаев она может декодироваться или не декодироваться автоматически многими клиентами, такими как Requests for Python (нет) или Axios для JavaScript/Node (автоматически).

Обработка Brotli в Python с помощью запросов

Brotli в настоящее время находится в серой зоне внедрения, при этом большинство проблем, связанных с поддержкой CDN, происходит медленно. Однако он существует и, вероятно, станет только более распространенным, учитывая значительное улучшение предлагаемой скорости. По всей вероятности, любая широко используемая HTTP-библиотека для любого современного языка в конечном итоге будет поддерживать кодировку Бротли. Однако самая популярная сторонняя HTTP-библиотека Python — запросы — не поддерживает ее «из коробки» по состоянию на 11 ноября 2023 г. Давайте посмотрим на типичный HTTP-запрос на основе запросов через Python:

import requests

# выполняем HTTP запрос
resp = requests.get("https://www.google.com")

# выводим содержимое на экран
print(resp.text)

Скорее всего, resp.text в стандартном выводе оно будет искажено. Это потому, что А.) Google, скорее всего, использует Brotli в качестве Content-Encoding (возможно, в зависимости от вашего географического положения) и Б.) отсутствия встроенной поддержки Brotli через библиотеку запросов Python.

Примечание. Если вы не отправляете запросы с высококачественного IP-адреса с правильными заголовками, Google может ответить ответом reCaptcha типа «Докажи, что ты не робот».

Хотя библиотека запросов не предлагает встроенную поддержку Brotli, исправить это так же просто, как установить другую стороннюю библиотеку, чтобы включить поддержку Brotli. Эту библиотеку можно установить через pip install brotli которую затем будет включено автоматическое декодирование Brotli библиотекой запросов. Это означает, что никаких вызовов функций, никакого импорта, ничего просто используйте запросы так, как вы привыкли, и контент будет волшебным образом декодирован, как и другие типы.

Обсуждение

Я почти не стал писать эту статью, потому что готов поспорить, что встроенная поддержка Brotli рано или поздно найдет свое место в библиотеке запросов. Хотя на данный момент это все еще проблема. Работа с Brotli с точки зрения парсинга веб-страниц довольно тривиальна: если вы заметили Content-Encoding: br отмеченный текст или неожиданно начали получать недекодированный текст, есть вероятность, что вы столкнулись с ответом, закодированным Brotli. Обработка Brotli через ваше приложение, которое доставляет сжатый контент, — это вообще отдельная тема!