6

希望这是一个非常简单的问题,但它让我发疯。我在 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)

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

马泰奥

4

3 回答 3

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

也可以看看:

于 2013-05-27T12:19:21.060 回答
1

最初的海报说他们不明白为什么会挂起,但他们也想要一种不挂起的方法urllib.request.urlopen。我不能说如何让它不挂起,但如果它对某人有帮助,这就是它可以挂起的原因。

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

诊断此问题的最佳方法是获取服务器响应的原始输出,并将其与您知道有效的另一个服务器响应进行比较。然后,如果您必须创建一个服务器并操纵响应来确定究竟是什么差异的原因。也许,这至少可以导致服务器发生变化并使其不挂起。

于 2017-04-25T00:33:10.667 回答
1

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

urllib2 文档中的更多详细信息

套接字和层

Python 对从 Web 获取资源的支持是分层的。urllib2 使用 httplib 库,而后者又使用 socket 库。

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

import socket
import urllib2

# timeout in seconds
timeout = 10
socket.setdefaulttimeout(timeout)
于 2020-04-21T12:52:29.603 回答