Wenn Sie die Klammererweiterung mit verwenden wget
, können Sie problemlos fortlaufend nummerierte Bilder abrufen:
$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
Es holt die ersten 10 Dateien nummerierten , 90.jpg
um 99.jpg
ganz gut, aber 100.jpg
und weiter gibt einen 404: Datei nicht gefunden Fehler (ich habe nur 100 Bilder auf dem Server gespeichert ist ). Diese nicht vorhandenen Dateien werden eher zu einem "Problem", wenn Sie einen größeren Bereich verwenden, z. B. {00..200}
bei 100 nicht vorhandenen Dateien die Ausführungszeit des Skripts verlängern und sogar eine leichte Belastung (oder zumindest eine Belästigung) darstellen der Kellner.
Gibt es eine Möglichkeit wget
, anzuhalten, nachdem der erste 404-Fehler aufgetreten ist? (oder noch besser, zwei in einer Reihe, falls aus einem anderen Grund eine Datei im Bereich fehlt) Die Antwort muss keine Klammererweiterung verwenden. Schleifen sind auch in Ordnung.
quelle
1, 2 or even n failures
ist nicht der richtige Weg, wenn Sie[begin .. end]
Indizes kennen . Warum würden Sie angeben[1..200]
Bereich , wenn Sie wissen , dass es nur 100 Bilder in[1..100]
. Ich denke, Sie können GNUparallel
für gleichzeitige Anfragen ausprobieren , um den Prozess zu beschleunigen.Antworten:
Wenn Sie mit einer Schleife zufrieden sind:
Dies wird
wget
für jede URL in Ihrer Erweiterung ausgeführt, bis sie fehlschlägt, und dannbreak
außerhalb der Schleife.Wenn Sie zwei Fehler hintereinander möchten, wird es etwas komplizierter:
Sie können das ein wenig mit
&&
und||
statt schrumpfenif
, aber es wird ziemlich hässlich.Ich glaube nicht, dass
wget
etwas eingebaut ist, um das zu tun.quelle
elif
, das zweite Beispiel klarer zu machen? So etwas vielleicht? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (es wird nur eine zusätzliche Zeile hinzugefügt , ohne dasthen
s in dieselbe Zeile wie dasif
s zu setzen)Sie können die
$?
Variable verwenden, um den Rückkehrcode von wget abzurufen. Wenn es nicht Null ist, bedeutet dies, dass ein Fehler aufgetreten ist und Sie ihn abrechnen, bis er einen Schwellenwert erreicht hat. Dann könnte er aus der Schleife ausbrechen.So etwas auf meinem Kopf
Die for-Schleife kann ein wenig aufgeräumt werden, aber Sie können die allgemeine Idee verstehen.
Das Ändern von
$threshold -eq 16
auf-eq 24
würde bedeuten, dass es dreimal fehlschlägt, bevor es stoppt. Es wäre jedoch nicht zweimal hintereinander, es wäre, wenn es zweimal in der Schleife fehlschlägt.Der Grund, warum
16
und24
verwendet werden, ist die Summe der Rückkehrcodes.wget antwortet mit einem Rückkehrcode,
8
wenn es einen Antwortcode erhält, der einem Fehler vom Server entspricht, und ist somit16
die Summe nach 2 Fehlern.Das Anhalten, wenn Fehler nur zweimal hintereinander auftreten, kann durch Zurücksetzen des Schwellenwerts erfolgen, wenn dies
wget
erfolgreich ist, dh wenn der Rückkehrcode 0 istEine Liste der wget-Rückkehrcodes finden Sie hier - http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html
quelle
8
, daher die magischen Zahlen von16
und24
.$?
! Sehr hilfreich!Mit GNU Parallel sollte dies funktionieren:
Ab Version 20140722 können Sie fast Ihre "zwei in einer Reihe" -Fehler haben: - Bei 2% können 2% der Jobs fehlschlagen:
quelle
IMO, sich auf
wget
den Exit-Code / Status zu konzentrieren, kann für einige Anwendungsfälle zu naiv sein. Hier ist also einer, der den HTTP-Statuscode auch für einige detaillierte Entscheidungen berücksichtigt.wget
Bietet ein-S/--server-response
Flag zum Ausdrucken der HTTP-AntwortheaderSTDERR
des Befehls, die wir extrahieren und bearbeiten können.quelle
In Python können Sie tun
Überprüfen Sie die Dokumentation für den Unterprozess, wenn Sie weitere Informationen unter https://docs.python.org/2/library/subprocess.html erhalten möchten
quelle
check_output
gibt etwas Magie, um einewget
zu erkennen404
- ich glaube nicht, dass es hier angemessene Kontrollen gibt, und beantworte die Frage daher nicht wirklich.