2015-10-11 11 views
11

Ich möchte die gesamten Bytes, die von meinem Python-Skript heruntergeladen und hochgeladen wurden, protokollieren.Python Requests/urllib - Überwachung der Bandbreitennutzung

Der obige Code berücksichtigt nicht HTTP-Komprimierung (wenn ich richtig bin) und die Größe der Header.

Gibt es eine Möglichkeit, die insgesamt hochgeladenen und heruntergeladenen Bytes aus einer requests.session zu zählen? Wenn nicht, was ist mit einer scriptweiten Zählung?

Antwort

4

Sie können auf das Objekt r.request zugreifen, um ausgehende Bytes zu berechnen, und Sie können eingehende Bytes (komprimiert oder nicht) ermitteln, indem Sie die Kopfzeile für die eingehende Anforderung betrachten. Dies sollte für 99% aller Anfragen ausreichen, die Sie normalerweise machen würden.

Das Berechnen der Byte-Größe von Headern ist einfach genug; fügen Sie einfach auf Schlüssel und Wert lenghts, fügen Sie 4 Bytes für den Doppelpunkt und Leerzeichen, plus 2 weitere für die leere Zeile:

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

Es gibt auch die anfängliche Linie; das ist {method} {path_url} HTTP/1.1{CRLF} für Anfragen und HTTP/1.x {status_code} {reason}{CRLF} für die Antwort. Diese Längen stehen Ihnen auch zur Verfügung.

Gesamtgröße ist dann:

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

Wow, das sieht viel komplexer für etwas einfach. Danke für die Antwort! – Elmo

+1

@Elmo: Das Respone-Objekt ist eine High-Level-Modellierung von HTTP-Informationen, und es war nie ein Anwendungsfall, die zugrunde liegenden HTTP-Protokoll-Bytes vollständig zu rekonstruieren. –

+0

Kannst du nicht irgendwo tiefer haken? Der eigentliche TCP-Stream oder irgendwo? – Elmo