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); } } } }
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."); } } }
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(); }
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); } } } }
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); }