protected override void RadiObradu()
 {
     while (radi)
     {
         Strana strana = procitaneStrane.Uzmi(typeof(StranaZaglavlja).Name);
         if (strana != null)
         {
             List <string> adreseOglasa = strana.DajAdreseOglasa();
             if (adreseOglasa != null)
             {
                 foreach (string adresa in adreseOglasa)
                 {
                     Strana stranaOglasa = new StranaOglasa(adresa);
                     procitaneStraneOglasa.Dodaj(stranaOglasa);
                     if (!radi)
                     {
                         return;
                     }
                 }
                 Dnevnik.PisiSaThredom("Obrađeno je zaglavlje: " + strana.Adresa);
             }
             else
             {
                 Dnevnik.PisiSaThredomGreska("Nije obrađena strana zaglavlja: " + strana.Adresa);
             }
         }
     }
 }
Example #2
0
 protected override void RadiObradu()
 {
     while (radi)
     {
         StranaOglasa stranaOglasa = procitaneStrane.Uzmi() as StranaOglasa;
         if (stranaOglasa != null)
         {
             Common.Model.Vehicle.Automobile auto = null;
             try
             {
                 if (stranaOglasa.Procitaj())
                 {
                     auto = stranaOglasa.Automobil;
                     if (auto != null)
                     {
                         autoDB.Save(auto);
                         Dnevnik.PisiSaImenomThreda("Dodat oglas u bazu: " + auto.ToString());
                     }
                 }
                 else
                 {
                     Dnevnik.PisiSaThredomGreska("Nisam uspeo da pročitam stranu. URL: " + stranaOglasa.Adresa);
                 }
             }
             catch (Exception ex)
             {
                 EventLogger.WriteEventError(string.Format("Nisam uspeo da dodam automobil (br.ogl.{0}) u bazu.\nURL: {1}", auto.BrojOglasa, stranaOglasa.Adresa), ex);
             }
         }
         else
         {
             EventLogger.WriteEventWarning("Dobijena null vrednost za stranu iz liste procitanih strana. Proveri zasto.");
         }
     }
 }
Example #3
0
        protected override void RadiObradu()
        {
            AutomobiliDBQueue red = new AutomobiliDBQueue();

            while (radi)
            {
                Strana strana = procitaneStrane.Uzmi(typeof(StranaOglasa).Name);
                if (strana != null)
                {
                    if (strana is StranaOglasa)
                    {
                        try
                        {
                            if (strana.Procitaj())
                            {
                                Common.Vozilo.Automobil auto = ((StranaOglasa)strana).Automobil;
                                if (auto != null)
                                {
                                    autoDB.Snimi(auto); // upis u bazu
                                    //autoDB.Snimi2(auto); // upis u bazu
                                    //red.Dodaj(auto);
                                    Dnevnik.PisiSaThredom("Dodat oglas u bazu: " + auto.ToString());
                                }
                            }
                            else
                            {
                                Dnevnik.PisiSaThredomGreska("Nisam uspeo da pročitam stranu. URL: " + strana.Adresa);
                            }
                        }
                        catch (Exception ex)
                        {
                            Common.Korisno.Korisno.LogujGresku("Nisam uspeo da dodam automobil u bazu. URL: " + strana.Adresa, ex);
                        }
                    }
                }
            }
            red.Snimi();
        }
