Загрузить все изображения с сайта - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Подскажите, какими средствами .NET можно загрузить все изображения (все файлы картинок) с определенного сайта на винт. С сетью в C# работать еще не приходилось, но мне кажется это с помощью классов пространства имен System.Net делается. Подскажите, кто знает. Заранее благодарен

Решение задачи: «Загрузить все изображения с сайта»

textual
Листинг программы
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
 
namespace ConsoleApplicationTest {
    public static class Program {
        //*Парсим*теги*изображений
        private static readonly Regex ImgRegex = new Regex( @"\<img.+?src=\""(?<imgsrc>.+?)\"".+?\>",
            RegexOptions.ExplicitCapture | RegexOptions.Compiled );
 
        private static void Main() {
            var urls = new[] {
                "http://www.yandex.ru",
                "http://www.mail.ru",
                "http://pn.com.ua",
            };
 
            // Загружаем параллельно все сайты
            Parallel.ForEach( urls, DownloadFiles );
 
            Console.WriteLine( "Загрузка закончена" );
            Console.ReadKey();
        }
 
        private static void DownloadFiles( string site ) {
            string data;
            Console.WriteLine( site );
            Console.WriteLine( "Загрузка страницы" );
            using ( WebClient client = new WebClient() ) {
                using ( Stream stream = client.OpenRead( site ) ) {
                    using ( StreamReader reader = new StreamReader( stream ) ) {
                        data = reader.ReadToEnd();
                    }
                }
            }
 
            Console.WriteLine( "Загрузка картинок" );
 
            // Создаём директорию под картинки
            string directory = new Uri( site ).Host;
            if ( !Directory.Exists( directory ) ) {
                Directory.CreateDirectory( directory );
            }
 
            ImgRegex.Matches( data )
                .Cast<Match>()
                //*Данный*из*группы*регулярного*выражения
                .Select( m => m.Groups[ "imgsrc" ].Value.Trim() )
                // Удаляем повторяющиеся
                .Distinct()
                //*Добавляем*название*сайта,*если*ссылки*относительные
                .Select( url => url.Contains( "http://" ) ? url : (site + url) )
                //*Получаем*название*картинки
                .Select( url => new { url, name = url.Split( new[] { '/' } ).Last() } )
                //*Проверяем*его
                .Where( arg => Regex.IsMatch( arg.name, @"[^\s\/]\.(jpg|png|gif|bmp)\z" ) )
                // Параллелим на 6 потоков
                .AsParallel()
                .WithDegreeOfParallelism( 6 )
                // Загружаем асинхронно
                .ForAll( value => {
                    string savePath = Path.Combine( directory, value.name );
                    using ( WebClient localClient = new WebClient() ) {
                        localClient.DownloadFile( value.url, savePath );
                    }
                    Console.WriteLine( "{0} загружен", value.name );
                } );
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.667 из 5
Похожие ответы