¿Cómo puedo desenlazar una URL?

Quiero poder tomar una URL acortada o no acortada y devolver su forma no acortada. ¿Cómo puedo hacer un progtwig de python para hacer esto?

Aclaración adicional:

  • Caso 1: acortado -> sin acortar
  • Caso 2: sin acortar -> sin acortar

por ejemplo, bit.ly/silly en la matriz de entrada debe ser google.com en la matriz de salida
por ejemplo, google.com en la matriz de entrada debe ser google.com en la matriz de salida

Envíe una solicitud HTTP HEAD a la URL y observe el código de respuesta. Si el código es 30x, mira el encabezado de la Location para obtener la URL sin acortar. De lo contrario, si el código es 20x, la URL no se redirige; Probablemente también quiera manejar los códigos de error (4xx y 5xx) de alguna manera. Por ejemplo:

 # This is for Py2k. For Py3k, use http.client and urllib.parse instead, and # use // instead of / for the division 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 

Usando peticiones:

 import requests session = requests.Session() # so connections are recycled resp = session.head(url, allow_redirects=True) print(resp.url) 

Unshorten.me tiene una api que le permite enviar una solicitud JSON o XML y obtener la URL completa devuelta.

Abra la url y vea a qué se resuelve:

 >>> import urllib2 >>> a = urllib2.urlopen('http://bit.ly/cXEInp') >>> print a.url http://www.flickr.com/photos/26432908@N00/346615997/sizes/l/ >>> a = urllib2.urlopen('http://google.com') >>> print a.url http://www.google.com/ 

http://github.com/stef/urlclean

 sudo pip install urlclean urlclean.unshorten(url) 

Aquí un código src que tiene en cuenta casi todos los casos de esquina útiles:

  • establecer un tiempo de espera personalizado.
  • establecer un agente de usuario personalizado.
  • Compruebe si tenemos que utilizar una conexión http o https.
  • resuelve recursivamente la url de entrada y evita que termine dentro de un bucle

El código src está en github @ https://github.com/amirkrifa/UnShortenUrl

Los comentarios son bienvenidos …

 import logging logging.basicConfig(level=logging.DEBUG) TIMEOUT = 10 class UnShortenUrl: def process(self, url, previous_url=None): logging.info('Init url: %s'%url) import urlparse import httplib try: parsed = urlparse.urlparse(url) if parsed.scheme == 'https': h = httplib.HTTPSConnection(parsed.netloc, timeout=TIMEOUT) else: h = httplib.HTTPConnection(parsed.netloc, timeout=TIMEOUT) resource = parsed.path if parsed.query != "": resource += "?" + parsed.query try: h.request('HEAD', resource, headers={'User-Agent': 'curl/7.38.0'} } ) response = h.getresponse() except: import traceback traceback.print_exec() return url logging.info('Response status: %d'%response.status) if response.status/100 == 3 and response.getheader('Location'): red_url = response.getheader('Location') logging.info('Red, previous: %s, %s'%(red_url, previous_url)) if red_url == previous_url: return red_url return self.process(red_url, previous_url=url) else: return url except: import traceback traceback.print_exc() return None 

Para abreviar, puedes usar peticiones. Esta es una solución simple que funciona para mí.

 import requests url = "http://foo.com" site = requests.get(url) print(site.url)