5 votos

¿Utilizar curl para descargar imágenes de un sitio web utilizando comodines?

¿Hay alguna forma de utilizar 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 siendo el XYZ aleatorio. También parece que desde esa URL necesito estar conectado o ser visto como conectado al sitio.

0 votos

No estoy muy familiarizado con curl, ya que acabo de descubrirlo cuando buscaba una manera de realizar esta tarea y curl (o wget) parecía la solución.

0 votos

Ver CURL para descargar un directorio en el Super Usuario.

0 votos

¿Puede añadir algunas URLs específicas (reales) a su pregunta? Tal vez podamos encontrar un patrón allí que sería posible adivinar al usar curl .

4voto

MvG Puntos 259

Puede utilizar este bash 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 como una sola línea; todos los saltos de línea se añadieron sólo para aumentar la legibilidad. Puede copiarlos o eliminarlos, como quiera.

Lo que hace este código:

  1. Recorra las 8 páginas de su galería de cuentas
  2. Extraer los nombres de las imágenes de la vista previa
  3. Obtenga todas las imágenes de tamaño completo utilizando esta lista de nombres

Si quiere descargar sólo los archivos que no existen, y no sabe el número 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 incrementa ahora el número de página hasta que se produce una redirección o un error. El servidor le redirigirá a la última página existente si intenta visitar una página posterior a las existentes. El [[ -f … ]] || parte ejecutará curl sólo si el archivo correspondiente no existe todavía.

0 votos

¡Esto hizo el truco, tengo que decir que está muy por encima de mi cabeza, pero realmente aprecio la ayuda! ¿Cómo puedo modificar el código para especificar el directorio de descarga?

0 votos

@GeorgeC: "${i##*/}" es el nombre del archivo en su máquina local; puede anteponer un nombre de directorio, por ejemplo "some/dir/${i##*/}" . O simplemente cd en el directorio deseado primero.

2voto

Jack Humphries Puntos 273

Así que quieres descargar imágenes de http://occipital.com/images/viewer/ *_plano.jpg?

Esto no es posible. No se puede tratar visor como una carpeta. La web es un servicio que te proporciona cosas cuando las pides. No tiene una lista de todos los archivos. A menos que pruebes todos los archivos desde AAA hasta ZZZ, esto no es posible sin una lista.

0 votos

Eso es lo que pensaba que iba a ser el problema. Pero digamos que hubiera una URL con la que esto pudiera funcionar: ¿cómo se podría utilizar curl con URLs no secuenciales para comprobar y descargar automáticamente nuevos archivos? ¿O simplemente no es posible sin un patrón de URL secuencial?

2voto

Django Reinhardt Puntos 839

Aunque no se puede utilizar un verdadero comodín, se pueden 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 man de curl para más información

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

Así que para tus archivos que son aleatorios podrías hacer mages/viewer/[000-999]_flat.jpg Terminarías con muchos archivos no encontrados pero debería obtener todos los archivos que están ahí.

0voto

FCA69 Puntos 1

Como dijo ClarkGoble, utilice 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 los archivos de salida si obtiene un error 404. Así que sólo obtendrá la salida de los archivos encontrados en el servidor.

-o significa "salida"

1 coincide con el patrón de sustitución, es decir, en el caso, los números que empiezan por el 1, hasta el 999, con un paso de 1.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X