2014-07-11 22 views
5

Potrzebuję wykonać żądanie HTTP i określić rozmiar odpowiedzi w bajtach. Zawsze używałem request dla prostych żądań HTTP, ale zastanawiam się, czy mogę to osiągnąć przy użyciu surowca?Rozmiar nieprzetworzonej odpowiedzi w bajtach

Mój jedyny problem to to, że nie rozumiem, co zwraca surowiec lub jak mogę policzyć ten typ danych w bajtach? Czy używanie podejścia request jest prawidłowe?

Odpowiedz

10

Wystarczy wziąć len() treści odpowiedzi:

>>> response = requests.get('https://github.com/') 
>>> len(response.content) 
51671 

Jeśli chcesz zachować strumieniowe, na przykład wtedy, gdy zawartość jest (zbyt) duże można iteracyjne nad kawałkami danych i sumy ich rozmiary:

>>> with requests.get('https://github.com/', stream=True) as response: 
...  size = sum(len(chunk) for chunk in response.iter_content(8196)) 
>>> size 
51671 
+1

Czy to po prostu parsować "Długość treści" lub czy faktycznie mierzy pełną zawartość? Czy plik response.content zawiera nagłówki HTTP? – ewhitt

+1

To nie określa rzeczywistej długości treści. Przynajmniej strona główna Github nie wysyła nagłówka "Długość treści". – BlackJack

+0

Awesome! Bardzo doceniane! – ewhitt

1

r.raw jest wystąpienie urllib3.response.HTTPResponse. Możemy policzyć długość odpowiedzi, wyszukując nagłówek odpowiedzi Content-length lub korzystając z wbudowanej funkcji len().

+2

Tak, ale "Długość treści" nie zawsze jest podana. – ewhitt

+0

@ewhitt: Jeśli nie ma nagłówka "Content-length", nie możesz znać pełnej długości, dopóki nie otrzymasz wszystkich danych. Dostęp do 'r.treść "zmusza problem, który czyta z" surowego "połączenia, aż wszystkie dane zostaną odczytane, budując cały dokument w pamięci. Równie dobrze możesz nie używać 'stream = True' w tym przypadku. –

Powiązane problemy