我想记录我的Python脚本下载和上传的总字节数。
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压缩(如果我是对的)和标题的大小。
有没有办法计算来自requests.session的上传和下载的总字节数?如果没有,那么脚本范围的计数呢?
答案 0 :(得分: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