关于python:urllib2.urlopen超时仅在连接到Internet时有效

urllib2.urlopen timeout works only when connected to Internet

我正在使用Python 2.7代码通过使用urllib2库从HTML页面读取值。我希望在没有Internet的情况下在5秒后超时urllib2.urlopen函数并跳转到剩余的代码。

当计算机连接到工作的互联网连接时,它按预期工作。如果我设置timeout=0.1进行测试,它会在没有打开网址的情况下突然超时,正如预期的那样。但是当没有Internet时,超时不起作用,我将超时设置为0.1,5或任何其他值。它根本没有超时。

这是我的代码:

1
2
3
4
5
6
7
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

连接到Internet时超时值为5的结果:

1
180

连接到Internet时超时值为0.1的结果:

1
<urlopen error timed out>

似乎超时正在运行。

未连接到Internet并且具有任何超时值时的结果(每次打开url大约40秒后超时,尽管我为timeout=设置了任何值:

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

如果没有Internet连接,我怎么能超时urllib2.urlopen?我错过了什么吗?请指导我解决这个问题。谢谢!


因为名称解析在请求发生之前发生,所以它不受超时限制。 您可以通过在/etc/hosts文件中提供主机的IP来防止名称解析中出现此错误。 例如,如果主机是subdomain.example.com且IP是10.10.10.10,则应在/etc/hosts文件中添加以下行

1
10.10.10.10    subdomain.example.com

或者,您可以直接使用IP地址,但是,某些Web服务器要求您使用主机名,在这种情况下,您需要修改hosts文件以脱机使用该名称。