Recientemente he intentado crear un programa que devuelva la URL a la que una URL abreviada (como las URL bit.ly y t.co) conduce al uso de la biblioteca Python Requests. Pude hacer esto fácilmente con URL que funcionan usando este método:

reveal = requests.get(shortenedUrl, timeout=5)
fullUrl = reveal.url

Sin embargo, cuando la URL abreviada apunta a una URL que no es real (ejemplo: http://thisurldoesnotexistyet.com/ ), el método anterior devuelve un ConnectionError como se esperaba. ConnectionError devuelve esto: HTTPSConnectionPool(host='thisurldoesnotexistyet.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x00000213DC97F588>, 'Connection to thisurldoesnotexistyet.com timed out. (connect timeout=5)'))

Cuando esto sucedió, probé este método para obtener la URL de redireccionamiento:

try:
    reveal = requests.get(shortenedUrl, timeout=5)
    fullUrl = reveal.url
except requests.exceptions.ConnectionError as error:
    fullUrl = "http://" + error.host

Sin embargo, el método no funcionó (AttributeError: 'ConnectTimeout' object has no attribute 'host'). ¿Hay alguna forma de obtener la URL a la que la URL abreviada redirecciona desde el error?

0
Epacity 13 oct. 2019 a las 01:48

1 respuesta

La mejor respuesta

Está solicitando una URL que no existe. Por lo tanto, obtienes un tiempo de espera.

>>> requests.get('https://does-not-exist')
... (suppressed for clarity)
requests.packages.urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='does-not-exist', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7f6b6dba7210>: Failed to establish a new connection: [Errno -2] Name or service not known'))

El host es la URL que ingresó. Puede detectar la excepción y ver la misma URL que ingresó, pero usted pasó la URL a requests.get.

>>> try:
...     requests.get('https://does-not-exist')
... except requests.exceptions.ConnectionError as error:
...     print(error.request.url)
...
https://does-not-exist/
1
Pedro Rodrigues 12 oct. 2019 a las 23:21