我有一个大的 URL 文本文件,我必须通过 wget 下载。我写了一个小python脚本,它基本上循环每个域名并使用wget(os.system(“wget”+URL))下载它们。但问题是,如果远程服务器在连接后没有回复,wget 只会挂起连接。在这种情况下如何设置时间限制?如果远程服务器在连接后没有回复,我想在一段时间后终止 wget。
问候,
使用--timeout seconds
参数来限制请求的时间。如果需要,您可以更具体并使用--connect-timeout seconds
。有关详细信息,请参阅wget 手册。
您不需要使用外部工具,例如wget
. 使用内置urllib2
下载文件。文档可在此处获得
您不应该wget
从 Python 调用二进制文件来执行这样的任务。改用 Python 的可用HTTP 库之一,您将获得更好的错误处理和控制。
但是,我强烈建议改用优秀的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 的请求失败:请求超时。
这似乎不是关于 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 错误。