2015-10-11 51 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圧縮(適切な場合)とヘッダーのサイズは考慮されていません。

アップロードされたバイトとダウンロードされたバイトの合計をrequests.sessionから数える方法はありますか?そうでない場合は、スクリプト全体のカウントはどうですか?

答えて

4

r.requestオブジェクトにアクセスして送信バイトを計算することができ、着信要求のヘッダーであるcontent-lengthを調べることで、受信バイト(圧縮されているかどうか)を判断できます。これは通常行うすべての要求の99%で十分です。

ヘッダーのバイトサイズを計算するだけで十分です。ただ、キーと値lenghtsを足しコロンと空白のために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

関連する問題