2015-10-11 17 views
11

Voglio registrare i byte totali scaricati e caricati dal mio script Python.Richieste Python/urllib - monitoraggio dell'uso della larghezza di banda

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} 

Il codice precedente non tiene conto della compressione HTTP (se ho ragione) e della dimensione delle intestazioni.

C'è un modo per contare i byte totali caricati e scaricati da un request.session? In caso contrario, per quanto riguarda un conteggio di script?

risposta

4

È possibile accedere all'oggetto r.request per calcolare i byte in uscita e determinare i byte in entrata (compressi o meno) osservando l'intestazione content-length per la richiesta in entrata. Questo dovrebbe essere sufficiente per il 99% di tutte le richieste che normalmente faresti.

Calcolare la dimensione dei byte delle intestazioni è abbastanza semplice; basta aggiungere up di chiavi e valori lunghezze, aggiungere 4 byte per il colon e spazi bianchi, più 2 di più per la riga vuota:

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

C'è anche la linea iniziale; questo è {method} {path_url} HTTP/1.1{CRLF} per le richieste e HTTP/1.x {status_code} {reason}{CRLF} per la risposta. Queste lunghezze sono tutte disponibili anche per te.

dimensione totale è quindi:

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, che sembra complesso modo di qualcosa di semplice. Grazie per la risposta! – Elmo

+1

@Elmo: l'oggetto di risposta è una modellazione di alto livello delle informazioni HTTP e non è mai stato un caso di utilizzo per ricostruire completamente i byte del protocollo HTTP sottostante. –

+0

Non riesci ad agganciare qualche parte più in profondità? Il flusso di Tcp reale o da qualche parte? – Elmo

Problemi correlati