2010-12-14 11 views
5

Mam listę około 3000 adresów URL obrazów, w których muszę pobrać je na mój pulpit.Pobierz 3000+ obrazów przy użyciu C#?

Jestem web dev, więc naturalnie napisałem trochę metody pobierania asp.net C#, aby to zrobić, ale oczywisty problem się wydarzył, a strona przekroczyła limit czasu, zanim prawie żadna z nich nie powstała.

Zastanawiasz się, czy ktoś inny wiedział o dobrym, szybkim i niezawodnym sposobie przechodzenia przez wszystkie adresy URL zdjęć i pobierania ich do folderu? Otwarte na wszelkie sugestie, WinForm, plik wsadowy, chociaż jestem początkującym w obu.

Każda pomoc mile widziana

Odpowiedz

11

Co z numerem wget? Może pobrać listę adresów URL określonych w pliku.

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

Awesome dziękuję, użyłem tego wcześniej, ale dla uzyskania strony internetowej – leen3o

+3

To prawdopodobnie nie wpłynie na ciebie, ale bądź świadomy, że starsze wersje wget stają się bardziej atrakcyjne, gdy rozmiar pobierania przekracza 2 (lub może 4) gigabajty. Połączenie z wersją prawie na pewno ucierpi na tym problemie. http://users.ugent.be/~bpuype/wget/ jest bardziej aktualny. – spender

+0

@spender: Zaktualizowano link bezpośrednio do projektu GnuWin32: http://gnuwin32.sourceforge.net/packages/wget.htm – Richard

11

Napisz aplikację wiersza poleceń C# (lub WinForm, jeśli to twoja skłonność) i użyć klasy WebClient do pobierania plików.

Oto kilka tutoriali:

C# WebClient Tutorial

Using WebClient to Download a File

lub just Google C# WebClient.

Należy podać listę plików do pobrania i przeglądać listę, wydać żądanie dla każdego pliku i zapisać wynik, lub wysłać zapytanie o stronę indeksu, przeanalizować za pomocą czegoś takiego jak HTML Agility Pack znajdź wszystkie tagi graficzne, a następnie wyślij żądanie dla każdego obrazu, zapisując wynik gdzieś na dysku lokalnym.

Edit

Jeśli tylko chcesz to zrobić raz (jak w, nie jako część wniosku), mbeckish's answer największy sens.

+7

Zdecydowanie najłatwiejszy. Jeśli możesz, użyj 'Parallel.ForEach()', aby przyspieszyć pobieranie. – roufamatic

+0

'Parallel.ForEach()' Słodko - nie widziałem tego wcześniej. –

+0

Ja też nigdy o tym nie słyszałem, idę i zobaczę to dla mojej przyszłej referencji :) Dzięki – leen3o

8

Możesz użyć istniejącego menedżera pobierania, takiego jak Orbit, zamiast pisać własny program do tego celu. (bluźnierstwo, wiem)

Jestem bardzo zadowolony z Orbit. Umożliwia importowanie listy pobrań z pliku tekstowego. Będzie zarządzał połączeniami, pobierając porcje każdego pliku równolegle z wieloma połączeniami, aby zwiększyć szybkość każdego pobierania. Zajmie się ponownymi próbami, jeśli czas połączenia się skończy itp. Wygląda na to, że trzeba będzie sporo wysiłku, aby zbudować tego rodzaju funkcje od zera.

+1

Ale gdzie jest w tym zabawa? +1 –

+0

Wiem, jestem taki szczęśliwy. :-) – StriplingWarrior

+0

Bardzo dziękuję za napiwek, nigdy przed Orbitem nie słyszałem :) – leen3o

6

Jeśli jest to jednorazowa praca, jednym z łatwych rozwiązań byłoby napisanie strony HTML z tagami img wskazującymi adresy URL.

Następnie przeglądaj go za pomocą FireFox i użyj rozszerzenia, aby zapisać wszystkie obrazy w folderze.

+0

Duh. Plik | Zapisz stronę WWW (ukończono) ... –

+0

Dobry pomysł, dziękuję :) Wypróbuję pomysł wget i użyję go jako kopii zapasowej – leen3o

1

Praca na założeniu, że jest to jeden rozbiegu po projekcie i jak jesteś początkującym z innymi technologiami Proponuję następujące:

zamiast próbować pobrać wszystkie 3000 zdjęć w jednym żądaniu internetowej wykonaj jedną obraz na żądanie. Po zakończeniu pobierania obrazu przekieruj do tej samej strony, podając adres URL następnego obrazu, aby uzyskać parametr ciągu zapytania. Pobierz go, a następnie powtarzaj, aż wszystkie obrazy zostaną pobrane.

Nie to, co bym nazwał rozwiązaniem "produkcyjnym", ale jeśli moje założenie jest poprawne, jest to rozwiązanie, które przyspiesza działanie.

Innym dość prostym rozwiązaniem byłoby stworzenie prostej aplikacji konsoli C#, która używa WebClient do pobrania każdego z obrazów. Poniższy kod psuedo powinien dać ci tyle, aby zacząć zabawę:

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

prawdopodobnie zajrzysz do korzystania z Parallel.ForEach() do zapętlenia się nad tymi obrazamiUrls –

0

pisałem podobną aplikację w WinForms że pętle poprzez adresy URL w arkuszu kalkulacyjnym Excel i pobiera pliki obrazów. Wydaje mi się, że mają problem z zaimplementowaniem tej aplikacji internetowej, ponieważ serwer zezwala tylko na to, aby proces działał przez krótki czas, zanim żądanie przeglądarki przekroczy limit czasu. Można zwiększyć ten czas w pliku web.config (zmienić atrybut executionTimeout elementu httpRuntime) lub zaimplementować tę funkcjonalność jako aplikację WinForm, w której długi czas wykonania nie będzie stanowić problemu. Jeśli jest to więcej niż aplikacja do odrzucania i zdecydujesz się na przejście do trasy WinForms, możesz dodać pasek postępu do ind

Powiązane problemy