web-dev-qa-db-fra.com

Existe-t-il un moyen simple de demander une URL dans python et de NE PAS suivre les redirections?

En regardant la source de urllib2, il semble que la façon la plus simple de le faire serait de sous-classer HTTPRedirectHandler puis d'utiliser build_opener pour remplacer le HTTPRedirectHandler par défaut, mais cela semble beaucoup de travail (relativement compliqué) pour faire ce qui semble devoir être assez simple.

75
John

Voici la manière Demandes :

import requests
r = requests.get('http://github.com', allow_redirects=False)
print(r.status_code, r.headers['Location'])
142
Marian

Dive Into Python a un bon chapitre sur la gestion des redirections avec urllib2. Une autre solution est httplib .

>>> import httplib
>>> conn = httplib.HTTPConnection("www.bogosoft.com")
>>> conn.request("GET", "")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
301 Moved Permanently
>>> print r1.getheader('Location')
http://www.bogosoft.com/new/location
34
olt

Il s'agit d'un gestionnaire urllib2 qui ne suivra pas les redirections:

class NoRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        infourl = urllib.addinfourl(fp, headers, req.get_full_url())
        infourl.status = code
        infourl.code = code
        return infourl
    http_error_300 = http_error_302
    http_error_301 = http_error_302
    http_error_303 = http_error_302
    http_error_307 = http_error_302

opener = urllib2.build_opener(NoRedirectHandler())
urllib2.install_opener(opener)
11
Carles Barrobés

je suppose que cela aiderait

from httplib2 import Http
def get_html(uri,num_redirections=0): # put it as 0 for not to follow redirects
conn = Http()
return conn.request(uri,redirections=num_redirections)
8
Ashish

Le mot clé redirections dans le httplib2 la méthode de demande est un hareng rouge. Plutôt que de renvoyer la première demande, il lèvera une exception RedirectLimit s'il reçoit un code d'état de redirection. Pour renvoyer la réponse initiale, vous devez définir follow_redirects à False sur l'objet Http:

import httplib2
h = httplib2.Http()
h.follow_redirects = False
(response, body) = h.request("http://example.com")
7
Ian Mackinnon

J'appuie le pointeur d'Olt sur Plongez dans Python . Voici une implémentation utilisant des gestionnaires de redirection urllib2, plus de travail qu'il ne devrait l'être? Peut-être hausser les épaules.

import sys
import urllib2

class RedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_301(self, req, fp, code, msg, headers):  
        result = urllib2.HTTPRedirectHandler.http_error_301( 
            self, req, fp, code, msg, headers)              
        result.status = code                                 
        raise Exception("Permanent Redirect: %s" % 301)

    def http_error_302(self, req, fp, code, msg, headers):
        result = urllib2.HTTPRedirectHandler.http_error_302(
            self, req, fp, code, msg, headers)              
        result.status = code                                
        raise Exception("Temporary Redirect: %s" % 302)

def main(script_name, url):
   opener = urllib2.build_opener(RedirectHandler)
   urllib2.install_opener(opener)
   print urllib2.urlopen(url).read()

if __== "__main__":
    main(*sys.argv) 
5
Aaron Maenpaa

Le moyen le plus court est cependant

class NoRedirect(urllib2.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, hdrs, newurl):
        pass

noredir_opener = urllib2.build_opener(NoRedirect())
5
Tzury Bar Yochay