带python时间限制的wget
我有一个很大的URL文本文件,我必须通过wget下载。我编写了一个小python脚本,它基本上循环遍历每个域名,并使用wget(os.system(“wget”+URL))下载它们。但问题是,如果远程服务器在连接后没有应答,wget只会挂起连接。 在这种情况下,我如何设定时间限制?如果远程服务器在连接后没有应答,我想在一段时间后终止wget带python时间限制的wget,python,wget,Python,Wget,我有一个很大的URL文本文件,我必须通过wget下载。我编写了一个小python脚本,它基本上循环遍历每个域名,并使用wget(os.system(“wget”+URL))下载它们。但问题是,如果远程服务器在连接后没有应答,wget只会挂起连接。 在这种情况下,我如何设定时间限制?如果远程服务器在连接后没有应答,我想在一段时间后终止wget 关于,请使用--timeout seconds参数来限制请求的时间。如果需要,您可以更具体地使用--连接超时秒数。有关详细信息,请参阅。您不需要使用外部工具
关于,请使用
--timeout seconds
参数来限制请求的时间。如果需要,您可以更具体地使用--连接超时秒数
。有关详细信息,请参阅。您不需要使用外部工具,如wget
。使用内置的urllib2
下载文件。
文档是可用的这似乎不是关于python的问题,而是关于如何使用wget的问题。 在您可能正在使用的GNUWget中,默认重试次数为20次。您可以使用-t设置tried,如果文件下载失败,wget-t0可能会很快跳过它。或者,您可以使用-S标志获得服务器响应,并让python做出适当的反应。但是,对您最有用的选项是-T或timeout,将其设置为-T10,使其在10秒后超时,然后继续 编辑: 如果您所做的只是遍历一个列表并下载一个URL列表,那么我只需要使用wget,这里不需要python。事实上,你可以在一行中完成
awk '{print "wget -t2 -T5 --append-output=wget.log \"" $0 "\""}' listOfUrls | bash
这是在运行URL列表并调用wget,其中wget尝试下载文件两次,并在终止连接前等待5秒,它还将响应附加到wget.log,您可以
grep
在最后查找404错误。您不应该调用wget
二进制文件来从Python执行类似的任务。使用Python可用的HTTP库之一,您将获得更好的错误处理和控制
还有urlib2
(,),它是标准库的一部分
然而,我强烈建议使用优秀的。它有一个非常干净的API,使简单的任务变得简单,但仍然提供了大量的灵活性和细粒度的控制
使用请求
模块,您可以(以秒为单位)使用超时
关键字参数,如下所示:
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.
请求http://www.stackoverflow.com 失败:请求超时。
请求http://www.google.com 失败:请求超时。
这是一个更干净的图书馆。对于这个问题,他们有一个超时
request.get(“http://www.to_url,timeout=0.1)
。执行最简单的任务需要大量的工作(甚至方法重写)。他们在主页上的奇怪声明。我使用urlib2
执行类似的任务(迭代URL并下载它们),代码非常小。那么,您是否使用urlib2
进行代理和身份验证?玩得开心。不,但我相信topicstarter也不需要这个,所以我建议使用这个包,因为它是内置的,您不需要安装任何额外的东西。我同意这一点,但真正的问题是python是适合这项工作的工具吗?为什么不直接使用wget呢?不要使用os.system()
。改用子流程
模块。如果您所做的只是从文本文件下载,我将只使用wget,在这种情况下不需要python。如果文件listOfURLS
包含任何尚未进行百分比编码的URL,例如包含空格,则此操作将失败。很好的捕获,但问题不在于投入。预处理最好提前完成。我坚持认为,他最初问题的措辞否定了在这个任务中使用python的必要性。URL编码不是预处理,而是问题的一部分。包含空格的URL是完全有效的URL,您的脚本无法处理它们。(wget
可以,如果引用正确的话,但是您的shell oneliner不能)。它当然是预处理,但是让我们忽略这个红色的听证会。我编辑了我的一行。假设bashshell,这会正确地引用它,并且应该可以工作。