/// <summary> /// Рабочий процесс /// </summary> private async void Worker() { Groups = await GroupsCollection.GetGroupsCollection(); InventItems = await InventCollection.GetInventCollection(Groups); OnParsingCompleted?.Invoke(this); }
/// <summary> /// Загрузка всей структуры групп товаров /// </summary> /// <returns>Список групп товаров</returns> public static async Task <GroupsCollection> GetGroupsCollection() { GroupsCollection groupsCollection = new GroupsCollection(); if (await groupsCollection.Loader.LoadPageAsync(groupsCollection.Url)) { // Для разбора наименования группы string pattern = @"^(?<name>[^<]+)"; Regex regex = new Regex(pattern); Match match; string categoryName; var catalogBlockList = groupsCollection.Loader.Document.QuerySelectorAll("div") .Where(item => item.ClassName != null && item.ClassName.Contains("category")); foreach (IHtmlDivElement catalogBlock in catalogBlockList) { if (!SiteWorker.CURRENT_INSTANCE.IsActive) { return(groupsCollection); } IHtmlAnchorElement catalogAnchor = (IHtmlAnchorElement)catalogBlock.QuerySelectorAll("a").FirstOrDefault(); if (catalogAnchor != null) { IHtmlParagraphElement catalogLabel = (IHtmlParagraphElement)catalogAnchor.QuerySelectorAll("p").FirstOrDefault(); if (catalogLabel != null) { match = regex.Match(catalogLabel.InnerHtml); if (match.Success) { categoryName = match.Groups["name"].Value.Trim(); Group groupItem = new Group(categoryName, Site.PrepareUrl(catalogAnchor.Href.Trim())); groupsCollection.Groups.Add(groupItem); // Добавление корневой группы groupItem.RegisterGroup(); // Загрузка дочерних групп GroupsCollection subgroupsCollection = await groupItem.GetSubgroupsCollection(); groupsCollection.Groups.AddRange(subgroupsCollection); } } } } // Обновление уровней подчинённости в таблице групп groupsCollection.UpdateDBParents(); } else { string logMessage = @"Ошибка при загрузке страницы: {0}"; SiteWorker.CURRENT_INSTANCE.Log = String.Format(logMessage, groupsCollection.Url); SiteWorker.CURRENT_INSTANCE.Stop(); } return(groupsCollection); }
/// <summary> /// Возвращает дочерние группы товаров /// </summary> /// <returns>Коллекция подгрупп текущей группы товаров</returns> public async Task <GroupsCollection> GetSubgroupsCollection() { GroupsCollection groupsCollection = new GroupsCollection(); if (await Loader.LoadPageAsync(Url)) { // Для разбора наименования группы string pattern = @"^(?<name>[^<]+)"; Regex regex = new Regex(pattern); Match match; string subUrl, categoryName; // Получение коллекций списков субкатегорий var subcategoryListsCollection = Loader.Document.QuerySelectorAll("ul") .Where(item => item.ClassName != null && item.ClassName.Contains("scroll-pane")); foreach (IHtmlUnorderedListElement subcategoryList in subcategoryListsCollection) { // Перебор подкатегорий var anchorsList = subcategoryList.QuerySelectorAll("a"); foreach (IHtmlAnchorElement anchorItem in anchorsList) { subUrl = Site.BASE_URL + anchorItem.PathName; if (subUrl.Length > Url.Length && Url == subUrl.Substring(0, Url.Length)) { match = regex.Match(anchorItem.InnerHtml); if (match.Success) { categoryName = match.Groups["name"].Value.Trim(); Group groupItem = new Group(categoryName, subUrl, this); groupsCollection.Groups.Add(groupItem); groupItem.RegisterGroup(); } } } } } return(groupsCollection); }
/// <summary> /// /// </summary> /// <returns></returns> public static async Task <InventCollection> GetInventCollection(GroupsCollection __groupsCollection) { InventCollection inventCollection = new InventCollection(); // Под выборку попадают только группы без подчинённых групп foreach (Group group in __groupsCollection) { if (__groupsCollection.GetChildAmount(group) == 0) { // Перебираем страницы с товарами категории string nextUrl = group.Url; while (nextUrl.Length > 0) { if (!SiteWorker.CURRENT_INSTANCE.IsActive) { return(inventCollection); } if (await group.Loader.LoadPageAsync(nextUrl)) { // Перебор товарных позиций var catalogItemsList = group.Loader.Document.QuerySelectorAll("div") .Where(item => item.ClassName != null && item.ClassName.Contains("bx_catalog_item")); foreach (IHtmlDivElement catalogItem in catalogItemsList) { if (!SiteWorker.CURRENT_INSTANCE.IsActive) { return(inventCollection); } // Определение ссылки на товар IHtmlAnchorElement catalogItemAnchor = (IHtmlAnchorElement)catalogItem.QuerySelectorAll("a") .Where(item => item.ClassName != null && item.ClassName.Contains("img-cont")) .FirstOrDefault(); if (catalogItemAnchor != null) { string catalogItemUrl = Site.PrepareUrl(catalogItemAnchor.Href.Trim()); InventItem inventItem = new InventItem(group, catalogItemUrl); if (await inventItem.FillByUrl()) { if (inventCollection.Items.Count > 200) { inventCollection = new InventCollection(); } inventCollection.Items.Add(inventItem); } } } // Поиск перехода к следующей странице IHtmlAnchorElement nextAnchor = (IHtmlAnchorElement)group.Loader.Document.QuerySelectorAll("a") .Where(item => item.ClassName != null && item.ClassName.Contains("modern-page-next") && item.TextContent.Trim() == @"След.") .FirstOrDefault(); if (nextAnchor != null) { nextUrl = Site.PrepareUrl(nextAnchor.Href.Trim()); } else { nextUrl = ""; } } else { string logMessage = @"Ошибка при загрузке страницы: {0}"; SiteWorker.CURRENT_INSTANCE.Log = String.Format(logMessage, nextUrl); SiteWorker.CURRENT_INSTANCE.Stop(); nextUrl = ""; } } } } return(inventCollection); }