【问题标题】:Set a timer on urlopen so when connection times out it tries to reconnect在 urlopen 上设置一个计时器,以便在连接超时时尝试重新连接
【发布时间】:2013-06-13 20:32:40
【问题描述】:

我有一个关于 Python 2.7 的问题。 urlopen 函数有时会因为网络状况不佳而无法连接。所以我想在上面加一个定时器,这样当连接超时时,它会关闭之前的连接并尝试重新连接。在我的实现中,它会陷入死循环,一次又一次地“尝试重新连接”......有人可以帮我吗?非常感谢!

def getConnection(urlItem, keywords, address):
    urlItem.close()
    print "Trying to reconnect..."
    findArticles(keywords, address)

def findArticles(keywords, address):
    urlItem = urllib.urlopen(address)
    t = Timer(20.0, getConnection(urlItem, keywords, address))
    t.start()
    htmlSource = urlItem.read()
    t.cancel()

这是我得到的例外:

  File "/usr/lib/python2.7/urllib.py", line 84, in urlopen
    return opener.open(url)
  File "/usr/lib/python2.7/urllib.py", line 205, in open
    return getattr(self, name)(url)
  File "/usr/lib/python2.7/urllib.py", line 342, in open_http
    h.endheaders(data)
  File "/usr/lib/python2.7/httplib.py", line 951, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 811, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 773, in send
    self.connect()
  File "/usr/lib/python2.7/httplib.py", line 754, in connect
    self.timeout, self.source_address)
  File "/usr/lib/python2.7/socket.py", line 553, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
IOError: [Errno socket error] [Errno -2] Name or service not known

【问题讨论】:

  • 当我尝试使用 urllib 拉取网站时,当我无法访问该网站时,我得到一个 IOError。我想当你的连接超时时你会得到同样的结果吗?我刚刚测试它拔下,我得到一个 IOError。你如何调用你的函数?您应该会收到一个会中断脚本执行的错误。你是在 Try/Except 中调用这些函数吗?
  • 我得到了这个:IOError: [Errno socket error] [Errno -2] Name or service not known。我没有使用 Try/Except...
  • 预期效果是什么。该函数继续循环直到它可以加载页面?还是跳过该页面并尝试下一个?
  • @0xhughes 感谢您的建议!我实现了一个 Try/Except 并且它有效。

标签: python urllib urlopen


【解决方案1】:

旧的 urllib 库本身不支持设置超时,但 urllib2 支持。您应该考虑使用 urllib2,也就是说...

您可以导入套接字并为所有新创建的套接字设置默认超时。这可能是一种迂回的方式来做你需要做的事情。

http://docs.python.org/2.7/library/socket.html#socket.setdefaulttimeout

【讨论】:

  • 感谢您的建议!我使用 urllib2 和一个 try-exception 块来获得一个迂回的方式。
猜你喜欢
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多