Urllib2.urlopen timeout работает только при подключении к Интернету

Я работаю над кодом Python 2.7 для чтения значения с HTML-страницы с помощью библиотеки urllib2. Я хочу тайм-аут функция urllib2.urlopen через 5 секунд в случае отсутствия Интернета и переход к оставшемуся коду.

Оно работает, как и ожидалось, когда компьютер подключен к рабочему интернет-соединению. И для тестирования, если я установил timeout=0.1, время ожидания внезапно истекло без открытия URL-адреса, как и ожидалось. Но когда нет интернета, тайм-аут не работает либо я установил тайм-аут на 0,1, 5 или любое другое значение. Просто не истекло время ожидания.

Это мой код:

import urllib2
url = "https://alfahd.witorbit.net/fingerprint.php?n"
try:
    response = urllib2.urlopen(url , timeout=5).read()
    print response 
except Exception as e:
    print e

Результат при подключении к Интернету со значением таймаута 5:

180

Результат при подключении к Интернету со значением таймаута 0,1:

<urlopen error timed out>

Кажется, тайм-аут работает.

Результат, когда НЕТ подключен к Интернету и с любым значением тайм-аута (он истекает примерно через 40 секунд каждый раз, когда я открываю URL-адрес, несмотря на любое значение, которое я установил для timeout=:

<urlopen error [Errno -3] Temporary failure in name resolution>

Как можно отключить urllib2.urlopen по таймауту при отсутствии подключения к Интернету? Я что-то пропустил? Пожалуйста, помогите мне решить эту проблему. Спасибо!

Сбой в разрешении имен происходит до запроса, поэтому я предполагаю, что разрешение имен не является предметом тайм-аута. Вы можете избежать этого, вручную разрешив имя в его IP-адрес в файле /etc/hosts. Тогда ваш тайм-аут должен вести себя так, как ожидалось.

sytech 26.03.2018 21:41

Я открыл «sudo nano / etc / hosts» теперь, как я могу добавить имя к IP в etc / hosts, например, для моего данного URL-адреса? что мне писать в этом файле?

Tehseen 27.03.2018 09:20

Вы пишете новую строку в файле, который начинается с IP-адреса хоста. Затем табуляция (или другой пробел), затем имя (а) хоста, которое вы хотите разрешить для этого IP-адреса. например 10.10.10.10 alfahd.witorbit.net (замена 10.10.... фактическим IP). См. этот вопрос из ask ubuntu.

sytech 27.03.2018 14:24

Да, это решение сработало для меня. Большое спасибо..!

Tehseen 28.03.2018 13:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
188
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку разрешение имени происходит до того, как запрос будет сделан, он не зависит от тайм-аута. Вы можете предотвратить эту ошибку в разрешении имен, указав IP-адрес хоста в вашем файле /etc/hosts. Например, если хост - subdomain.example.com, а IP - 10.10.10.10, вы должны добавить следующую строку в файл /etc/hosts

10.10.10.10    subdomain.example.com

В качестве альтернативы вы можете просто использовать IP-адрес напрямую, однако некоторые веб-серверы требуют, чтобы вы использовали имя хоста, и в этом случае вам нужно будет изменить файл hosts, чтобы использовать имя в автономном режиме.

Другие вопросы по теме