wget与python时间限制

时间:2012-09-27 14:49:06

标签: python wget

我有一个大的URL文本文件,我必须通过wget下载。我编写了一个小的python脚本,它基本上遍历每个域名并使用wget(os.system(“wget”+ URL))下载它们。但问题是,如果远程服务器在连接后没有回复,则wget只会挂起连接。 在这种情况下如何设置时间限制?如果远程服务器在连接后没有回复,我想在一段时间后终止wget。

此致

4 个答案:

答案 0 :(得分:3)

使用--timeout seconds参数来限制请求的时间。您可以更具体,并在需要时使用--connect-timeout seconds。有关详细信息,请参阅wget Manual

答案 1 :(得分:3)

您无需使用wget等外部工具。使用内置urllib2下载文件。 该文档可用here

答案 2 :(得分:2)

你不应该调用wget二进制文件来从Python执行这样的任务。使用其中一个可用的 HTTP库代替Python,您将获得更好的错误处理和控制。

urllib2official docsMissing Manual)是标准库的一部分。

但是,我强烈建议您使用优秀的requests module。它有一个非常干净的API,使简单的任务变得简单,但它仍然提供了大量的灵活性和细粒度的控制。

使用requests模块,您可以使用timeout关键字参数{(3}}(以秒为单位),如下所示:

response = requests.get(url, timeout=0.02)

如果超时超时,将引发Timeout异常,您需要抓住并以任何方式处理它。

import requests
from requests.exceptions import Timeout, ConnectionError

TIMEOUT = 0.02

urls = ['http://www.stackoverflow.com',
        'http://www.google.com']

for url in urls:
    try:
        response = requests.get(url, timeout=TIMEOUT)
        print "Got response %s" % response.status_code
        response_body = response.content
    except (ConnectionError, Timeout), e:
        print "Request for %s failed: %s" % (url, e)
        # Handle however you need to ...

示例输出:

Request for http://www.stackoverflow.com failed: Request timed out.
Request for http://www.google.com failed: Request timed out.

答案 3 :(得分:1)

这似乎不是关于python的问题,而是关于如何使用wget的更多问题。 在您可能正在使用的gnu wget中,默认重试次数为20.您可以使用-t设置trys,如果文件无法下载,wget -t0可能会快速跳过它。或者,你可以使用-S标志来获得服务器响应,并让python做出适当的反应。但是,最有用的选项是-T或超时,将其设置为-T10以使其在十秒后超时并继续。

编辑:

如果您所做的只是遍历列表并下载URL列表我将使用wget,这里不需要python。事实上,你可以在一行中完成

awk '{print "wget -t2 -T5 --append-output=wget.log \"" $0 "\""}' listOfUrls | bash

这是在运行一个url列表,并调用wget,其中wget尝试两次下载文件,并在终止连接之前等待5秒,它还将响应附加到wget.log,你可以grep最后查找404错误。