Httplib bekommt nicht alle Umleitungscodes

Ich versuche, die endgültige URL einer Seite zu bekommen, die mehr als einmal umzuleiten scheint. Versuchen Sie diese Beispiel-URL in Ihrem Browser und vergleichen Sie sie mit der endgültigen URL am unteren Rand meines Code-Snippets:

Link, der mehr als einmal umleitet

Und hier ist der Testcode, den ich ausgeführt habe, bemerke die endgültige URL, die einen Code von 200 bekommt, ist nicht der gleiche wie der in deinem Browser. Was sind meine Optionen?

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) [GCC 4.5.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import httplib >>> from urlparse import urlparse >>> url = 'http://www.usmc.mil/units/hqmc/' >>> host = urlparse(url)[1] >>> req = ''.join(urlparse(url)[2:5]) >>> conn = httplib.HTTPConnection(host) >>> conn.request('HEAD', req) >>> resp = conn.getresponse() >>> print resp.status 301 >>> print resp.msg.dict['location'] http://www.marines.mil/units/hqmc/ >>> url = 'http://www.marines.mil/units/hqmc/' >>> host = urlparse(url)[1] >>> req = ''.join(urlparse(url)[2:5]) >>> conn = httplib.HTTPConnection(host) >>> conn.request('HEAD', req) >>> resp = conn.getresponse() >>> print resp.status 302 >>> print resp.msg.dict['location'] http://www.marines.mil/units/hqmc/default.aspx >>> url = 'http://www.marines.mil/units/hqmc/default.aspx' >>> host = urlparse(url)[1] >>> req = ''.join(urlparse(url)[2:5]) >>> conn = httplib.HTTPConnection(host) >>> conn.request('HEAD', req) >>> resp = conn.getresponse() >>> print resp.status 200 >>> print resp.msg.dict['location'] Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'location' >>> print url http://www.marines.mil/units/hqmc/default.aspx //THIS URL DOES NOT RETURN A 200 IN ANY BROWSER I HAVE TRIED 

2 Solutions collect form web for “Httplib bekommt nicht alle Umleitungscodes”

Sie können versuchen, Ihren User-Agent-Header auf den User-Agent Ihres Browsers zu setzen.

Ps: urllib2 leitet automatisch um

BEARBEITEN:

 In [2]: import urllib2 In [3]: resp = urllib2.urlopen('http://www.usmc.mil/units/hqmc/') In [4]: resp.geturl() Out[4]: 'http://www.marines.mil/units/hqmc/default.aspx 

Sie können HttpLib2 verwenden , um den tatsächlichen Standort einer URL zu erhalten:

 import httplib2 def getContentLocation(link): h = httplib2.Http(".cache_httplib") h.follow_all_redirects = True resp = h.request(link, "GET")[0] contentLocation = resp['content-location'] return contentLocation if __name__ == '__main__': link = 'http://podcast.at/podcast_url344476.html' print getContentLocation(link) 

Die Ausführung sieht so aus:

 $ python2.7 getContentLocation.py http://keyinvest.podcaster.de/8uhr30.rss 

Beachten Sie, dass dieses Beispiel auch das Caching verwendet (was weder von urllib noch von httplib unterstützt wird). So läuft das immer wieder deutlich schneller. Das könnte für das Crawling / Schaben interessant sein. Wenn Sie kein Zwischenspeichern wünschen, ersetzen Sie h = httplib2.Http(".cache_httplib") mit h = httplib2.Http() .

  • HTTPS-Verbindung Python
  • Selen 2.53.5 httplib.BadStatusLine: '' Python
  • So behandeln Sie mehrere Set-Cookie-Header in HTTP-Antwort
  • Permanent 'Temporary Misserfolg in Namensauflösung' nach laufen für eine Reihe von Stunden
  • Python urllib vs httplib?
  • Python httplib / urllib erhalten Dateiname
  • Ich möchte HDFS REST AIP anrufen, um eine Datei hochzuladen
  • Sende diese Anfrage mit Python httplib
  • Exchange Web Services (EWS) - Exchange 2010 Seifenaufrufe über Suds
  • Httplib CannotSendRequest Fehler in WSGI
  • Tunneling httplib Durch einen Proxy
  • Python ist die beste Programmiersprache der Welt.