예제 #1
0
        //LOADING TUTTI.CH SEARCH HTML AND CREATES OFFER LIST WITH HTMLAGILITYPACK WITH HEADLESSCHROME
        //OBSOLETE DOES NOT WORK ATM
        public List <Offer> loadNextract()
        {
            //TODO: CHROMESTUFF VIELLEICHT IN EIGENE KLASSE SCHIEBEN
            var chromeOptions = new ChromeOptions();

            chromeOptions.AddArguments(new List <string>()
            {
                "--silent-launch",
                "--no-startup-window",
                "no-sandbox",
                "headless",
            });

            var chromeDriverService = ChromeDriverService.CreateDefaultService();

            chromeDriverService.HideCommandPromptWindow = true;    // This is to hide the console.
            ChromeDriver driver = new ChromeDriver(chromeDriverService, chromeOptions);

            driver.Navigate().GoToUrl(this.url);
            //SCROLLING
            IJavaScriptExecutor jse = (IJavaScriptExecutor)driver;

            for (int second = 0; ; second++)
            {
                if (second >= 12)
                {
                    break;
                }
                jse.ExecuteScript("window.scrollBy(0, 480)", ""); //480px nach unten scrollen
                Thread.Sleep(300);
            }
            //TODO: CHROMESTUFF VIELLEICHT IN EIGENE KLASSE SCHIEBEN

            //HTMLDOCUMENT FROM HTML AGILITY PACK
            var doc = new HtmlDocument();

            doc.LoadHtml(driver.PageSource);

            HtmlNodeCollection htmlNodes = doc.DocumentNode.SelectNodes("//div[@class='_228GQ _3HmX7']");

            List <Offer> offers = new List <Offer>();

            //RUNS FOR EVERY "CLASS=_228GQ _3HmX7"-DIV FOUND IN THE ROOT HTML
            foreach (HtmlNode node in htmlNodes)
            {
                Offer offer = new Offer();

                //IN "CLASS=_228GQ _3HmX7"-DIV ARE THE INFOS FOR ID, PUBLISHED, PRICE, THUMB, TITLE, DESCRIPTION, LINK
                try
                {
                    offer.offer_id    = sanitize(node.SelectSingleNode("./div[@class='_1abn1 _2KsM3']").Id);
                    offer.published   = sanitize(node.SelectSingleNode("//*[@id='" + offer.offer_id + "']/div/div[1]/div[2]/span").InnerText);
                    offer.price       = sanitize(node.SelectSingleNode("//*[@id=" + offer.offer_id + "]/div/div[3]/strong").InnerText);
                    offer.thumb_url   = sanitize(node.SelectSingleNode("//*[@id=" + offer.offer_id + "]/a/div/img/@src").GetAttributeValue("src", string.Empty));
                    offer.title       = sanitize(node.SelectSingleNode("//*[@id=" + offer.offer_id + "]/div/div[2]/div/a/h4").InnerText);
                    offer.description = sanitize(node.SelectSingleNode("//*[@id=" + offer.offer_id + "]/div/div[2]/div/p").InnerText);
                    offer.link        = sanitize("https://tutti.ch" + node.SelectSingleNode("//*[@id=" + offer.offer_id + "]/div/div[2]/div/a/@href").GetAttributeValue("href", string.Empty));

                    offers.Add(offer);
                    Console.WriteLine(offer.ToString());
                }
                catch (NullReferenceException e)
                {
                    //PRO ENTRIES HAVE A DIFFENT XPATH "./div[@class='_1abn1 _2KsM3 _2g4HX']" THIS LEADS TO A NULLPOINTER-EXEPTION
                    Console.WriteLine(e.ToString());
                }
            }


            return(offers);
        }