2010-12-14 52 views
5

J'ai une liste d'environ 3000 URL d'images, où je dois les télécharger sur mon bureau. Je suis un web dev, donc naturellement écrit une petite méthode de téléchargement asp.net C# pour faire cela, mais le problème évident est arrivé et la page a expiré avant que je n'ai presque aucun d'entre eux. Je me demandais si quelqu'un d'autre savait d'une manière bonne, rapide et robuste de boucler toutes les URL de l'image et de les télécharger dans un dossier? Ouvert à toutes les suggestions, WinForms, fichier batch bien que je sois un novice à la fois.Télécharger 3000+ images en utilisant C#?

Toute aide grandement appréciée

Répondre

11

Qu'en est-il de wget? Il peut télécharger une liste d'URL spécifiée dans un fichier.

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

Awesome merci, je l'ai déjà utilisé mais pour obtenir une page Web – leen3o

+3

Cela ne vous affectera probablement pas, mais sachez que les anciennes versions de wget se squiffent lorsque la taille du téléchargement dépasse 2 (ou peut-être 4) gigaoctets. Le lien vers la version va presque certainement souffrir de ce problème. http://users.ugent.be/~bpuype/wget/ est plus à jour. – spender

+0

@spender: lien mis à jour directement vers le projet GnuWin32: http://gnuwin32.sourceforge.net/packages/wget.htm – Richard

11

écrire une application de ligne de commande C# (ou Winforms, si c'est votre inclinaison), et utiliser la classe WebClient pour récupérer les fichiers.

Voici quelques tutoriels:

C# WebClient Tutorial

Using WebClient to Download a File

ou, just Google C# WebClient. Vous devrez soit fournir une liste de fichiers à télécharger et faire une boucle dans la liste, émettre une requête pour chaque fichier et enregistrer le résultat, soit émettre une requête pour la page d'index, en l'analysant à l'aide de HTML Agility Pack recherchez toutes les balises d'image, puis émettez une demande pour chaque image, en enregistrant le résultat quelque part sur votre disque local.

Modifier

Si vous voulez juste faire une fois (comme dans, et non dans le cadre d'une application), mbeckish's answer fait le plus de sens.

+7

Certainement le plus simple. Si vous le pouvez, utilisez 'Parallel.ForEach()' pour accélérer votre téléchargement. – roufamatic

+0

'Parallel.ForEach()' Sweet - Je n'avais pas vu ça auparavant. –

+0

Je n'ai jamais entendu parler de ça non plus, je vais y jeter un coup d'oeil pour ma future référence :) Merci – leen3o

8

Vous pouvez utiliser un gestionnaire de téléchargement existant comme Orbit, plutôt que d'écrire votre propre programme à cette fin. (blasphème, je sais)

J'ai été plutôt satisfait d'Orbit. Il vous permet d'importer une liste de téléchargements à partir d'un fichier texte. Il va gérer les connexions, en téléchargeant des portions de chaque fichier en parallèle avec plusieurs connexions, pour augmenter la vitesse de chaque téléchargement. Cela prendra soin de réessayer si les connexions expirent, etc. Il semblerait que vous deviez faire beaucoup d'efforts pour construire ce genre de fonctionnalités à partir de zéro.

+1

Mais où est le plaisir dans tout ça? +1 –

+0

Je sais, je suis un tel killjoy. :-) – StriplingWarrior

+0

Excellent merci pour le conseil, jamais entendu parler d'Orbit avant :) – leen3o

6

S'il s'agit d'un travail ponctuel, une solution simple consisterait à écrire une page HTML avec des balises img pointant vers les URL.

Ensuite, parcourez-le avec FireFox et utilisez une extension pour enregistrer toutes les images dans un dossier.

+0

Duh. Fichier | Enregistrer la page Web (Complete) ... –

+0

Bonne idée merci :) Je vais essayer l'idée de wget et l'utiliser comme une sauvegarde – leen3o

1

partant de l'hypothèse que c'est un hors course une fois le projet et que vous êtes un novice avec d'autres technologies je suggère ce qui suit:

Plutôt que d'essayer de télécharger toutes les 3000 images dans une requête web faire un image par demande. Lorsque le téléchargement de l'image est terminé, redirigez vers la même page en passant l'URL de l'image suivante pour obtenir un paramètre de chaîne de requête. Téléchargez-le et répétez jusqu'à ce que toutes les images soient téléchargées.

Ce n'est pas ce que j'appellerais une solution de "production", mais si mon hypothèse est correcte, c'est une solution qui vous permettra de vous mettre en marche en un rien de temps.

Une autre solution relativement simple consisterait à créer une application console C# simple qui utilise WebClient pour télécharger chacune des images. Le code suivant psuedo devrait vous donner assez pour y aller:

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

vous seriez très probablement à l'aide de Parallel.ForEach() pour boucler sur ces imagesUrls –

0

J'ai écrit une application similaire dans WinForms qui boucle via des URL dans une feuille de calcul Excel et télécharge les fichiers d'image. Je pense que le problème que vous rencontrez avec cette implémentation en tant qu'application Web est que le serveur n'autorise l'exécution du processus que peu de temps avant l'expiration de la requête de votre navigateur. Vous pouvez soit augmenter cette durée dans le fichier web.config (changer l'attribut executionTimeout de l'élément httpRuntime), soit implémenter cette fonctionnalité en tant qu'application WinForms où la durée d'exécution longue ne sera pas un problème. Si c'est plus qu'une application jetable et que vous décidez d'aller sur la route WinForms, vous pouvez ajouter une barre de progression