Frage

Ist urllib2 die ganze Seite zu holen, wenn ein urlopen Anruf getätigt wird?

Ich möchte nur die HTTP-Antwort-Header lesen, ohne die Seite zu bekommen. Es sieht aus wie urllib2 die Verbindung HTTP öffnet und dann wird anschließend die eigentliche HTML-Seite ... oder ist es startet nur die Seite mit dem urlopen Anruf Pufferung?

import urllib2
myurl = 'http://www.kidsidebyside.org/2009/05/come-and-draw-the-circle-of-unity-with-us/'
page = urllib2.urlopen(myurl) // open connection, get headers

html = page.readlines()  // stream page
War es hilfreich?

Lösung

Mit der response.info() Methode, um die Header zu erhalten.

Von der urllib2 docs :

  

urllib2.urlopen (url [, data] [, timeout])

     

...

     

Diese Funktion gibt ein dateiähnliche Objekt mit zwei zusätzlichen Methoden:

     
      
  • geturl () - Gibt die URL der Ressource abgerufen, häufig verwendet, um festzustellen, ob eine Umleitung gefolgt
  •   
  • info () - gibt die Meta-Informationen auf der Seite, wie Überschriften, in Form einer httplib.HTTPMessage Instanz (siehe Kurzreferenz zu HTTP-Header)
  •   

Also, für Ihr Beispiel, versuchen Sie durch das Ergebnis von response.info().headers Schritt für das, was Sie suchen.

den wichtigsten Vorbehalt Hinweis zur Verwendung von httplib.HTTPMessage wird in Python Ausgabe dokumentiert 4773 .

Andere Tipps

Was ist eine HEAD-Anfrage anstelle einer normalen GET-Anfrage zu senden. Die snipped folgend (kopiert von einer ähnlichen Frage ) tut genau das.

>>> 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')]

Eigentlich scheint es, dass urllib2 eine HTTP HEAD-Anforderung zu tun.

Die Frage dieser @reto verbunden, oben, zeigt, wie urllib2 bekommt eine HEAD-Anfrage zu tun.

Hier ist mein nehmen auf sie:

import urllib2

# Derive from Request class and override get_method to allow a HEAD request.
class HeadRequest(urllib2.Request):
    def get_method(self):
        return "HEAD"

myurl = 'http://bit.ly/doFeT'
request = HeadRequest(myurl)

try:
    response = urllib2.urlopen(request)
    response_headers = response.info()

    # This will just display all the dictionary key-value pairs.  Replace this
    # line with something useful.
    response_headers.dict

except urllib2.HTTPError, e:
    # Prints the HTTP Status code of the response but only if there was a 
    # problem.
    print ("Error code: %s" % e.code)

Wenn Sie dies überprüfen, mit so etwas wie Wireshark Netzwerkprotokoll analazer, können Sie sehen, dass es tatsächlich eine HEAD-Anfrage aussenden wird, sondern als ein GET.

Dies ist die HTTP-Anforderung und Antwort vom Code oben, wie gefangen von Wireshark:

  

HEAD / doFeT HTTP / 1.1
Accept-Encoding: Identität
Host:   bit.ly
Anschluss: close to User-Agent: Python-urllib / 2.7

     

HTTP / 1.1 301 Moved
Server: nginx
Datum: Sun, 19. Februar 2012   13.20.56 GMT
Content-Type: text / html; charset = utf-8
  Cache-control: privat; max-age = 90
Ort:    http://www.kidsidebyside.org/?p=445
MIME- Version: 1.0
  Content-Length: 127
Anschluss: close to Set-Cookie:   _bit = 4f40f738-00153-02ed0-421cf10a; domain = .bit.ly; expires = Fr 17. August 2012 13.20.56; path = /; Httponly

Wie jedoch in einen der Kommentare in der anderen Frage erwähnt, ob die URL in Frage eine Umleitung enthält dann urllib2 eine GET-Anforderung an das Ziel tun, kein HEAD. Dies könnte ein großes Manko, wenn man wirklich nur wollte HEAD-Anfragen machen.

Die Anforderung oben beinhaltet eine Umleitung. Hier Anforderung an das Ziel, wie gefangen von Wireshark:

  

GET / 2009/05 / come-and-Draw-the-circle-of-Einheit-mit-uns / HTTP / 1.1
  Accept-Encoding: Identität
Host: www.kidsidebyside.org
  Anschluss: close to User-Agent: Python-urllib / 2.7

Eine alternative urllib2 zu verwenden ist Joe Gregorio httplib2 zu verwenden Bibliothek:

import httplib2

url = "http://bit.ly/doFeT"
http_interface = httplib2.Http()

try:
    response, content = http_interface.request(url, method="HEAD")
    print ("Response status: %d - %s" % (response.status, response.reason))

    # This will just display all the dictionary key-value pairs.  Replace this
    # line with something useful.
    response.__dict__

except httplib2.ServerNotFoundError, e:
    print (e.message)

Dies hat den Vorteil von HEAD-Anfragen unter Verwendung sowohl für die erste HTTP-Anforderung und die umgeleiteten Anfrage an die Ziel-URL.

Hier ist die erste Anfrage:

  

HEAD / doFeT HTTP / 1.1
Host: bit.ly
accept-encoding: gzip,   
User-Agent abzulassen: Python-httplib2 / 0.7.2 (gzip)

Hier ist die zweite Anforderung, an das Ziel:

  

HEAD / 2009/05 / come-and-Draw-the-circle-of-Einheit-mit-uns / HTTP / 1.1
  Host: www.kidsidebyside.org
accept-encoding: gzip, deflate
  User-Agent: Python-httplib2 / 0.7.2 (gzip)

urllib2.urlopen hat ein HTTP-GET (oder POST, wenn Sie ein Datum Argument liefern), keine HTTP HEAD (wenn es das letzteres tut, kann man nicht tun oder andere Leseleitungen Zugriffe auf die Seite Körper, natürlich).

Einzeiler:

$ python -c "import urllib2; print urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)).open(urllib2.Request('http://google.com'))"
def _GetHtmlPage(self, addr):
  headers = { 'User-Agent' : self.userAgent,
            '  Cookie' : self.cookies}

  req = urllib2.Request(addr)
  response = urllib2.urlopen(req)

  print "ResponseInfo="
  print response.info()

  resultsHtml = unicode(response.read(), self.encoding)
  return resultsHtml  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top