public static PageSolverCEF GetInstance() { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new PageSolverCEF(); } } } return(_instance); }
/// <summary> /// Выполняет парсинг статей /// </summary> /// <param name="_articles">Список в который записываются новые спаршенные статьи</param> /// <returns></returns> public async Task ParseAsync(List <Article> _articles) { SetSettings(); HtmlParser htmlParser = new HtmlParser(); sources = new string[startUrls.Length]; documents = new IHtmlDocument[startUrls.Length]; //Получение страниц в виде строк for (int i = 0; i < startUrls.Length; i++) { switch (pageSolverType) { case PageSolverType.Not: sources[i] = await HtmlLoader.LoadAsync(startUrls[i]); break; case PageSolverType.IE: sources[i] = PageSolverIE.GetSolvedPage(startUrls[i], pageSolverTime); break; case PageSolverType.CEF: sources[i] = await PageSolverCEF.GetInstance().GetSolvedPage(startUrls[i]); break; } documents[i] = await htmlParser.ParseDocumentAsync(sources[i]); } IEnumerable <IElement> items; try { items = GetItems(); int succesArt = 0; int totalArt = items.Count(); foreach (var item in items) { Article article = new Article(); try { GetUrl(article, item); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetUrl. Источник: " + article.Url); } } //Загрузка страницы статьи try { switch (pageSolverType) { case PageSolverType.Not: source = await HtmlLoader.LoadAsync(article.Url); break; case PageSolverType.IE: source = PageSolverIE.GetSolvedPage(article.Url, pageSolverTime); break; case PageSolverType.CEF: source = await PageSolverCEF.GetInstance().GetSolvedPage(article.Url); break; } document = await htmlParser.ParseDocumentAsync(source); } catch { if (Settings.isDebag) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Ошибка при при загрузке страницы. Источник: " + article.Url); } } try { //Загрузка полной статьи GetBody(article, document); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetBody. Источник: " + article.Url); } } try { GetTitle(article, item, document); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetTitle. Источник: " + article.Url); } } try { GetSummary(article, item, document); //Обрезка символов string sum = article.Summary; article.Summary = new string(sum.Take(Settings.SummaryLength).ToArray()) + "..."; } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetSummary. Источник: " + article.Url); } } try { GetSourceName(article); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetSourceName. Источник: " + article.Url); } } try { GetSourceUrl(article); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetSourceUrl. Источник: " + article.Url); } } try { GetDateTime(article, item, document); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetDateTime. Источник: " + article.Url); } } try { GetUrlMainImg(article, item, document); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetUrlMainImg. Источник: " + article.Url); } } try { GetViews(article, item, document); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetViews. Источник: " + article.Url); } } try { GetTags(article, item, document); } catch { if (Settings.isDebag) { Console.WriteLine("Ошибка при парсинге GetTags. Источник: " + article.Url); } } if (ArticleIsFull(article)) { _articles.Add(article); succesArt++; } } Console.WriteLine(DateTime.Now.ToString() + ": Получено статей: " + succesArt + "/" + totalArt + " из " + startUrls[0]); } catch { if (Settings.isDebag) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Ошибка при загрузке статей с главной страницы. Источник: " + startUrls[0]); } else { Console.WriteLine("Ошибка при загрузке статей с главной страницы. Источник: " + startUrls[0]); } } //Проверка на дубликаты и их удаление _articles = _articles.GroupBy(a => a.Url).Select(g => g.First()).ToList(); }