it-swarm.com.de

Wie senden Sie eine HEAD HTTP-Anfrage in Python 2?

Ich versuche hier, die Header einer bestimmten URL abzurufen, damit ich den MIME-Typ bestimmen kann. Ich möchte in der Lage sein zu sehen, ob http://somedomain/foo/ gibt beispielsweise ein HTML-Dokument oder ein JPEG-Bild zurück. Daher muss ich herausfinden, wie eine HEAD) - Anforderung gesendet werden muss, damit ich den MIME-Typ lesen kann, ohne den Inhalt herunterladen zu müssen. Kennt jemand eine einfache Möglichkeit, dies zu tun?

108
fuentesjr

edit : Diese Antwort funktioniert, aber heutzutage sollten Sie nur die Anfragen Bibliothek verwenden, wie in den anderen Antworten unten erwähnt.


Verwenden Sie httplib .

>>> import httplib
>>> conn = httplib.HTTPConnection("www.google.com")
>>> conn.request("HEAD", "/index.html")
>>> res = conn.getresponse()
>>> print res.status, res.reason
200 OK
>>> print res.getheaders()
[('content-length', '0'), ('expires', '-1'), ('server', 'gws'), ('cache-control', 'private, max-age=0'), ('date', 'Sat, 20 Sep 2008 06:43:36 GMT'), ('content-type', 'text/html; charset=ISO-8859-1')]

Es gibt auch eine getheader(name), um einen bestimmten Header zu erhalten.

104
Eevee

rllib2 kann verwendet werden, um eine HEAD=) - Anfrage auszuführen. Dies ist ein bisschen netter als die Verwendung von httplib, da urllib2 die URL für Sie analysiert, anstatt Sie zu zwingen, die URL zu teilen Hostname und Pfad.

>>> import urllib2
>>> class HeadRequest(urllib2.Request):
...     def get_method(self):
...         return "HEAD"
... 
>>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))

Header sind wie bisher über response.info () verfügbar. Interessanterweise finden Sie die URL, zu der Sie weitergeleitet wurden:

>>> print response.geturl()
http://www.google.com.au/index.html
107
doshea

Obligatorisch Requests Weg:

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
61
K Z

Ich glaube, die Requests Bibliothek sollte ebenfalls erwähnt werden.

36
daliusd

Gerade:

import urllib2
request = urllib2.Request('http://localhost:8080')
request.get_method = lambda : 'HEAD'

response = urllib2.urlopen(request)
response.info().gettype()

Edit: Ich habe gerade gemerkt, dass es httplib2: D gibt

import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert resp[0]['status'] == 200
assert resp[0]['content-type'] == 'text/html'
...

Linktext

16
Paweł Prażak

Der Vollständigkeit halber muss eine Python3-Antwort mit httplib der akzeptierten Antwort entsprechen.

Es ist im Grunde derselbe Code, nur dass die Bibliothek nicht mehr httplib heißt, sondern http.client

from http.client import HTTPConnection

conn = HTTPConnection('www.google.com')
conn.request('HEAD', '/index.html')
res = conn.getresponse()

print(res.status, res.reason)
8
import httplib
import urlparse

def unshorten_url(url):
    parsed = urlparse.urlparse(url)
    h = httplib.HTTPConnection(parsed.netloc)
    h.request('HEAD', parsed.path)
    response = h.getresponse()
    if response.status/100 == 3 and response.getheader('Location'):
        return response.getheader('Location')
    else:
        return url
2
Pranay Agarwal

Ich habe festgestellt, dass httplib etwas schneller als urllib2 ist. Ich habe zwei Programme zeitlich festgelegt - eines mit httplib und das andere mit urllib2 - und habe HEAD Anforderungen an 10.000 URLs gesendet. Das httplib war einige Minuten schneller. httplib 's total Die Statistiken lauteten: real 6m21.334s user 0m2.124s sys 0m16.372s

Und rllib2s Gesamtstatistik lautete: real 9m1.380s user 0m16.666s sys 0m28.565s

Hat sonst noch jemand einen Beitrag dazu?

1
IgorGanapolsky

Wenn Sie die httplib (mindestens unter 2.5.2) verwenden, blockiert der Versuch, die Antwort einer HEAD) -Anforderung zu lesen (in der Readline) und schlägt anschließend fehl Wenn Sie die Antwort lesen, können Sie keine weitere Anforderung für die Verbindung senden, müssen Sie eine neue öffnen oder eine lange Verzögerung zwischen den Anforderungen akzeptieren.

1
Nope

Und noch ein Ansatz (ähnlich wie bei Pawel):

import urllib2
import types

request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)

Nur um unbegrenzte Methoden auf Instanzebene zu vermeiden.

0
estani