【问题标题】:Python Requests/urllib — monitoring bandwidth usagePython Requests/urllib — 监控带宽使用情况
【发布时间】:2015-10-11 12:22:14
【问题描述】:

我想记录我的 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 中上传和下载的总字节数?如果不是,那么脚本范围的计数呢?

【问题讨论】:

    标签: python python-requests bandwidth


    【解决方案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
    

    【讨论】:

    • 哇,对于简单的事情来说,这看起来太复杂了。感谢您的回答!
    • @Elmo:响应对象是 HTTP 信息的高级建模,它从来都不是完全重构底层 HTTP 协议字节的用例。
    • 你不能更深一点吗?实际的 tcp 流还是某处?
    • @Elmo:您必须修补 urllib3 随附的打包 requests 库,没有 ootb 挂钩。
    猜你喜欢
    • 1970-01-01
    • 2023-01-31
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多