wget: как указать оба параметра --directory-prefix И --output-document - PullRequest
4 голосов
/ 24 января 2012

Когда я использую -P или -O наедине с wget, все работает как рекламируется.

$: wget -P "test" http://www.google.com/intl/en_com/images/srpr/logo3w.png
Saving to: `test/logo3w.png'  

.

$: wget -O "google.png" http://www.google.com/intl/en_com/images/srpr/logo3w.png
2012-01-23 21:47:33 (1.20 MB/s) - `google.png' saved [7007/7007]

Однако объединение двух причин wget игнорирует -P.

$: wget -P "test" -O "google.png" http://www.google.com/intl/en_com/images/srpr/logo3w.png
2012-01-23 21:47:51 (5.87 MB/s) - `google.png' saved [7007/7007]

Я установил переменную как для каталога (сгенерированного последним фрагментом URL-адреса), так и для имени файла (сгенерированного посредством цикла подсчета), так что http://www.google.com/aaa/bbb/ccc дает file = /directory/filename, или, для поз. 1, /ccc/000.jpg

Подставляя это в код:
Popen(['wget', '-O', file, theImg], stdout=PIPE, stderr=STDOUT)
wget молча завершается ошибкой (на каждой итерации цикла).

Когда я включаю отладку -d и ведение журнала -a log.log, каждая итерация печатает
DEBUG output created by Wget 1.13.4 on darwin10.8.0.

Когда я удаляю -O и file, операция происходит нормально.

Мой вопрос: Есть ли способ до
A) Укажите и -P И -O в wget (предпочтительно) или
Б) Вставить строку в -O, содержащую / -символы, которые не вызывают ее сбой?

Буду признателен за любую помощь.

Ответы [ 3 ]

4 голосов
/ 19 сентября 2016

Документация по wget.download (..):

def download(url, out=None, bar=bar_adaptive):
    """High level function, which downloads URL into tmp file in current
    directory and then renames it to filename autodetected from either URL
    or HTTP headers.

    :param bar: function to track download progress (visualize etc.)
    :param out: output filename or directory
    :return:    filename where URL is downloaded to
    """
    ...

Используйте следующий вызов для загрузки файла в определенный каталог (уже существует) с пользовательским именем файла:

wget.download(url, path_to_output_file)

Если вы хотите, чтобы вызов функции абстрагировал создание каталога, если он еще не существует, используйте:

urllib.urlretrieve(url, path_to_output_file)
1 голос
/ 24 января 2012

Вы должны просто передать dir/000.jpg -O из wget:

import subprocess
import os.path

subprocess.Popen(['wget', '-O', os.path.join(directory, filename), theImg])

Из вашего вопроса не совсем ясно, делали ли вы уже что-то подобное, но если это было так и не получилось, я могу подумать о двух причинах:

  • Аргумент -O содержит начальный /, что приводит к сбою wget, поскольку у него нет разрешения на случайное создание каталогов в / (root).

  • Каталог, в который вы указываете wget для записи, не существует. Вы можете убедиться, что он существует, сначала создав его, используя os.mkdir в стандартной библиотеке Python.

Вы также можете попробовать удалить аргументы stdout= и stderr= из вызова Popen, чтобы вы могли видеть ошибки напрямую или распечатать их с помощью Python.

0 голосов
/ 21 февраля 2018

Эта строка кода от @Jaydev на самом деле работает великолепно:

wget.download(url, path_to_output_file)

...