Jeśli używasz rozszerzenia nawiasów klamrowych wget
, możesz z łatwością pobierać obrazy o numerach sekwencyjnych:
$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
Pobiera pierwsze 10 plików ponumerowanych, 90.jpg
aby w 99.jpg
porządku, ale 100.jpg
potem zwraca błąd 404: Nie znaleziono pliku (mam tylko 100 obrazów zapisanych na serwerze). Te nieistniejące pliki stają się bardziej „problemem”, jeśli użyjesz większego zakresu, np. W {00..200}
przypadku 100 nieistniejących plików wydłuży to czas wykonywania skryptu, a nawet może stanowić niewielkie obciążenie (lub przynajmniej irytację) dla serwer.
Czy jest jakiś sposób na wget
zatrzymanie po otrzymaniu pierwszego błędu 404? (lub jeszcze lepiej, dwa z rzędu, w przypadku braku pliku w zakresie z innego powodu) Odpowiedź nie wymaga użycia interpretacji nawiasów; pętle też są w porządku.
źródło
1, 2 or even n failures
nie jest właściwy sposób, gdy znasz[begin .. end]
indeksy. Dlaczego miałbyś określać[1..200]
zasięg, skoro wiesz, że jest tam tylko 100 zdjęć[1..100]
. Myślę, że możesz wypróbować GNUparallel
dla jednoczesnych żądań, aby przyspieszyć ten proces.Odpowiedzi:
Jeśli jesteś zadowolony z pętli:
Będzie działał
wget
dla każdego adresu URL w rozwinięciu, dopóki się nie powiedzie, a następnie znikniebreak
z pętli.Jeśli potrzebujesz dwóch awarii z rzędu, staje się to nieco bardziej skomplikowane:
Możesz to trochę zmniejszyć za pomocą
&&
i||
zamiastif
, ale robi się dość brzydko.Nie wierzę, że
wget
ma coś wbudowanego w to.źródło
elif
aby wyjaśnić drugi przykład? Może coś takiego? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (dodaje tylko jedną dodatkową linię, nie włączając umieszczaniathen
s na tej samej linii coif
s)Możesz użyć tej
$?
zmiennej, aby uzyskać kod powrotu wget. Jeśli jest niezerowy, oznacza to, że wystąpił błąd i sumujesz go, aż osiągnie próg, a następnie może wyjść z pętli.Coś takiego z góry mojej głowy
Pętlę for można trochę wyczyścić, ale można zrozumieć ogólny pomysł.
Zmiana
$threshold -eq 16
do-eq 24
oznaczałoby to nie 3 razy, zanim to stop, ale nie będzie się dwa razy z rzędu, to jest, gdy nie udało się dwukrotnie w pętli.Powodem,
16
i24
są stosowane jest to suma kodów zwrotnych.wget odpowiada kodem powrotu,
8
kiedy otrzymuje kod odpowiedzi, który odpowiada błędowi z serwera, a zatem16
jest sumą po 2 błędach.Zatrzymanie, gdy awarie występują tylko dwa razy z rzędu, można wykonać, resetując próg za każdym razem
wget
, gdy się powiedzie, tj. Gdy kod powrotu wynosi 0Listę kodów powrotu wget można znaleźć tutaj - http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html
źródło
8
, stąd liczb magicznych z16
i24
.$?
! Bardzo przydatne!W przypadku GNU Parallel powinno to działać:
Od wersji 20140722 możesz prawie mieć swoje „dwa z rzędu” - błąd: - zatrzymanie 2% pozwoli na awarię 2% zadań:
źródło
IMO, koncentrując się na
wget
kodzie wyjścia / statusie, może być zbyt naiwny w niektórych przypadkach użycia, więc tutaj jest taki, który bierze pod uwagę również kod statusu HTTP dla niektórych szczegółowych decyzji.wget
zapewnia-S/--server-response
flagę do wydrukowania nagłówków odpowiedzi HTTP naSTDERR
komendzie - którą możemy wyodrębnić i podjąć działania.źródło
W Pythonie możesz to zrobić
Zapoznaj się z dokumentacją dotyczącą podprocesu, jeśli chcesz zrobić więcej https://docs.python.org/2/library/subprocess.html
źródło
check_output
że w pobliżu jest jakaś magia,wget
żeby wykryć404
- nie sądzę, że są tu odpowiednie kontrole, więc tak naprawdę nie odpowiada na pytanie.