Si vous utilisez l'extension d'accolade avec wget
, vous pouvez facilement récupérer des images numérotées séquentiellement:
$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
Il va chercher les 10 premiers fichiers numérotés 90.jpg
à 99.jpg
très bien, mais 100.jpg
et revenir en avant une 404: Fichier introuvable erreur (je seulement 100 images stockées sur le serveur). Ces fichiers inexistants deviennent plus un "problème" si vous utilisez une plage plus large, comme {00..200}
, avec 100 fichiers inexistants, cela augmente le temps d'exécution du script, et peut même devenir un léger fardeau (ou au moins une gêne) sur le serveur.
Existe-t-il un moyen wget
d'arrêter une fois qu'il a reçu sa première erreur 404? (ou encore mieux, deux de suite, au cas où il y aurait un fichier manquant dans la plage pour une autre raison) La réponse n'a pas besoin d'utiliser l'expansion d'accolade; les boucles sont bien aussi.
la source
1, 2 or even n failures
n'est pas la bonne façon de connaître les[begin .. end]
indices. Pourquoi spécifier une[1..200]
plage alors que vous savez qu'il n'y a que 100 images dans[1..100]
. Je suppose que vous pouvez essayer GNUparallel
pour des demandes simultanées afin d'accélérer le processus.Réponses:
Si vous êtes satisfait d'une boucle:
Cela s'exécutera
wget
pour chaque URL de votre expansion jusqu'à ce qu'elle échoue, puisbreak
hors de la boucle.Si vous voulez deux échecs d'affilée, cela devient un peu plus compliqué:
Vous pouvez réduire cela un peu avec
&&
et||
au lieu deif
, mais cela devient assez moche.Je ne crois pas qu'il y
wget
ait quoi que ce soit en place pour cela.la source
elif
pour rendre le deuxième exemple plus clair? Quelque chose comme ça peut-être? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (il n'ajoute qu'une seule ligne supplémentaire, sans mettre lethen
s sur la même ligne que leif
s)Vous pouvez utiliser la
$?
variable pour obtenir le code retour de wget. Si elle n'est pas nulle, cela signifie qu'une erreur s'est produite et que vous la compilez jusqu'à ce qu'elle atteigne un seuil, elle pourrait alors sortir de la boucle.Quelque chose comme ça du haut de ma tête
La boucle for peut être nettoyée un peu, mais vous pouvez comprendre l'idée générale.
Changer le
$threshold -eq 16
pour-eq 24
signifierait qu'il échouerait 3 fois avant de s'arrêter, mais ce ne serait pas deux fois de suite, ce serait le cas s'il échouait deux fois dans la boucle.La raison pour laquelle
16
et24
sont utilisés est le total des codes retour.wget répond avec un code retour
8
lorsqu'il reçoit un code de réponse qui correspond à une erreur du serveur, et16
est donc le total après 2 erreurs.L'arrêt lorsque les échecs ne se produisent que deux fois de suite peut être effectué en réinitialisant le seuil chaque fois qu'il
wget
réussit, c'est-à-dire lorsque le code retour est 0Une liste des codes de retour wget peut être trouvée ici - http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html
la source
8
, d'où les nombres magiques de16
et24
.$?
! Très utile!Avec GNU Parallel, cela devrait fonctionner:
À partir de la version 20140722, vous pouvez presque avoir votre "deux dans une rangée" -failure: - l'asphalte 2% permettra à 2% des travaux d'échouer:
la source
IMO, en se concentrant sur
wget
le code / statut de sortie de, peut être trop naïf pour certains cas d'utilisation, alors voici celui qui prend également en compte le code de statut HTTP pour une prise de décision granulaire.wget
fournit un-S/--server-response
indicateur pour imprimer les en-têtes de réponse HTTP surSTDERR
la commande - que nous pouvons extraire et agir.la source
En python, vous pouvez faire
Consultez la documentation du sous-processus si vous souhaitez en faire plus https://docs.python.org/2/library/subprocess.html
la source
check_output
n'y ait un peu de magiewget
pour détecter un404
- je ne pense pas qu'il y ait des contrôles adéquats ici et ne répond donc pas vraiment à la question.