¿Usar curl para descargar imágenes del sitio web usando comodines?

¿Hay alguna forma de usar curl para descargar imágenes no secuenciales con un comodín? Quiero descargar todas las panorámicas que subo a mi cuenta en 360 Panorama a una carpeta local para no tener que hacerlo manualmente cada vez.

Los archivos de imágenes siguen el patrón de: http://occipital.com/images/viewer/XYZ_flat.jpg con XYZ al azar. También parece de esa URL que necesito estar conectado o visto como conectado al sitio.

No estoy muy familiarizado con curl, ya que lo acabo de descubrir cuando buscaba una manera de realizar esta tarea y curl (o wget) parecía la solución.
Consulte CURL para descargar un directorio en superusuario.
¿Puede agregar algunas URL específicas (reales) a su pregunta? Tal vez podamos encontrar un patrón allí que sea posible adivinar al usar curl.
@patrix aquí hay una URL real: occipital.com/images/viewer/qSJGuD_flat.jpg ; parece que no ofrecen una ruta directa vinculada al nombre de usuario. Aquí está el enlace a la página de mi cuenta de usuario cuando no estoy conectado: occipital.com/user/01ca-255/george-coghill
@Arjan Estoy tratando de descargar las imágenes más nuevas a medida que se publican, no todo el directorio, y no solo una vez. Tratando de evitar tener que ir a mi cuenta y descargar manualmente cada imagen cada vez que subo nuevas panorámicas.
Pase lo que pase, diría que tiene poco que ver con Apple y hay muchas publicaciones relacionadas en Super User. (Y la respuesta de Jack es correcta).
@Arjan Como dije, no estoy muy familiarizado con todo esto, pero no pude encontrar nada en Stack Exchange sobre el aspecto del comodín. Pensé que curl era una variante de wget solo para Apple. Es todo muy confuso.
No es realmente una pregunta de Mac OS X.

Respuestas (4)

Puede usar este bashcódigo para la URL real que proporcionó en su comentario .

for i in $(for j in {1..8}; do
    curl http://occipital.com/user/01ca-255/george-coghill/$j/;
  done \
  | sed -n 's,.*/viewer/\(......_flat\)_small\.jpg.*,http://occipital.com/images/viewer/\1.jpg,p'
); do
  curl -L -o "${i##*/}" "$i";
done

Siéntase libre de escribir este comando en una sola línea; todos los saltos de línea solo se agregaron para aumentar la legibilidad. Puede copiarlos o eliminarlos, lo que quiera.

Lo que hace este código:

  1. Iterar sobre las 8 páginas de la galería de su cuenta
  2. Extraiga los nombres de las imágenes de las imágenes de vista previa
  3. Obtenga todas las imágenes de tamaño completo usando esta lista de nombres

Si solo desea descargar archivos que no existen y no sabe la cantidad de páginas de la galería por adelantado, puede ajustar el código a esto:

for i in $(
  j=1;
  while curl --max-redirs 0 -L -f \
      http://occipital.com/user/01ca-255/george-coghill/$((j++))/; do
    :;
  done \
  | sed -n 's,.*/viewer/\(......_flat\)_small\.jpg.*,http://occipital.com/images/viewer/\1.jpg,p'
); do
  [[ -f "${i##*/}" ]] || curl -L -o "${i##*/}" "$i";
done

El primer código ahora incrementa el número de página hasta que ocurre una redirección o un error. El servidor lo redirigirá a la última página existente si intenta visitar una página posterior a las existentes. La [[ -f … ]] ||parte se ejecutará curlsolo si el archivo correspondiente aún no existe.

Esto funcionó, tengo que decir que está muy por encima de mi cabeza, ¡pero realmente aprecio la ayuda! ¿Cómo modificaría el código para especificar el directorio de descarga?
@GeorgeC: "${i##*/}"es el nombre del archivo en su máquina local; puede anteponer un nombre de directorio a eso, por ejemplo, "some/dir/${i##*/}". O simplemente cdingresa primero al directorio deseado.

¿Quiere descargar imágenes de http://occipital.com/images/viewer/ *_flat.jpg?

Esto no es posible. No puede tratar al espectador como una carpeta. La web es un servicio que te proporciona cosas cuando tú lo pides. No tiene una lista de todos los archivos. A menos que pruebe todos los archivos desde AAA hasta ZZZ, esto no es posible sin una lista.

Eso es lo que estaba pensando que iba a ser el problema. Pero digamos que había una URL en la que esto podría funcionar: ¿cómo se usaría curl con URL no secuenciales para verificar y descargar automáticamente nuevos archivos? ¿O simplemente no es posible sin un patrón de URL secuencial?

Si bien no puede usar un comodín verdadero, puede especificar partes entre llaves, es decir. curl mysite.{alpha,beta,gamma}.com o rangos de números mysite.com/files[0001-0100].txt

Consulte la página de manual de curl para obtener más información.

http://curl.haxx.se/docs/manpage.html

Entonces, para sus archivos que son aleatorios, puede hacer mages/viewer/[000-999]_flat.jpg Terminaría con muchos archivos no encontrados, pero debería obtener todos los archivos que están allí.

Como dijo ClarkGoble, use algo como esta solución de "fuerza bruta":

    curl http://occipital.com/images/viewer/[1-999:1]_flat.jpg -f -o -image_#1_flat.jpg

La opción "-f" evitará que curl escriba archivos de salida si recibe un error 404. Por lo tanto, obtendrá resultados solo para los archivos que se encuentran en el servidor.

-o significa "salida"

#1 coincide con el patrón de reemplazo, es decir, en el caso, los números a partir de 1, hasta 999, con un paso de 1.