Si utiliza la expansión de llaves con wget
, puede obtener imágenes numeradas secuencialmente con facilidad:
$ wget 'http://www.iqandreas.com/sample-images/100-100-color/'{90..110}'.jpg'
Obtiene los primeros 10 archivos numerados 90.jpg
para que 99.jpg
estén bien, pero 100.jpg
luego devuelve un error 404: Archivo no encontrado (solo tengo 100 imágenes almacenadas en el servidor). Estos archivos inexistentes se vuelven más un "problema" si usa un rango mayor, como {00..200}
, con 100 archivos inexistentes, aumenta el tiempo de ejecución del script e incluso podría convertirse en una carga ligera (o al menos molesta) en el servidor.
¿Hay alguna forma de wget
detenerse después de haber recibido su primer error 404? (o incluso mejor, dos seguidos, en caso de que falte un archivo en el rango por otra razón) La respuesta no necesita usar la expansión de llaves; los bucles también están bien.
fuente
1, 2 or even n failures
no es la forma correcta cuando sabes[begin .. end]
índices. ¿Por qué especificarías el[1..200]
rango si sabes que solo hay 100 imágenes[1..100]
? Supongo que puedes probar GNUparallel
para solicitudes simultáneas para acelerar el proceso.Respuestas:
Si estás contento con un bucle:
Eso se ejecutará
wget
para cada URL en su expansión hasta que falle, y luegobreak
salga del ciclo.Si desea dos fallas seguidas, se vuelve un poco más complicado:
Puedes reducir eso un poco con
&&
y en||
lugar deif
, pero se pone bastante feo.No creo que
wget
haya nada incorporado para hacer eso.fuente
elif
para aclarar el segundo ejemplo? ¿Algo así quizás? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (solo agrega una línea adicional, sin incluir poner lathen
s en la misma línea que laif
s)Puede usar la
$?
variable para obtener el código de retorno de wget. Si no es cero, significa que se produjo un error y lo cuenta hasta que alcanza un umbral, entonces podría salir del ciclo.Algo así fuera de mi cabeza
El bucle for se puede limpiar un poco, pero puede comprender la idea general.
Cambiar el
$threshold -eq 16
a-eq 24
significaría que fallaría 3 veces antes de detenerse, sin embargo, no sería dos veces seguidas, lo sería si fallara dos veces en el ciclo.La razón por la cual
16
y24
se utiliza es que es el total de los códigos de retorno.wget responde con un código de retorno de
8
cuando recibe un código de respuesta que corresponde a un error del servidor y, por lo tanto,16
es el total después de 2 errores.Se puede detener cuando las fallas solo ocurren dos veces seguidas restableciendo el umbral siempre que
wget
tenga éxito, es decir, cuando el código de retorno es 0Puede encontrar una lista de códigos de retorno de wget aquí: http://www.gnu.org/software/wget/manual/html_node/Exit-Status.html
fuente
8
, de ahí los números mágicos de16
y24
.$?
! ¡Muy útil!Con GNU Parallel, esto debería funcionar:
A partir de la versión 20140722, casi puede tener su falla "dos en una fila": - el 2% permitirá que falle el 2% de los trabajos:
fuente
En mi opinión, centrarse en el
wget
código / estado de salida puede ser demasiado ingenuo para algunos casos de uso, así que aquí hay uno que considera el código de estado HTTP también para una toma de decisiones granular.wget
proporciona una-S/--server-response
marca para imprimir los Encabezados de respuesta HTTP enSTDERR
el comando, que podemos extraer y actuar sobre ellos.fuente
En python puedes hacer
Consulte la documentación del subproceso si desea hacer más https://docs.python.org/2/library/subprocess.html
fuente
check_output
haga un poco de magiawget
para detectar un404
... No creo que haya controles adecuados aquí, por lo que realmente no responde la pregunta.