3

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

问候,

4

4 回答 4

3

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

于 2012-09-27T14:55:16.613 回答
3

您不需要使用外部工具,例如wget. 使用内置urllib2下载文件。文档可在此处获得

于 2012-09-27T14:55:24.180 回答
2

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

urllib2官方文档缺失手册)是标准库的一部分。

但是,我强烈建议改用优秀的requests模块。它有一个非常干净的 API,使简单的任务变得简单,正如他们应该做的那样,但仍然提供了大量的灵活性和细粒度的控制。

使用该requests模块,您可以使用关键字参数指定超时(以秒为单位),如下所示:timeout

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 ...

样本输出:

请求 http://www.stackoverflow.com 失败:请求超时。
对 http://www.google.com 的请求失败:请求超时。
于 2012-09-27T15:27:14.523 回答
1

这似乎不是关于 python 的问题,而是关于如何使用 wget 的问题。在您可能使用的 gnu wget 中,默认重试次数为 20。您可以使用 -t 设置尝试次数,如果文件下载失败,也许 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 错误。

于 2012-09-27T14:55:43.947 回答