async Task LoadPageAsync(Domain domain, Page page) { page.isStartedDownload = true; var httpClient = new HttpClient(); HttpResponseMessage response; if (domain.crawlDelay > 0) { while (domain.isLock) { Thread.Sleep(100); } Lock(domain); } response = await httpClient.GetAsync(page.url); if (response.StatusCode == HttpStatusCode.OK) { Console.WriteLine(page.url); log.Add($"{DateTime.Now.ToString()}\t OK\t {page.url}"); page.content = await response.Content.ReadAsStringAsync(); page.isDownloaded = true; domain.AddPages(page.GetLinks()); WorkWithFile.SavePage(domain, page, outPath); } else { log.Add($"{DateTime.Now.ToString()}\tERR\t {page.url} !Ошибка: {response.StatusCode.ToString()}"); } }
public async Task LoadDomains(Domain[] domains) { List <Task> tasks = new List <Task>(); int pages; do { pages = 0; foreach (var domain in domains) { if (!domain.IsAvailable()) { continue; } tasks.Add(LoadDomain(domain)); pages += domain.GetPages(1).Count(); } await Task.WhenAll(tasks); }while (pages > 0); WorkWithFile.saveLog(log, outPath); }
static void Main(string[] args) { //Console.WriteLine("Запущенных потоков: " + System.Diagnostics.Process.GetCurrentProcess().Threads.Count.ToString()); Console.WriteLine("WebDownloader\n"); Console.WriteLine("Введите имя файла со списком доменов \n(Для загрузки из файла по умолчанию (d:\\domains.txt) \nоставьте строку пустой и нажмите Enter): "); string inputPath = Console.ReadLine(); if (inputPath == string.Empty) { inputPath = "d:\\domains.txt"; } Console.WriteLine("Укажите путь для выходных данных \n(Чтобы использовать путь по умолчанию (d:\\downloaded_sites\\) \nоставьте строку пустой и нажмите Enter: "); string outputPath = Console.ReadLine(); if (outputPath == string.Empty) { outputPath = "d:\\downloaded_sites\\"; } Stopwatch sw = new Stopwatch(); sw.Start(); Domain[] domains; try { domains = CreateDomains(WorkWithFile.GetDomains(inputPath)); Console.WriteLine("Выполняется загрузка..."); TaskAsyncManager downloadManager = new TaskAsyncManager(outputPath); downloadManager.SetCrawlDelaysAsync(domains).Wait(); downloadManager.LoadDomains(domains).Wait(); } catch (Exception e) { Console.WriteLine(e.Message); Console.Write("Для завершения работы программы нажмите любую клавишу..."); Console.ReadKey(); return; } sw.Stop(); Console.WriteLine(); Console.WriteLine("-------"); Console.WriteLine("Загрузка успешно завершена:"); Console.WriteLine($"-входной файл: {inputPath}"); Console.WriteLine($"-выходная директория: {outputPath}"); Console.WriteLine($"-лог загрузки: {outputPath}log.txt"); Console.WriteLine($"-обнаружено доменов: {domains.Count()}"); int totalDownLoadedPages = 0; int totalPages = 0; foreach (Domain domain in domains) { Console.WriteLine($"\t{domain.name}\tCrawl-delay: { domain.crawlDelay}" + $"\tЗагружено страниц: {domain.pages.Select(u => u.Value).Where(u => u.isDownloaded).ToList().Count()}/{domain.pages.Count}"); totalDownLoadedPages += domain.pages.Select(u => u.Value).Where(u => u.isDownloaded).ToList().Count; totalPages += domain.pages.Count; } Console.WriteLine($"-всего загружено страниц: {totalDownLoadedPages}/{totalPages}"); Console.WriteLine($"-время выполнения: {(sw.ElapsedMilliseconds / 1000.0).ToString()}с"); //Console.WriteLine("Запущенных потоков: " + System.Diagnostics.Process.GetCurrentProcess().Threads.Count.ToString()); Console.WriteLine(); Console.Write("Для завершения работы программы нажмите любую клавишу..."); Console.ReadKey(); }