To, co próbuję tutaj zrobić, to uzyskać nagłówki podanego adresu URL, aby móc określić typ MIME. Chcę mieć możliwość sprawdzenia, czy http://somedomain/foo/
na przykład zwróci dokument HTML lub obraz JPEG. Dlatego muszę dowiedzieć się, jak wysłać żądanie HEAD, aby móc odczytać typ MIME bez konieczności pobierania zawartości. Czy ktoś zna łatwy sposób na zrobienie tego?
python
python-2.7
http
http-headers
content-type
fuentesjr
źródło
źródło
urlparse
pod ręką, o czym świadczą odpowiedzi o niższej randze.httplib
została zmieniona nahttp.client
.requests
nie jest dostarczany domyślnie z Pythonem.urllib2 może służyć do wykonywania żądania HEAD. Jest to trochę przyjemniejsze niż użycie httplib, ponieważ urllib2 analizuje adres URL za Ciebie, zamiast wymagać podzielenia adresu URL na nazwę hosta i ścieżkę.
Nagłówki są dostępne przez response.info (), jak poprzednio. Co ciekawe, możesz znaleźć adres URL, na który zostałeś przekierowany:
źródło
httplib.HTTPConnection
, która nie obsługuje przekierowań automatycznie.Obowiązkowy
Requests
sposób:źródło
Uważam, że należy również wspomnieć o bibliotece Requests .
źródło
allow_redirects
może wyłączyć tylko przekierowania POST / PUT / DELETE. Przykład: żądanie nagłówka bez przekierowaniaWłaśnie:
Edycja: właśnie zdałem sobie sprawę, że istnieje httplib2: D
tekst linku
źródło
request
. (Mianowicie, to zadziała, ale to zły styl i jeśli chcesz go użyćself
- ciężko.)Aby uzyskać kompletność, odpowiedź w Pythonie3 jest równoważna zaakceptowanej odpowiedzi przy użyciu protokołu httplib .
To jest w zasadzie taki sam kod tylko że biblioteka nie jest nazywany httplib już jednak http.client
źródło
źródło
import
? +1 dlaurlparse
- razem zhttplib
nimi dają wygodęurllib2
, gdy mamy do czynienia z adresami URL po stronie wejściowej.Nawiasem mówiąc, podczas korzystania z httplib (przynajmniej w wersji 2.5.2), próba odczytania odpowiedzi na żądanie HEAD zostanie zablokowana (w readline), a następnie zakończy się niepowodzeniem. Jeśli nie odczytasz odpowiedzi, nie możesz wysłać kolejnego żądania na połączeniu, będziesz musiał otworzyć nowe. Lub zaakceptuj duże opóźnienie między żądaniami.
źródło
Zauważyłem, że httplib jest nieco szybszy niż urllib2. Zsynchronizowałem dwa programy - jeden używający httplib, a drugi urllib2 - wysyłający żądania HEAD do 10000 adresów URL. Protokół httplib był szybszy o kilka minut. httplib „s łączne statystyki były: real 6m21.334s 0m2.124s użytkownik SYS 0m16.372s
A łączne statystyki urllib2 to: real 9m1.380s użytkownik 0m16.666s sys 0m28.565s
Czy ktoś ma w tej sprawie jakiś wkład?
źródło
I jeszcze inne podejście (podobne do odpowiedzi Pawła):
Tylko po to, by uniknąć nieograniczonych metod na poziomie instancji.
źródło
Prawdopodobnie łatwiej: użyj urllib lub urllib2.
f.info () jest obiektem podobnym do słownika, więc możesz wykonać f.info () ['content-type'] itd.
http://docs.python.org/library/urllib.html
http://docs.python.org/library/urllib2.html
http://docs.python.org/library/httplib.html
Dokumentacja zauważa, że httplib nie jest zwykle używany bezpośrednio.
źródło