2010-12-14 23 views
5

Tengo una lista de alrededor de 3000 URL de imágenes, en las que necesito para descargarlos a mi escritorio.Descarga de imágenes mediante 3000+ C#?

Soy un desarrollador web, así que, naturalmente, escribí un pequeño método de descarga asp.net C# para hacer esto, pero ocurrió el problema obvio y la página agotó el tiempo antes de que apenas obtuviera ninguno.

¿Me preguntaba si alguien más conocía una forma buena, rápida y sólida de recorrer todas las URL de las imágenes y descargarlas a una carpeta? Abierto a cualquier sugerencia, WinForms, archivo por lotes aunque soy un novato en ambos.

Cualquier ayuda muy apreciada

Respuesta

11

¿Qué pasa con wget? Puede descargar una lista de URL especificada en un archivo.

wget -i c:\list-of-urls.txt 
+0

Awesome gracias, lo he usado antes, pero para obtener una página web – leen3o

+3

Esto probablemente no lo afecte, pero tenga en cuenta que las versiones anteriores de wget se vuelven inestables cuando el tamaño de descarga excede 2 (o tal vez 4) gigabytes. El enlace a la versión seguramente sufrirá este problema. http://users.ugent.be/~bpuype/wget/ está más actualizado. – spender

+0

@spender: Enlace actualizado directamente al proyecto GnuWin32: http://gnuwin32.sourceforge.net/packages/wget.htm – Richard

11

escribir una aplicación C# de línea de comandos (o Winforms, si ese es su inclinación), y el uso de la clase WebClient para recuperar los archivos.

Éstos son algunos tutoriales:

C# WebClient Tutorial

Using WebClient to Download a File

o, just Google C# WebClient.

Deberá proporcionar una lista de archivos para descargar y recorrer la lista, emitir una solicitud para cada archivo y guardar el resultado, o emitir una solicitud para la página de índice, analizarlo usando algo como HTML Agility Pack para encuentre todas las etiquetas de imagen y luego emita una solicitud para cada imagen, guardando el resultado en algún lugar de su disco local.

Editar

Si lo que desea es hacer esto una vez (como en, no como parte de una aplicación), mbeckish's answer tiene más sentido.

+7

Definitivamente el más fácil. Si puede, use 'Parallel.ForEach()' para acelerar su descarga. – roufamatic

+0

'Parallel.ForEach()' Dulce - No había visto eso antes. –

+0

Nunca he oído hablar de eso tampoco, voy a echarle un vistazo para mi futura referencia :) Gracias – leen3o

8

Es posible que desee utilizar un administrador de descargas existente como Orbit, en lugar de escribir su propio programa para este fin. (Blasfemia, lo sé)

he sido muy feliz con la órbita. Le permite importar una lista de descargas desde un archivo de texto. Se va a gestionar las conexiones, la descarga de porciones de cada archivo en paralelo con múltiples conexiones, para aumentar la velocidad de cada descarga. Se ocupará de volver a intentar si las conexiones tiempo de espera, etc. Parece que tendría que ir a una gran cantidad de esfuerzo para construir este tipo de características a partir de cero.

+1

Pero, ¿dónde está la diversión en eso? +1 –

+0

Lo sé, soy un aguafiestas. :-) – StriplingWarrior

+0

Excelente gracias por la sugerencia, nunca escuché hablar de Orbit antes :) – leen3o

6

Si este es solo un trabajo de una sola vez, entonces una solución fácil sería escribir una página HTML con etiquetas img apuntando a las URL.

A continuación, navegue con FireFox y utilice una extensión para guardar todas las imágenes en una carpeta.

+0

Duh. Archivo | Guardar página web (Completar) ... –

+0

Buena idea, gracias :) Voy a probar la idea de wget y utilizar esto como una copia de seguridad – leen3o

1

Partiendo de la hipótesis de que este es un fuera de una sola ejecución del proyecto y como usted es un principiante con otras tecnologías que sugiere lo siguiente:

En lugar de tratar de descargar todas las 3000 imágenes en una solicitud web lleve a cabo una imagen por solicitud. Cuando la imagen se complete la descarga redirección a la misma página que pasa la URL de la imagen siguiente para obtener como un parámetro de cadena de consulta. Descargue ese y luego repita hasta que se descarguen todas las imágenes.

No es lo que yo llamaría una solución de "producción", pero si mi suposición es correcta, es una solución que lo pondrá en marcha en muy poco tiempo.

Otra solución bastante simple sería crear una aplicación de consola C# simple que utiliza WebClient para descargar cada una de las imágenes. El siguiente pseudo código debe darle suficiente para ponerse en marcha:

List<string> imageUrls = new List<string>(); 
imageUrls.Add(..... your urls from wherever .....) 

foreach(string imageUrl in imagesUrls) 
{ 
    using (WebClient client = new WebClient()) 
    { 
     byte[] raw = client.DownloadData(imageUrl); 

     .. write raw .. to file 
    } 
} 
+0

lo más probable es que analice el uso de Parallel.ForEach() para recorrer esas imágenesUrls –

0

He escrito una aplicación similar en Windows Forms que se coloca a través de las direcciones URL en una hoja de cálculo Excel y descarga los archivos de imagen. Creo que el problema que tienes con la implementación de esto como una aplicación web es que el servidor solo permitirá que el proceso se ejecute durante un corto período de tiempo antes de que se agote el tiempo de espera de tu navegador. Puede aumentar este tiempo en el archivo web.config (cambiar el atributo executionTimeout del elemento httpRuntime) o implementar esta funcionalidad como una aplicación WinForms donde el tiempo de ejecución largo no será un problema. Si esto es más que una aplicación descartable y decide ir a la ruta de WinForms, puede agregar una barra de progreso a ind

Cuestiones relacionadas