Hoe kan jy 'n kop HTTP-versoek te stuur in Python 2?
-
01-07-2019 - |
Vra
Wat ek probeer om hier te doen is kry die kop van 'n gegewe URL sodat ek kan die MIME-tipe te bepaal. Ek wil in staat wees om te sien of http://somedomain/foo/
'n beeld 'n JPEG byvoorbeeld HTML dokument of sal terugkeer. So, ek moet uitvind hoe om 'n HEAD-versoek te stuur sodat ek die MIME-tipe kan lees sonder om die inhoud te laai. Is daar iemand weet van 'n maklike manier om dit te doen?
Oplossing
wysig : Hierdie antwoord werk, maar deesdae moet jy net gebruik die versoeke biblioteek soos genoem deur ander antwoorde hieronder.
Gebruik 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')]
Daar is ook 'n getheader(name)
om 'n spesifieke kop kry.
Ander wenke
urllib2 gebruik kan word om 'n HEAD-versoek uit te voer. Dit is 'n bietjie mooier as die gebruik van httplib sedert urllib2 ontleed die URL vir jou in plaas van wat jy aan die URL verdeel in gasheer naam en die pad.
>>> import urllib2
>>> class HeadRequest(urllib2.Request):
... def get_method(self):
... return "HEAD"
...
>>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))
Headers is beskikbaar via response.info () as tevore. Interessant genoeg, kan jy die URL wat jy getrek het om uit te vind:
>>> print response.geturl()
http://www.google.com.au/index.html
Verpligtend Requests
manier:
import requests
resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers
Ek glo die Versoeke biblioteek asook moet genoem word.
Just:
import urllib2
request = urllib2.Request('http://localhost:8080')
request.get_method = lambda : 'HEAD'
response = urllib2.urlopen(request)
response.info().gettype()
Edit: Ek het net gekom om te besef daar is httplib2: D
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'
...
Vir volledigheid 'n Python3 antwoord gelykstaande aan die aanvaarde antwoord het met behulp van httplib .
Dit is basies dieselfde kode net dat die biblioteek nie genoem httplib nie maar 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)
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
As 'n eenkant, by die gebruik van die httplib (ten minste op 2.5.2), probeer om die reaksie van 'n HEAD-versoek sal blok (op read line) en daarna versuim lees. As jy nie lees op die reaksie uit te reik, nie in staat is om 'n ander versoek op die verband te stuur jy is, sal jy nodig het om 'n nuwe een oop te maak. Of aanvaar 'n lang vertraging tussen versoeke.
Ek het gevind dat httplib is effens vinniger as urllib2. Ek snel twee programme - een met behulp van httplib en die ander met behulp van urllib2 - stuur HEAD versoeke om 10.000 URL. Die httplib een was vinniger deur 'n paar minute. httplib se totale statistieke was soos volg: real 6m21.334s gebruiker 0m2.124s sys 0m16.372s
en urllib2 se totale statistieke was soos volg: real 9m1.380s gebruiker 0m16.666s sys 0m28.565s
Het enige iemand het anders insette op hierdie?
En nog 'n benadering (soortgelyk aan Pawel antwoord):
import urllib2
import types
request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)
Net om te verhoed dat ongeleide metodes by byvoorbeeld vlak.
Waarskynlik makliker. Gebruik urllib of urllib2
>>> import urllib
>>> f = urllib.urlopen('http://google.com')
>>> f.info().gettype()
'text/html'
f.info () is 'n woordeboek-agtige voorwerp, sodat jy kan doen f.info () [ 'inhoud-tipe "], ens.
http://docs.python.org/library/urllib.html
http://docs.python.org/library/urllib2.html
http://docs.python.org/library/httplib.html
Die dokumente daarop dat httplib is nie normaalweg direk gebruik.