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.jpgpara que 99.jpgestén bien, pero 100.jpgluego 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 wgetdetenerse 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 failuresno 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 GNUparallelpara solicitudes simultáneas para acelerar el proceso.Respuestas:
Si estás contento con un bucle:
Eso se ejecutará
wgetpara cada URL en su expansión hasta que falle, y luegobreaksalga 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
wgethaya nada incorporado para hacer eso.fuente
elifpara aclarar el segundo ejemplo? ¿Algo así quizás? gist.github.com/IQAndreas/84cae3f0193b67691ff2 (solo agrega una línea adicional, sin incluir poner lathens en la misma línea que laifs)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 16a-eq 24significarí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
16y24se utiliza es que es el total de los códigos de retorno.wget responde con un código de retorno de
8cuando recibe un código de respuesta que corresponde a un error del servidor y, por lo tanto,16es el total después de 2 errores.Se puede detener cuando las fallas solo ocurren dos veces seguidas restableciendo el umbral siempre que
wgettenga é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 de16y24.$?! ¡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
wgetcó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.wgetproporciona una-S/--server-responsemarca para imprimir los Encabezados de respuesta HTTP enSTDERRel 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_outputhaga un poco de magiawgetpara detectar un404... No creo que haya controles adecuados aquí, por lo que realmente no responde la pregunta.