Загрузить все изображения с сайта - 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 ); } ); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д