通过Python使用wget

我如何使用wget下载Python文件(video)并保存到本地? 会有一堆文件,所以我怎么知道一个文件被下载,以便自动开始downloding另一个?

谢谢。

Solutions Collecting From Web of "通过Python使用wget"

不要这样做。 改用urllib2或者urlgrabber

简短的回答(简化)。 得到一个文件

  import urllib urllib.urlretrieve("http://google.com/index.html", filename="local/index.html") 

你可以弄清楚如何循环,如果有必要的话。

如果你使用os.system()wget产生一个进程,它会阻塞,直到wget完成下载(或退出时出错)。 所以,只需在循环中调用os.system('wget blah') ,直到你下载了所有的文件。

或者,您可以使用urllib2httplib 。 您必须编写一个不重要的金额代码,但是您将获得更好的性能,因为您可以重复使用单个HTTP连接来下载多个文件,而不是为每个文件打开一个新的连接。

没有理由使用os.system。 避免在Python中编写shell脚本,并使用类似urllib.urlretrieve或类似的东西。

编辑…回答你的问题的第二部分,你可以使用标准库Queue类来设置一个线程池。 由于你正在做很多的下载,GIL不应该是一个问题。 生成您想要下载的URL列表,并将它们提供给您的工作队列。 它将处理推送请求到工作线程。

我正在等待数据库更新完成,所以我把它放在一起真的很快。

#!/usr/bin/python import sys import threading import urllib from Queue import Queue import logging class Downloader(threading.Thread): def __init__(self, queue): super(Downloader, self).__init__() self.queue = queue def run(self): while True: download_url, save_as = queue.get() # sentinal if not download_url: return try: urllib.urlretrieve(download_url, filename=save_as) except Exception, e: logging.warn("error downloading %s: %s" % (download_url, e)) if __name__ == '__main__': queue = Queue() threads = [] for i in xrange(5): threads.append(Downloader(queue)) threads[-1].start() for line in sys.stdin: url = line.strip() filename = url.split('/')[-1] print "Download %s as %s" % (url, filename) queue.put((url, filename)) # if we get here, stdin has gotten the ^D print "Finishing current downloads" for i in xrange(5): queue.put((None, None))
#!/usr/bin/python import sys import threading import urllib from Queue import Queue import logging class Downloader(threading.Thread): def __init__(self, queue): super(Downloader, self).__init__() self.queue = queue def run(self): while True: download_url, save_as = queue.get() # sentinal if not download_url: return try: urllib.urlretrieve(download_url, filename=save_as) except Exception, e: logging.warn("error downloading %s: %s" % (download_url, e)) if __name__ == '__main__': queue = Queue() threads = [] for i in xrange(5): threads.append(Downloader(queue)) threads[-1].start() for line in sys.stdin: url = line.strip() filename = url.split('/')[-1] print "Download %s as %s" % (url, filename) queue.put((url, filename)) # if we get here, stdin has gotten the ^D print "Finishing current downloads" for i in xrange(5): queue.put((None, None)) 

通过pypi http://pypi.python.org/pypi/wget/0.3安装wget

 pip install wget 

然后运行,就像记录

 python -m wget <url> 

没有理由使用python。 避免在Python中编写shell脚本,并使用类似bash或等价物的东西。