public static PageSolverCEF GetInstance()
 {
     if (_instance == null)
     {
         lock (_lock)
         {
             if (_instance == null)
             {
                 _instance = new PageSolverCEF();
             }
         }
     }
     return(_instance);
 }
Exemple #2
0
        /// <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();
        }