我有一个大的URL文本文件,我必须通过wget下载。我编写了一个小的python脚本,它基本上遍历每个域名并使用wget(os.system(“wget”+ URL))下载它们。但问题是,如果远程服务器在连接后没有回复,则wget只会挂起连接。 在这种情况下如何设置时间限制?如果远程服务器在连接后没有回复,我想在一段时间后终止wget。
此致
答案 0 :(得分:3)
使用--timeout seconds
参数来限制请求的时间。您可以更具体,并在需要时使用--connect-timeout seconds
。有关详细信息,请参阅wget Manual。
答案 1 :(得分:3)
您无需使用wget
等外部工具。使用内置urllib2
下载文件。
该文档可用here
答案 2 :(得分:2)
你不应该调用wget
二进制文件来从Python执行这样的任务。使用其中一个可用的 HTTP库代替Python,您将获得更好的错误处理和控制。
urllib2
(official docs,Missing 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错误。