Example #4
0
        protected override void OnStart(string[] args)
        {
            base.OnStart(args); // Da li je ovo potrebno?
            //pozovi thread
            obrada = new GlavnaObrada(null);
            try
            {
                string poruka = "Pokrecem servis.";
                //EventLogger.WriteEventInfo(poruka);
                Dnevnik.PisiSaImenomThreda(poruka);

                obrada.Start();

                poruka = "Servis je pokrenut.\n" + obrada.ToString();
                EventLogger.WriteEventInfo(poruka);
                Dnevnik.PisiSaImenomThreda(poruka);
            }
            catch (Exception ex)
            {
                string poruka = "Nisam uspeo da pokrenem servis.";
                EventLogger.WriteEventError(poruka, ex);
                Dnevnik.PisiSaThredomGreska(poruka);
            }
        }
 protected override void RadiObradu()
 {
     while (radi)
     {
         Strana strana = procitaneStrane.Uzmi(); // base property, strane zaglavlja.
         //Console.WriteLine(strana.Adresa); //
         if (strana != null)
         {
             List <string> adreseOglasa = strana.DajAdreseOglasa();
             if (adreseOglasa != null)
             {
                 if (adreseOglasa.Count != 0)
                 {
                     foreach (string adresa in adreseOglasa)
                     {
                         Strana stranaOglasa = new StranaOglasa(adresa);
                         procitaneStraneOglasa.Dodaj(stranaOglasa);
                         if (!radi)
                         {
                             return;
                         }
                     }
                     Dnevnik.PisiSaImenomThreda("Obrađeno je zaglavlje: " + strana.Adresa);
                 }
                 else
                 {
                     brojacStranaZaglavlja.Ponisti();
                 }
             }
             else
             {
                 Dnevnik.PisiSaThredomGreska("Nije obrađena strana zaglavlja: " + strana.Adresa);
             }
         }
     }
 }
