2015-10-11 3 views
11

Я хочу записать все байты, загруженные и загруженные моим скриптом Python.Python Requests/urllib - мониторинг использования полосы пропускания

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? Если нет, то как насчет подсчета скриптов?

ответ

4

Вы можете получить доступ к объекту 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 
+0

Вау, это выглядит путь комплекс для чего-то простого. Спасибо за ответ! – Elmo

+1

@Elmo: объект respone - это высокоуровневое моделирование HTTP-информации, и никогда не было необходимости полностью восстанавливать байт протокола HTTP. –

+0

Можете ли вы не зацепить куда-нибудь глубже? Фактический поток tcp или где-нибудь? – Elmo

Смежные вопросы