Если вы используете расширение скобок с помощью wget
, вы можете легко получать изображения с последовательными номерами:
$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
Он извлекает первые 10 файлов , пронумерованных 90.jpg
в 99.jpg
только штраф, но 100.jpg
и далее возвращает 404: Файл не найдено ошибку ( у меня только 100 изображений , хранящихся на сервере). Эти несуществующие файлы становятся более «проблемой», если вы используете больший диапазон, например {00..200}
, при наличии 100 несуществующих файлов это увеличивает время выполнения скрипта и может даже стать небольшим бременем (или, по крайней мере, раздражением) для сервер.
Есть ли способ для wget
остановки после получения первой ошибки 404? (или даже лучше, два подряд, если в диапазоне отсутствовал файл по другой причине). В ответе не нужно использовать скобку; петли тоже хорошо.
источник
1, 2 or even n failures
это не правильный путь, когда вы знаете[begin .. end]
индексы. Зачем вам указывать[1..200]
диапазон, если вы знаете, что в нем только 100 изображений[1..100]
? Я думаю, вы можете попробовать GNUparallel
для одновременных запросов, чтобы ускорить процесс.Ответы:
Если вас устраивает цикл:
Это будет работать
wget
для каждого URL в вашем расширении, пока не произойдет сбой, а затемbreak
из цикла.Если вы хотите два сбоя подряд, это будет немного сложнее:
Вы можете уменьшить это немного с
&&
и||
вместоif
, но это становится довольно уродливым.Я не верю
wget
, что для этого есть что-то встроенное.источник
elif
чтобы сделать второй пример более понятным? Может быть, что-то подобное? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (он добавляет только одну дополнительную строку, не считаяthen
s в той же строке, что иif
s)Вы можете использовать
$?
переменную, чтобы получить код возврата wget. Если он ненулевой, то это означает, что произошла ошибка, и вы подсчитываете ее до тех пор, пока она не достигнет порога, тогда она может выйти из цикла.Как-то так с моей головы
Цикл for можно немного очистить, но вы можете понять общую идею.
Изменение ,
$threshold -eq 16
чтобы-eq 24
означало бы оно не будет в 3 раза , прежде чем он остановится, однако она не была бы в два раза подряд, это было бы , если он не в два раза в цикле.Причина, почему
16
и24
используются, состоит в том, что это сумма кодов возврата.wget отвечает кодом возврата,
8
когда он получает код ответа, который соответствует ошибке с сервера, и, таким образом,16
представляет собой сумму после 2 ошибок.Остановка, когда сбои происходят только два раза подряд, может быть выполнена путем сброса порогового значения при каждом успешном завершении
wget
, т. Е. Когда код возврата равен 0Список кодов возврата wget можно найти здесь - http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html.
источник
8
, поэтому магические числа из16
и24
.$?
! Очень полезный!С GNU Parallel это должно работать:
Начиная с версии 20140722, вы можете получить ошибку «два в ряд»: --halt 2% допустит сбой 2% заданий:
источник
IMO, фокусировка на
wget
коде выхода / статусе может быть слишком наивной для некоторых вариантов использования, поэтому вот тот, который рассматривает код состояния HTTP также для некоторых детальных решений.wget
обеспечивает-S/--server-response
флаг для распечатки заголовков ответа HTTPSTDERR
команды - который мы можем извлечь и действовать.источник
В питоне вы можете сделать
Ознакомьтесь с документацией для подпроцесса, если вы хотите сделать больше https://docs.python.org/2/library/subprocess.html
источник
check_output
не происходит какое-то волшебство,wget
чтобы обнаружить ...404
Я не верю, что здесь есть адекватные проверки, и поэтому на самом деле не отвечает на вопрос.