Example #6
0
        private string DajPodatakIzDokumenta(ref HtmlAgilityPack.HtmlDocument dok, PodaciOAutomobilu tipPodatka, string[] nazivPodatka, string podrVred)
        {
            // odredjivanje stringa za pretragu
            string putanja = string.Empty;

            switch (tipPodatka)
            {
            case PodaciOAutomobilu.OpsteInformacije:
            case PodaciOAutomobilu.DodatneInformacije:
                putanja = "//*[@id=\"tbl-details\"]";
                break;

            case PodaciOAutomobilu.Sigurnost:
            case PodaciOAutomobilu.Oprema:
                putanja = string.Empty;
                break;

            case PodaciOAutomobilu.Opis:
                putanja = "//*[@id=\"tab_bg\"]/div[1]";
                break;

            case PodaciOAutomobilu.Kontakt:
                putanja = "//*[@id=\"details-agency\"]/div[1]";
                break;
            }
            if (putanja.Equals(string.Empty))
            {
                return(string.Empty);
            }

            // citanje cvora iz putanje
            HtmlAgilityPack.HtmlNodeCollection nodeColl;
            try
            {
                nodeColl = dok.DocumentNode.SelectNodes(putanja);
            }
            catch (Exception ex)
            {
                Dnevnik.PisiSaThredomGreska("Greska pri citanju HTML cvora na putanji " + putanja);
                return(string.Empty);
            }

            // odredjivanje podatka
            switch (tipPodatka)
            {
            case PodaciOAutomobilu.OpsteInformacije:
                if (nodeColl != null && nodeColl[0].ChildNodes != null)
                {
                    foreach (HtmlAgilityPack.HtmlNode node in nodeColl[0].ChildNodes)
                    {
                        if (node.ChildNodes.Count > 0)
                        {
                            foreach (string nazPod in nazivPodatka)
                            {
                                if (node.ChildNodes[1].InnerHtml.Trim().ToLower().Contains(nazPod.ToLower()))
                                {
                                    return(node.ChildNodes[3].InnerHtml.Trim());
                                }
                            }
                        }
                    }
                }
                else
                {
                    Dnevnik.PisiSaThredom("Nema cele tabele.");
                }
                return(podrVred);

                break;

            case PodaciOAutomobilu.DodatneInformacije:
                if (nodeColl != null && nodeColl[1].ChildNodes != null)
                {
                    foreach (HtmlAgilityPack.HtmlNode node in nodeColl[1].ChildNodes)
                    {
                        if (node.ChildNodes.Count > 0)
                        {
                            foreach (string nazPod in nazivPodatka)
                            {
                                if (node.ChildNodes[1].InnerHtml.Trim().ToLower().Contains(nazPod.ToLower()))
                                {
                                    return(node.ChildNodes[3].InnerHtml.Trim());
                                }
                            }
                        }
                    }
                }
                else
                {
                    Dnevnik.PisiSaThredom("Nema cele tabele.");
                }
                return(podrVred);

                break;

            case PodaciOAutomobilu.Sigurnost:
            case PodaciOAutomobilu.Oprema:
                break;

            case PodaciOAutomobilu.Opis:
                if (nodeColl != null && nodeColl.Count > 0)
                {
                    foreach (HtmlAgilityPack.HtmlNode node in nodeColl[0].ChildNodes)
                    {
                        if (node.ChildNodes != null && node.ChildNodes.Count > 1 &&
                            node.ChildNodes[1].InnerHtml.Trim().ToLower().Equals("opis"))
                        {
                            if (node.ChildNodes.Count >= 3)
                            {
                                return(node.ChildNodes[3].InnerHtml);
                            }
                        }
                    }
                }
                return(podrVred);

            case PodaciOAutomobilu.Kontakt:
                if (nodeColl != null && nodeColl.Count > 0)
                {
                    return(Common.Korisno.Korisno.TrimMultiline(nodeColl[0].InnerText));
                }
                break;
            }
            return(String.Empty);
        }
        public static Model.Vehicle.Automobile ParseAutomobileAd(string HtmlContent, string address)
        {
            string     Sadrzaj    = HtmlContent;
            Automobile automobile = null;

            if (!string.IsNullOrWhiteSpace(Sadrzaj))
            {
                HtmlAgilityPack.HtmlDocument dok = new HtmlAgilityPack.HtmlDocument();
                try
                {
                    dok.LoadHtml(Sadrzaj);
                    StringBuilder greske = new StringBuilder();
                    HtmlAgilityPack.HtmlNodeCollection nodeCol;

                    // provera da li je strana pronadjena
                    nodeCol = dok.DocumentNode.SelectNodes("/html/body/div[2]/div[1]/p[1]");
                    if (nodeCol != null && nodeCol[0].InnerHtml.Trim().ToUpper().Equals("404".ToUpper()))
                    {
                        return(automobile);
                    }

                    #region Zaglavlje
                    string naslov = string.Empty;
                    try
                    {
                        nodeCol = dok.DocumentNode.SelectNodes("id('main_content')/div[8]/h1");
                        if (nodeCol != null)
                        {
                            naslov = nodeCol[0].InnerHtml.Trim();
                        }
                        else
                        {
                            naslov = "Bez naslova";
                        }
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje naslov: " + ex.Message);
                    }

                    float cena = 0;
                    try
                    {
                        string cenaStr = dok.DocumentNode.SelectNodes("id('main_content')/div[9]/div[1]/div[1]/span")[0].InnerHtml.Trim();
                        if (cenaStr.ToLower().Equals("na upit") || cenaStr.ToLower().Equals("po dogovoru"))
                        {
                            cena = 0;
                        }
                        else
                        {
                            cena = float.Parse(cenaStr.Substring(0, cenaStr.IndexOf(" ")).Replace(".", ""));
                        }
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje cena: " + ex.Message);
                    }
                    #endregion Zaglavlje

                    #region Opste

                    var nodeOpste = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") &&
                                                                              div.Attributes["class"].Value.Equals("basic-info")).First();
                    int listItemIndex = 1;

                    string vozilo = string.Empty;
                    try
                    {
                        vozilo = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim();
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje vozilo: " + ex.Message);
                    }

                    string marka = string.Empty;
                    try
                    {
                        marka = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim();
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje marka: " + ex.Message);
                    }

                    string model = string.Empty;
                    try
                    {
                        model = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim();
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje model: " + ex.Message);
                    }

                    int godinaProizvodnje = 0;
                    try
                    {
                        godinaProizvodnje = int.Parse(nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Substring(0, 4));
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje 'Godina proizvodnje': " + ex.Message);
                    }

                    int kilometraza = 0;
                    try
                    {
                        string kmStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex + "]")[0].InnerHtml.Trim();
                        kmStr = kmStr.Replace(" km", string.Empty).Replace(".", string.Empty).Trim();
                        if (kmStr.All(c => char.IsDigit(c)))
                        {
                            kilometraza = int.Parse(kmStr);
                            listItemIndex++;
                        }
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje 'Kilometraža': " + ex.Message);
                    }

                    string karoserija = string.Empty;
                    try
                    {
                        karoserija = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim();
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje karoserija: " + ex.Message);
                    }

                    string gorivo = string.Empty;
                    try
                    {
                        gorivo = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim();
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje gorivo: " + ex.Message);
                    }

                    int kubikaza = 0;
                    try
                    {
                        string kubikazaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace(" cm3", string.Empty);
                        if (kubikazaStr.Contains("Atestiran do:"))
                        {
                            kubikazaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace(" cm3", string.Empty);
                        }
                        kubikaza = int.Parse(kubikazaStr);
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje kubikaža: " + ex.Message);
                    }

                    int snagaKW = 0;
                    int snagaKS = 0;
                    try
                    {
                        string snaga = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace(" (kW/KS)", string.Empty);
                        snagaKW = int.Parse(snaga.Remove(snaga.IndexOf('/')));
                        snagaKS = int.Parse(snaga.Remove(0, snaga.IndexOf('/') + 1));;
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje 'Snaga': " + ex.Message);
                    }

                    bool fiksnaCena = false;
                    try
                    {
                        string fiksnaCenaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim();
                        fiksnaCena = fiksnaCenaStr.ToLower() != "Cena nije fiksna".ToLower();
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje fiksnaCena: " + ex.Message);
                    }

                    bool zamena = false;
                    try
                    {
                        string zamenaStr = nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim();
                        zamena = zamenaStr.ToLower() != "Zamena: NE".ToLower();
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje fiksnaCena: " + ex.Message);
                    }

                    DateTime datumPostavljanja = DateTime.MinValue;
                    try
                    {
                        var datumPostavljanjaNode = nodeOpste.SelectNodes("ul/li").Where(li => li.ChildNodes?[0].InnerText.Trim().ToLower() == "postavljeno:").FirstOrDefault();
                        if (datumPostavljanjaNode != null)
                        {
                            string datumPostavljanjaStr = datumPostavljanjaNode.ChildNodes[1].Attributes["datetime"].Value.Trim();
                            datumPostavljanja = DateTime.SpecifyKind(DateTime.Parse(datumPostavljanjaStr), DateTimeKind.Utc);
                        }
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje 'Datum postavljanja': " + ex.Message);
                    }

                    int brojOglasa = 0;
                    listItemIndex += 2;
                    try
                    {
                        var brojOglasaNode = nodeOpste.SelectNodes("ul/li").Where(li => (bool)li.ChildNodes?[0].InnerText.Trim().ToLower().Contains("broj oglasa:")).FirstOrDefault();
                        if (brojOglasaNode != null)
                        {
                            brojOglasa = int.Parse(nodeOpste.SelectNodes("ul/li[" + listItemIndex++ + "]")[0].InnerHtml.Trim().Replace("Broj oglasa: ", string.Empty));
                        }
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje 'Broj oglasa': " + ex.Message);
                    }
                    #endregion Opste

                    #region Dodatne informacije

                    var nodeDodatno = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") &&
                                                                                div.Attributes["class"].Value.Equals("detailed-info")).First();

                    string emisionaKlasa = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Emisiona klasa motora", greske);

                    string pogon = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Pogon", greske);

                    string menjac = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Menjač", greske);

                    string brojVrata = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Broj vrata", greske).Replace(" vrata", string.Empty);

                    string brojSedistaStr = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Broj sedišta", greske).Replace(" sedišta", string.Empty);
                    byte   brojSedista    = 0;
                    byte.TryParse(brojSedistaStr, out brojSedista);

                    string stranaVolana = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Strana volana", greske);

                    string klima = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Klima", greske);

                    string bojaKaroserije = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Boja", greske);

                    string materijalEnterijera = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Materijal enterijera", greske);

                    string bojaEnterijera = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Boja enterijera", greske);

                    string   registrovanDoStr = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Registrovan do", greske);
                    DateTime registrovanDo    = DateTime.MinValue;
                    if (!registrovanDoStr.Equals("Nije registrovan"))
                    {
                        registrovanDoStr = "01." + registrovanDoStr.Remove(registrovanDoStr.Length - 1);;
                        DateTime.TryParse(registrovanDoStr, out registrovanDo);
                    }

                    string porekloVozila = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Poreklo vozila", greske);

                    string vlastnistvo = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Vlasništvo", greske);

                    string ostecenje = DajPodatakIzGrupeDodatneInformacije(nodeDodatno, "Oštećenje", greske);

                    #endregion Dodatne informacije

                    #region Sigurnost
                    #endregion Sigurnost

                    #region Oprema
                    #endregion Oprema

                    #region Opis
                    var x = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") &&
                                                                      div.Attributes["class"].Value.Equals("description"));
                    var nodeOpis = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") &&
                                                                             div.Attributes["class"].Value.Equals("description")).FirstOrDefault();

                    string opis = string.Empty;
                    if (nodeOpis != null)
                    {
                        try
                        {
                            foreach (var element in nodeOpis.ChildNodes)
                            {
                                if (element.NodeType == HtmlAgilityPack.HtmlNodeType.Text)
                                {
                                    opis += element.InnerHtml.Trim();
                                }
                                else if (element.NodeType == HtmlAgilityPack.HtmlNodeType.Element && element.Name == "br")
                                {
                                    opis += Environment.NewLine;
                                }
                            }
                            opis = opis.Trim();
                            opis = string.Empty;
                        }
                        catch (Exception ex)
                        {
                            greske.AppendLine("Nisam mogao da pročitam polje 'Opis': " + ex.Message);
                        }
                    }

                    #endregion Opis

                    #region Kontakt

                    var nodeKontakt = dok.DocumentNode.Descendants("div").Where(div => div.Attributes.Contains("class") &&
                                                                                div.Attributes["class"].Value.Equals("advertiser-info")).First();

                    string kontakt = string.Empty;
                    try
                    {
                        foreach (var element in nodeKontakt.ChildNodes.Where(node => node.NodeType == HtmlAgilityPack.HtmlNodeType.Text))
                        {
                            kontakt += element.InnerHtml.Trim();
                        }

                        if (kontakt.Length > 2000)
                        {
                            kontakt.Remove(2000);
                        }
                        kontakt = string.Empty;
                    }
                    catch (Exception ex)
                    {
                        greske.AppendLine("Nisam mogao da pročitam polje 'Kontakt': " + ex.Message);
                    }

                    #endregion Kontakt

                    automobile = new Automobile(brojOglasa, naslov, cena, address, vozilo, marka, model, godinaProizvodnje, karoserija,
                                                gorivo, fiksnaCena, zamena, datumPostavljanja, kubikaza, snagaKW, snagaKS, kilometraza, emisionaKlasa, pogon,
                                                menjac, brojVrata, brojSedista, stranaVolana, klima, bojaKaroserije, registrovanDo, porekloVozila, opis, kontakt);

                    if (greske.Length > 0)
                    {
                        string upozorenje = string.Format("Greške pri parsiranju oglasa {0}, URL: {1}\nGreške: {2}", automobile.BrojOglasa, automobile.URL, greske);
                        Dnevnik.PisiSaThredomUpozorenje(upozorenje);
                    }
                }
                catch (Exception ex)
                {
                    Dnevnik.PisiSaThredomGreska("Ne mogu da parsiram html sa adrese: " + address, ex);
                }
            }
            else
            {
                throw new StranaNijeProcitanaException();
            }

            return(automobile);
        }