예제 #1
0
        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()}");
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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();
        }