Подтвердить что ты не робот

Использование wget через Python

Как загрузить файлы (видео) с помощью Python с помощью wget и сохранить их локально? Там будет куча файлов, так как я узнаю, что один файл загружен, чтобы автоматически начать downloding другой?

Спасибо.

4b9b3361

Ответ 1

Не делай этого. Используйте urllib2 или urlgrabber вместо.

Ответ 2

Короткий ответ (упрощенный). Чтобы получить один файл

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

Вы можете выяснить, как это сделать, если необходимо.

Ответ 3

Если вы используете os.system(), чтобы создать процесс для wget, он будет блокироваться до тех пор, пока wget не закончит загрузку (или завершает работу с ошибкой). Итак, просто вызовите os.system('wget blah') в цикле, пока не загрузите все ваши файлы.

В качестве альтернативы вы можете использовать urllib2 или httplib. Вам придется писать нетривиальный код количества, но вы получите лучшую производительность, поскольку вы можете повторно использовать одно HTTP-соединение для загрузки многих файлов, в отличие от открытия нового соединения для каждого файла.

Ответ 4

Нет причин использовать 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))

Ответ 5

Установить wget через pypi http://pypi.python.org/pypi/wget/0.3

pip install wget

затем запустите, как описано в документе

python -m wget <url>

Ответ 6

Нет причин использовать python. Избегайте писать оболочку script в Python и идите с чем-то вроде bash или эквивалентом.