Скачать 3000+ изображений с помощью C #? - PullRequest
5 голосов
/ 14 декабря 2010

У меня есть список из примерно 3000 URL-адресов изображений, где мне нужно загрузить их на свой рабочий стол.

Я веб-разработчик, поэтому, естественно, написал небольшой метод загрузки asp.net c #, чтобы сделать это, но произошла очевидная проблема, и время ожидания страницы истекло, прежде чем я едва получил какой-либо из них.

Интересно, знает ли кто-нибудь еще о хорошем, быстром и надежном способе циклически просматривать все URL-адреса изображений и загружать их в папку?Открыты для любых предложений, WinForms, командный файл, хотя я новичок в обоих.

Любая помощь очень ценится

Ответы [ 6 ]

11 голосов
/ 14 декабря 2010

А как насчет wget ?Может загружать список URL, указанный в файле.

wget -i c:\list-of-urls.txt
11 голосов
/ 14 декабря 2010

Напишите приложение командной строки C # (или Winforms, если вы этого хотите) и используйте класс WebClient для извлечения файлов.

Вот несколько руководств:

C # WebClient Tutorial

Использование WebClient для загрузки файла

или только Google C # WebClient .

Вам нужно будет либо предоставить список файлов для загрузки и выполнить цикл по списку, выполнив запрос для каждого файла и сохранив результат, либо выполнив запрос для страницы индекса, проанализируйте его, используя что-то вроде HTML Agility Pack , чтобы найти все теги изображений, а затем выполнить запрос для каждого изображения, сохранив результат где-нибудь на локальном диске.

Редактировать

Если вы просто хотите сделать это один раз (например, не как часть приложения), mbeckish ответ имеет смысл.

8 голосов
/ 14 декабря 2010

Возможно, вы захотите использовать существующий менеджер загрузок, такой как Orbit, вместо того, чтобы писать собственную программу для этой цели. (богохульство, я знаю)

Я был очень счастлив с Орбитой. Это позволяет импортировать список загрузок из текстового файла. Он будет управлять подключениями, загружая части каждого файла параллельно с несколькими подключениями, чтобы увеличить скорость каждой загрузки. Он попытается повторить попытку, если время соединения истекло, и т. Д. Похоже, вам придется приложить немало усилий для создания такого рода функций с нуля.

6 голосов
/ 14 декабря 2010

Если это просто разовая работа, то одним из простых решений было бы написать HTML-страницу с тегами img, указывающими на URL-адреса.

Затем просмотрите ее с помощью FireFox и используйте расширение, чтобы сохранить всеизображений в папку.

1 голос
/ 14 декабря 2010

Исходя из предположения, что это однократный проект, и, поскольку вы новичок в других технологиях, я бы предложил следующее:

Вместо того, чтобы пытаться загрузить все 3000 изображений в одном веб-запросе, сделайте одно изображение на запрос. Когда загрузка изображения завершена, перенаправьте на ту же страницу, передав URL следующего изображения, чтобы получить в качестве параметра строки запроса. Загрузите его и повторяйте до тех пор, пока не будут загружены все изображения.

Не то, что я бы назвал «производственным» решением, но если мое предположение верное, то это решение, которое поможет вам быстро запустить.

Другим довольно простым решением было бы создать простое консольное приложение C #, которое использует WebClient для загрузки каждого из изображений. Следующий код псевдо должен дать вам достаточно для начала:

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 голосов
/ 14 декабря 2010

Я написал подобное приложение в WinForms, которое просматривает URL-адреса в электронной таблице Excel и загружает файлы изображений.Я думаю, что у них есть проблема с реализацией этого в качестве веб-приложения в том, что сервер позволяет запускать процесс только в течение короткого промежутка времени, прежде чем истечет время ожидания запроса от вашего браузера.Вы можете увеличить это время в файле web.config (изменить атрибут executeTimeout элемента httpRuntime) или реализовать эту функцию как приложение WinForms, где длительное время выполнения не будет проблемой.Если это больше, чем одноразовое приложение, и вы решили пойти по пути WinForms, вы можете добавить индикатор выполнения в ind

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...