コード例 #1
0
        static void Main(string[] args)
        {
            // Tarkistetaan ovatko kaikki argumentit syötetty
            var options = new Options();

            if (CommandLine.Parser.Default.ParseArguments(args, options))
            {
                long programStartTime = Libs.GetUnixTimestamp();
                // Kaikki argumentit syötetty oikein. Jatketaan

                // Luodaan tiedosto XML-ia varten
                FileWriter.InitXmlFileStart(options.OutputFileName);

                Console.WriteLine("Populating categories"); // DEBUG
                Categories.PopulateCategories();

                Console.WriteLine("Downloader Init"); // DEBUG
                var downloader = new Downloader();

                Console.WriteLine("Parser Init"); // DEBUG
                var parser = new Parser();

                // Haetaan kaikki kategoriat annetun merkkijonon avulla
                List <Category> categories = options.CategoriesCommandLine != "all"
                    ? Categories.GetCategoriesByString(options.CategoriesCommandLine)
                    : Categories.GetAllCategories();
                Console.WriteLine("Categories total: {0}", categories.Count); // DEBUG

                // Parsataan haetut kategoriat
                foreach (Category category in categories)
                {
                    // Tehdään AJAX-kutsu
                    string stringResponse = downloader.MakePostRequest(category.AjaxUrl, category.AjaxBodyData);

                    // Haetaan kaikki tuotteet AJAX-kutsusta
                    List <Product> products = parser.ParseJsonUsingDynamicJson(stringResponse, downloader, options.SleepTime);
                    if (products != null && products.Count > 0)
                    {
                        // Kirjoitetaan tiedostoon
                        long startTime = Libs.GetUnixTimestamp();                      // DEBUG
                        Console.Write("Starting writing to file... ");                 // DEBUG
                        FileWriter.WritePartProductListToXmlFile(options.OutputFileName, products);
                        long endTime = Libs.GetUnixTimestamp();                        // DEBUG
                        Console.Write("Success, took: {0} ms\n", endTime - startTime); // DEBUG
                    }
                }

                long programEndTime = Libs.GetUnixTimestamp();
                Console.WriteLine("Everything done. Total time took: {0} seconds. Average iteration time: {1} ms.Exiting",
                                  (programEndTime - programStartTime) / 1000, BenchmarkList.Sum() / BenchmarkList.Count);
            }
        }
コード例 #2
0
        /**
         * Parsaa käyttäen DynamicJson-kirjastoa
         */
        public List <Product> ParseJsonUsingDynamicJson(string jsonString, Downloader downloaderObject, int sleepTime)
        {
            // Inits
            Console.WriteLine("in ParseJsonUsingDynamicJson"); // DEBUG
            var     products       = new List <Product>();     // Kaikki alikategorian tuotteet
            dynamic productsJson   = DynamicJson.Parse(jsonString).products;
            int     totalSize      = GetSize(productsJson);
            string  pageHtmlSource = "";

            Console.WriteLine("Total size: {0}", totalSize); // DEBUG

            // Iteroidaan tavaroita
            foreach (dynamic productJson in productsJson)
            {
                // Tuotteella url on null? Todennäköisesti virhe on tapahtunut, jatketaan seuraavalla.
                if (productJson.seoToken == null)
                {
                    continue;
                }


                long startTime = Libs.GetUnixTimestamp(); // DEBUG

                int itemsSize = GetSize(productJson.items);
                Console.WriteLine("productJson size: {0}", itemsSize); // DEBUG

                // Täytetään yleiset attribuutit. Tehdään pohja, jonka voi kloonata myöhemmin
                var productTemplate = new Product
                {
                    // nimi
                    Name = productJson.name,
                    // kuvan url
                    PictureUrl = Libs.PictureUrlPart + productJson.mainImage,
                    // url tuotteeseen
                    ProductUrl = Libs.MainSite + productJson.seoToken
                };

                Console.WriteLine("CURRENT: {0}", productTemplate.Name); // DEBUG

                // ladattu tuotteen sivun lähdekoodi. Varastoja ja valmistajaa varten
                pageHtmlSource = downloaderObject.MakeGetRequest(productTemplate.ProductUrl);
                var htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(pageHtmlSource);

                // Valmistaja jos on olemassa
                string   manufacturer     = "";
                HtmlNode manufacturerNode = htmlDocument.DocumentNode.SelectSingleNode("/html/body/div[2]/div[3]/main/section/a/img"); // xpath
                if (manufacturerNode != null)
                {
                    manufacturer = manufacturerNode.Attributes["alt"].Value;
                }

                // Iteroidaan erilaisia kappaleita
                foreach (dynamic item in productJson.items)
                {
                    // Kloonataan ja tehdään Product-objektin omilla attribuuteilla.
                    Product product = ObjectCopier.Clone(productTemplate);

                    // Täytetään
                    // Hinta
                    product.Price = Convert.ToDouble(Libs.GetMatches(item.priceHTML, @"\d+,\d+")[0].ToString());

                    // Tuotenumero
                    product.ProductNumber = Convert.ToInt64(item.partNumber.ToString());

                    // Erilaiset attribuutit tuotteella
                    var attributesDictionary = new Dictionary <string, string>();
                    foreach (dynamic attribute in item.attributes.defining)
                    {
                        //Console.WriteLine("Attr: {0}, Value: {1}", attribute.name, attribute.value.value); // DEBUG
                        string attributeName  = attribute.name.ToString();
                        string attributeValue = attribute.value.value;
                        attributesDictionary.Add(attributeName, attributeValue);
                    }
                    product.Attributes = attributesDictionary;

                    // Varastot
                    int      catentryId = Convert.ToInt32(item.catentryId); // Sen avulla tunnistaa oman varaston
                    HtmlNode node       = htmlDocument.GetElementbyId("availability-stores");
                    // Sivulla ei ole varastojen tietoja? Todennäköisesti joko virhesivu tai ei ole tietoja ollenkaan.
                    // Joka tapauksessa ei sovi meille.
                    if (node == null)
                    {
                        continue;
                    }
                    string  storeJsonValue         = node.Attributes["data-json"].Value;
                    dynamic correctStoreParsedJson = GetProductRelatedStoreJson(storeJsonValue, catentryId);
                    product.StoreInternet = Convert.ToInt32(correctStoreParsedJson.orderable);

                    Dictionary <string, int> storeValues = GetStoreValues(correctStoreParsedJson.ffcavl);
                    product.StoreLi        = storeValues["Li"];
                    product.StoreLahti     = storeValues["Lahti"];
                    product.StoreOulu      = storeValues["Oulu"];
                    product.StoreYlivieska = storeValues["Ylivieska"];

                    // Valmistaja. Voi olla tyhjä
                    product.Manufacturer = manufacturer;

                    PrintProductInformation(product); // DEBUG

                    // Lisätään listaan
                    products.Add(product);
                }

                int timeTook = (int)(Libs.GetUnixTimestamp() - startTime);
                MainEntryPoint.BenchmarkList.Add(timeTook);
                Console.WriteLine("Iteration complete. Took: {0} ms. Sleeping {1} ms\n", timeTook, sleepTime);
                System.Threading.Thread.Sleep(sleepTime);
            }

            return(products);
        }