尽管超时,urllib2.urlopen将永远挂起

时间:2013-05-27 12:02:03

标签: python http timeout settimeout urllib2

希望这是一个非常简单的问题,但它让我发疯。 我在ubuntu 12.10服务器的开箱即用安装上使用Python 2.7.3。我一直在研究这个问题,直到我得到这个片段:

import urllib2
x=urllib2.urlopen("http://casacinema.eu/movie-film-Matrix+trilogy+123+streaming-6165.html", timeout=5)

它只是永远挂起,永远不会超时。 我显然做错了什么。有人可以帮忙吗? 非常感谢你!

利玛

3 个答案:

答案 0 :(得分:4)

看起来您遇到了代理问题。以下是如何解决它的一个很好的解释: Trying to access the Internet using urllib2 in Python

我已经使用python 2.7.3在我的ubuntu上执行了你的代码并且没有看到任何错误。

另外,请考虑使用requests

import requests

response = requests.get("http://casacinema.eu/movie-film-Matrix+trilogy+123+streaming-6165.html", timeout=5)
print response.status_code

另见:

答案 1 :(得分:1)

原始海报表示他们不明白为什么会挂起,但他们也希望有办法让urllib.request.urlopen不再挂起。我不能说如何防止它挂起,但如果它有助于某人这就是为什么它可以挂起。

Python-urllib/3.6客户很挑剔。例如,它希望服务器返回HTTP/1.1 200 OK而不是HTTP 200 OK。它还希望服务器在标头中发送connection: close时关闭连接。

诊断此问题的最佳方法是获取服务器响应的原始输出,并将其与您知道的其他服务器响应进行比较。然后,如果您必须创建服务器并操纵响应以确定原因的确切区别。也许,这至少可以导致服务器上的更改并允许它不挂起。

答案 2 :(得分:1)

可以按照alecxe的建议尝试使用socket.setdefaulttimeout(5)。

More details in urllib2 doc

套接字和层

Python从网络获取资源的支持是分层的。 urllib2使用httplib库,而httplib库又使用套接字库。

从Python 2.3开始,您可以指定套接字在超时之前应等待响应的时间。这在必须获取网页的应用程序中很有用。默认情况下,套接字模块没有超时并且可以挂起。当前,套接字超时不在httplib或urllib2级别公开。但是,您可以使用

为所有套接字全局设置默认超时
import socket
import urllib2

# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)