Как загрузить файлы (видео) с помощью Python с помощью wget и сохранить их локально? Там будет куча файлов, так как я узнаю, что один файл загружен, чтобы автоматически начать downloding другой?
Спасибо.
Как загрузить файлы (видео) с помощью Python с помощью wget и сохранить их локально? Там будет куча файлов, так как я узнаю, что один файл загружен, чтобы автоматически начать downloding другой?
Спасибо.
Не делай этого. Используйте urllib2
или urlgrabber
вместо.
Короткий ответ (упрощенный). Чтобы получить один файл
import urllib
urllib.urlretrieve("http://google.com/index.html", filename="local/index.html")
Вы можете выяснить, как это сделать, если необходимо.
Если вы используете os.system()
, чтобы создать процесс для wget
, он будет блокироваться до тех пор, пока wget
не закончит загрузку (или завершает работу с ошибкой). Итак, просто вызовите os.system('wget blah')
в цикле, пока не загрузите все ваши файлы.
В качестве альтернативы вы можете использовать urllib2
или httplib
. Вам придется писать нетривиальный код количества, но вы получите лучшую производительность, поскольку вы можете повторно использовать одно HTTP-соединение для загрузки многих файлов, в отличие от открытия нового соединения для каждого файла.
Нет причин использовать os.system. Избегайте писать оболочку script в Python и идите с чем-то вроде 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))
Установить wget через pypi http://pypi.python.org/pypi/wget/0.3
pip install wget
затем запустите, как описано в документе
python -m wget <url>
Нет причин использовать python. Избегайте писать оболочку script в Python и идите с чем-то вроде bash или эквивалентом.