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); } }
/** * 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); }