/// <summary> /// Получение массива акций /// </summary> public static Offer[] GetArray(LoadingWindow lw) { Offer[] offerArray = { }; loadingWindow = lw; Offer[] oldOffers = Files.ReadOfferBase(); try // если папки нет, она создаётся. если есть, то ничего не делается { Directory.CreateDirectory(Constant.DATA_DIR_NAME); // нужна для хранения временных файлов } catch { } try { Directory.CreateDirectory(Constant.SMALL_PICS_DIR_NAME); // нужна для хранения изображений } catch { } int pageNumber = 0; // нужна для загрузки акций с нескольких страниц bool repeating = false; // нужна для проверки на повтор string[] hrefsWithoutRepeating = new string[0]; // нужна для хранения ссылок на уже загруженные акции Console.WriteLine("###### start loading ######"); while (!repeating) { pageNumber++; string html = DownloadPage(@"http://magnit-info.ru/buyers/actions/shops/" + "?PAGEN_2=" + pageNumber); if (html == "#error#") // проверка на присутствие интернет соединения { return(oldOffers); } var htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(html); var htmlNodes = htmlDoc.DocumentNode.SelectNodes("//div[attribute::class=\"promo-card__bottom promo-card__bottom_small\"]"); foreach (var node in htmlNodes) { string header = node.SelectSingleNode("*/div[attribute::class=\"promo-card__bottom-title\"]").InnerText; string body = node.SelectSingleNode("*/p").InnerText; string href = "http://magnit-info.ru" + node.SelectSingleNode("a").Attributes["href"].Value; if (!IsElemInArray(hrefsWithoutRepeating, href)) { Array.Resize(ref hrefsWithoutRepeating, hrefsWithoutRepeating.Length + 1); hrefsWithoutRepeating[hrefsWithoutRepeating.Length - 1] = href; } else { repeating = true; break; } string pattern = "//img[attribute::alt=\"" + header + "\"]"; string picHref = "http://magnit-info.ru/" + node.SelectSingleNode(pattern).Attributes["src"].Value; Offer newOffer = new Offer(); newOffer.header = header; newOffer.body = body; newOffer.largeBody = href; newOffer.picDirectory = picHref; // вместо подробного описания и локальной ссылки на картинку передаются ссылки на сайт // это нужно для возможности распараллелить загрузку подробных описаний акций // в блоке ниже ссылка на сайт заменяется локальной ссылкой или текстом Array.Resize(ref offerArray, offerArray.Length + 1); offerArray[offerArray.Length - 1] = newOffer; } Console.WriteLine("page #{0} loaded.", pageNumber); } Files.RemoveNonUsingPics(); foreach (Offer offer in offerArray) { LoadImagesAndTextFullAction(offer); } /* // заготовка для многопоточности * var thread = new Thread(LoadImagesAndTextFullAction); * foreach (Offer offer in offerArray) * { * thread.Start((object)offer); * thread = new Thread(LoadImagesAndTextFullAction); * } * while(thread.IsAlive) * { } */ Files.SaveOfferBase(offerArray); Console.WriteLine("###### loading done ######"); return(offerArray); }