Подтвердить что ты не робот

Запросы Python/urllib - мониторинг использования полосы пропускания

Я хочу записать все байты, загруженные и загруженные моим Python script.

total_downloaded_bytes = 0
def bandwidth_hook(r, *args, **kwargs):
    global total_downloaded_bytes
    total_downloaded_bytes += len(r.content)
req = requests.session()
req.hooks = {'response': bandwidth_hook}

В приведенном выше коде не учитывается сжатие HTTP (если я прав) и размер заголовков.

Есть ли способ подсчитать общее количество загруженных и загруженных байтов из request.session? Если нет, как насчет подсчета script -wide?

4b9b3361

Ответ 1

Вы можете получить доступ к объекту r.request для расчета исходящих байтов, и вы можете определить входящие байты (сжатые или нет), просмотрев заголовок content-length для входящего запроса. Этого достаточно для 99% всех запросов, которые вы обычно делаете.

Вычисление размера байтов заголовков достаточно просто; просто добавьте ключевые и значения длины, добавьте 4 байта для двоеточия и пробелов, плюс еще 2 для пустой строки:

 def header_size(headers):
     return sum(len(key) + len(value) + 4 for key, value in headers.items()) + 2

Существует также начальная строка; что {method} {path_url} HTTP/1.1{CRLF} для запросов и HTTP/1.x {status_code} {reason}{CRLF} для ответа. Эти длины также доступны для вас.

Общий размер:

 request_line_size = len(r.request.method) + len(r.request.path_url) + 12
 request_size = request_line_size + header_size(r.request.headers) + int(r.request.headers.get('content-length', 0))
 response_line_size = len(r.response.reason) + 15
 response_size = response_line_size + header_size(r.headers) + int(r.headers.get('content-length', 0))
 total_size = request_size + response_size