コード例 #1
0
        /// <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);
        }