2017-09-29 1 views
0

J'ai trouvé ce code et il m'a semblé fiable et efficace mais malheureusement c'est pour python2 et il utilise aussi urllib2 alors que tout le monde dit que les requêtes sont plus rapides. Quel serait le code équivalent de ce qui suit (ou quelque chose de plus efficace ou plus fiable) dans python 3?Python - le moyen le plus efficace d'obtenir une requête en python 3

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import sys 
import urllib2 

# This script uses HEAD requests (with fallback in case of 405) 
# to follow the redirect path up to the real URL 
# (c) 2012 Filippo Valsorda - FiloSottile 
# Released under the GPL license 

class HeadRequest(urllib2.Request): 
    def get_method(self): 
     return "HEAD" 

class HEADRedirectHandler(urllib2.HTTPRedirectHandler): 
    """ 
    Subclass the HTTPRedirectHandler to make it use our 
    HeadRequest also on the redirected URL 
    """ 
    def redirect_request(self, req, fp, code, msg, headers, newurl): 
     if code in (301, 302, 303, 307): 
      newurl = newurl.replace(' ', '%20') 
      newheaders = dict((k,v) for k,v in req.headers.items() 
           if k.lower() not in ("content-length", "content-type")) 
      return HeadRequest(newurl, 
           headers=newheaders, 
           origin_req_host=req.get_origin_req_host(), 
           unverifiable=True) 
     else: 
      raise urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp) 

class HTTPMethodFallback(urllib2.BaseHandler): 
    """ 
    Fallback to GET if HEAD is not allowed (405 HTTP error) 
    """ 
    def http_error_405(self, req, fp, code, msg, headers): 
     fp.read() 
     fp.close() 

     newheaders = dict((k,v) for k,v in req.headers.items() 
          if k.lower() not in ("content-length", "content-type")) 
     return self.parent.open(urllib2.Request(req.get_full_url(), 
             headers=newheaders, 
             origin_req_host=req.get_origin_req_host(), 
             unverifiable=True)) 

# Build our opener 
opener = urllib2.OpenerDirector() 
for handler in [urllib2.HTTPHandler, urllib2.HTTPDefaultErrorHandler, 
       HTTPMethodFallback, HEADRedirectHandler, 
       urllib2.HTTPErrorProcessor, urllib2.HTTPSHandler]: 
    opener.add_handler(handler()) 

response = opener.open(HeadRequest(sys.argv[1])) 

print(response.geturl()) 

D'ailleurs la demande de tête n'est pas vraiment ce dont j'ai besoin. Je veux seulement savoir si le lien est cassé (dans certains sites si vous leur donnez un code cassé ils vous redirigeront vers la page principale du site et je veux que mon code le reconnaisse aussi) et la requête de tête est la plus efficace solution qui me vient à l'esprit pour cela, donc si vous connaissez une meilleure façon, j'apprécierais aussi cela.

+0

On ne va traduire votre code. Commencez par vous-même et si vous avez une question * spécifique *, vous pouvez le demander ici. –

Répondre

1

Jetez un oeil à Demandes: http://docs.python-requests.org/en/master/

Pour faire une demande tête, vous allez simplement:

import requests 

r=requests.head('http://www.example.com') 

Ensuite, vous pouvez accéder à l'objet de ce que vous avez besoin. Par exemple, le code d'état:

print r.status_code 

Mise à jour: Si vous êtes désireux de vérifier si une page est en direct, vous aurez envie de faire une demande GET. J'ai vu des cas de HEAD demandes de retour une réponse 200 et sur la même URL, un GET demande un retour 500