【问题标题】:how to time-out gracefully while downloading with python使用python下载时如何优雅地超时
【发布时间】:2009-03-01 23:44:38
【问题描述】:

我正在循环下载包含以下代码的大量文件:

try:
    urllib.urlretrieve(url2download, destination_on_local_filesystem)
except KeyboardInterrupt:
    break
except:
    print "Timed-out or got some other exception: "+url2download

如果连接刚开始时服务器在 URL url2download 上超时,则正确处理最后一个异常。但有时服务器响应,并开始下载,但服务器太慢,即使一个文件也需要几个小时,最终它会返回如下内容:

Enter username for Clients Only at albrightandomalley.com:
Enter password for  in Clients Only at albrightandomalley.com:

然后就挂在那里(尽管如果通过浏览器下载相同的链接,则不会询问用户名/密码)。

在这种情况下,我的意图是 -- 跳过此文件并转到下一个文件。问题是——如何做到这一点? python有没有办法指定下载一个文件可以工作多长时间,如果已经花费了更多时间,则中断并继续?

【问题讨论】:

  • 您看到的是服务器要求身份验证。默认情况下urllib.urlretrieve() 会提示用户输入用户名和密码。如果你想避免这种情况,你可以创建一个从urllib.FancyURLOpener 派生的新类并自己处理这个“错误”。

标签: python exception-handling download


【解决方案1】:

试试:

import socket

socket.setdefaulttimeout(30)

【讨论】:

  • 你能举一个例子吗?
【解决方案2】:

如果您不限于开箱即用的 python 附带的内容,那么urlgrabber 模块可能会派上用场:

import urlgrabber
urlgrabber.urlgrab(url2download, destination_on_local_filesystem,
                   timeout=30.0)

【讨论】:

  • urlgrabber 链接不再存在。
【解决方案3】:

有人讨论过这个here。警告(除了他们提到的那些):我没有尝试过,他们使用的是urllib2,而不是urllib(这对你来说会是个问题吗?)(实际上,现在我考虑了一下,这种技术可能也适用于urllib)。

【讨论】:

    【解决方案4】:

    这个问题更笼统地与函数超时有关: How to limit execution time of a function call in Python

    我已经使用我的答案中描述的方法编写了一个等待文本函数,该函数超时以尝试自动登录。如果您想要类似的功能,可以在此处参考代码:

    http://code.google.com/p/psftplib/source/browse/trunk/psftplib.py

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2013-10-17
      • 2014-08-17
      • 2011-05-23
      • 2011-11-26
      相关资源
      最近更新 更多