Как я могу получить URL запроса после ConnectionError? - PullRequest
0 голосов
/ 13 октября 2019

Недавно я пытался создать программу, которая возвращает URL-адрес, по которому сокращенный URL-адрес (такой как URL-адреса bit.ly и t.co) приводит к использованию библиотеки запросов Python. Я смог сделать это легко с рабочими URL-адресами, используя этот метод:

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

Однако, когда сокращенный URL-адрес указывает на ненастоящий URL-адрес (пример: http://thisurldoesnotexistyet.com/), методвыше возвращает ConnectionError, как и ожидалось. ConnectionError возвращает это: 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)'))

Когда это произошло, я попробовал этот метод, чтобы получить URL перенаправления:

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

Однако метод неработа (AttributeError: 'ConnectTimeout' object has no attribute 'host'). Могу ли я получить URL-адрес, на который сокращенный URL-адрес перенаправляет сообщение об ошибке?

1 Ответ

1 голос
/ 13 октября 2019

Вы запрашиваете URL, который не существует . Следовательно, вы получаете тайм-аут.

>>> 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'))

host - это URL, который вы передали. Вы можете перехватить исключение и увидеть тот же URL, который вы передали, но you передал URL на requests.get.

>>> try:
...     requests.get('https://does-not-exist')
... except requests.exceptions.ConnectionError as error:
...     print(error.request.url)
...
https://does-not-exist/
...