Загрузить все изображения с сайта - 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 );
} );
}
}
}