private static BoligaDBEntities AddToContext(BoligaDBEntities context, BoligaProperty entity, int count, int commitCount, bool recreateContext) { context.Set <BoligaProperty>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); if (recreateContext) { context.Dispose(); context = new BoligaDBEntities(); context.Configuration.AutoDetectChangesEnabled = false; } } return(context); }
private static BoligaProperty GetPropertyData(string url) { BoligaProperty result = new BoligaProperty { SogeresultaterGuid = _searchGuid , Link = $"http://{_siteUrl}{url}" }; using (var client = new HttpClient(new RetryHandler(new HttpClientHandler()))) { var uri = new Uri($"http://{_siteUrl}/{url}"); var response = client.GetAsync(uri).Result; var responseString = response.Content.ReadAsStringAsync().Result; HtmlDocument htmlDoc = new HtmlDocument { OptionFixNestedTags = true }; htmlDoc.LoadHtml(responseString); HtmlNode titelNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='main-content paddingT']/h2[1]"); string titelStr = titelNode?.InnerText .Trim(); string titel = titelNode != null?WebUtility.HtmlDecode(titelStr) : null; HtmlNode postnrNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='main-content paddingT']/h3[1]"); string postnrStr = null; if (postnrNode?.InnerText.Split(' ')[0].Length > 1) { postnrStr = postnrNode?.InnerText .Split(' ')[0] .Trim(); } string postnr = postnrNode != null?WebUtility.HtmlDecode(postnrStr) : null; HtmlNode postnrTitelNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='main-content paddingT']/h3[1]"); string postnrTitelStr = null; if (postnrTitelNode?.InnerText.Split(' ')[1].Length > 1) { postnrTitelStr = postnrTitelNode?.InnerText .Split(' ')[1] .Trim(); } string postnrTitel = postnrNode != null?WebUtility.HtmlDecode(postnrTitelStr) : null; HtmlNode kontantprisNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr[1]/td[1]/strong"); string kontantprisSrt = null; if (kontantprisNode?.InnerText.Split(' ').Length > 1) { kontantprisSrt = kontantprisNode?.InnerText.Split(' ')[0]; } decimal?kontantpris = kontantprisSrt != null?decimal.Parse(kontantprisSrt, _danishCulture) : (decimal?)null; HtmlNode ejerudgiftNode = htmlDoc.DocumentNode.SelectSingleNode( "//*[text()[contains(.,'Ejerudgift')]]"); string ejerudgiftStr = null; if (ejerudgiftNode?.InnerHtml.Split(BrRn, StringSplitOptions.None).Length > 1 && ejerudgiftNode?.InnerHtml .Split(BrRn, StringSplitOptions.None)[1] .Split(Small, StringSplitOptions.None).Length > 1) { ejerudgiftStr = ejerudgiftNode?.InnerHtml .Split(BrRn, StringSplitOptions.None)[1] .Split(Small, StringSplitOptions.None)[0] .Trim(); } decimal?ejerudgift = ejerudgiftStr != null?decimal.Parse(ejerudgiftStr, _danishCulture) : (decimal?)null; HtmlNode kvmprisNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Kvmpris']/following-sibling::td"); string kvmprisStr = null; if (kvmprisNode?.InnerText.Split(' ').Length > 1) { kvmprisStr = kvmprisNode?.InnerText .Split(' ')[0] .Trim(); } decimal?kvmpris = kvmprisStr != null?decimal.Parse(kvmprisStr, _danishCulture) : (decimal?)null; HtmlNode typeNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Type']/following-sibling::td"); string type = typeNode != null?WebUtility.HtmlDecode(typeNode.InnerText) : null; HtmlNode boligNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Bolig']/following-sibling::td"); string boligStr = boligNode?.InnerText .Split(Msup2, StringSplitOptions.None)[0] .Trim(); boligStr = boligStr != null?Regex.Replace(boligStr, @"[^\d]", "") : null; int?bolig = boligStr != null?int.Parse(boligStr, NumberStyles.Number, _danishCulture) : (int?)null; HtmlNode grundNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Grund']/following-sibling::td"); string grundStr = grundNode?.InnerText .Split(Msup2, StringSplitOptions.None)[0] .Trim(); grundStr = grundStr != null?Regex.Replace(grundStr, @"[^\d]", "") : null; int?grund = grundStr != null?int.Parse(grundStr, NumberStyles.Number, _danishCulture) : (int?)null; HtmlNode vaerelserNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Værelser']/following-sibling::td"); string vaerelserStr = vaerelserNode?.InnerText .Trim(); vaerelserStr = vaerelserStr != null?Regex.Replace(vaerelserStr, @"[^\d]", "") : null; int?vaerelser = vaerelserStr != null?int.Parse(vaerelserStr, NumberStyles.Number, _danishCulture) : (int?)null; HtmlNode etageNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Etage']/following-sibling::td"); string etage = etageNode != null?WebUtility.HtmlDecode(etageNode.InnerText.Trim()) : null; HtmlNode byggearNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Byggeår']/following-sibling::td"); string byggearStr = byggearNode?.InnerText .Trim(); byggearStr = byggearStr != null?Regex.Replace(byggearStr, @"[^\d]", "") : null; int?byggear = byggearStr != null?int.Parse(byggearStr, NumberStyles.Number, _danishCulture) : (int?)null; HtmlNode oprettetNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Oprettet']/following-sibling::td"); string oprettetStr = oprettetNode?.InnerText .Trim(); DateTime?oprettet = oprettetStr != null?DateTime.ParseExact(oprettetStr, "dd-MM-yyyy", CultureInfo.InvariantCulture) : (DateTime?)null; HtmlNode liggetidNode = htmlDoc.DocumentNode.SelectSingleNode( "//table[@class='table estate-table']/tr/td[.='Liggetid']/following-sibling::td"); string liggetidStr = liggetidNode?.InnerText .Split(' ')[0]; liggetidStr = liggetidStr != null?Regex.Replace(liggetidStr, @"[^\d]", "") : null; int?liggetid = liggetidStr != null?int.Parse(liggetidStr, NumberStyles.Number, _danishCulture) : (int?)null; HtmlNode brokerLinkNode = htmlDoc.DocumentNode.SelectSingleNode( "//a[@class='but brokerLink']"); string brokerLink = brokerLinkNode?.Attributes["href"].Value .Trim(); HtmlNode butikTitelNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='estate-50 margin-top margin-right agent-box fill']/div[@class='wrapper']/strong"); string butikTitel = butikTitelNode != null?WebUtility.HtmlDecode(butikTitelNode.InnerText.Trim()) : null; HtmlNode butikAdresseNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='estate-50 margin-top margin-right agent-box fill']/div[@class='wrapper']"); string butikAdresseStr = null; if (butikAdresseNode?.InnerHtml.Split(StrongBrStr, StringSplitOptions.None).Length > 1 && butikAdresseNode?.InnerHtml.Split(BrStr, StringSplitOptions.None).Length > 1) { butikAdresseStr = butikAdresseNode?.InnerHtml .Split(StrongBrStr, StringSplitOptions.None)[1] .Split(BrStr, StringSplitOptions.None)[0] .Trim(); } string butikAdresse = butikAdresseStr != null?WebUtility.HtmlDecode(butikAdresseStr.Trim()) : null; HtmlNode butikPostnrNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='estate-50 margin-top margin-right agent-box fill']/div[@class='wrapper']"); string butikPostnrStr = null; if (butikPostnrNode?.InnerHtml.Split(StrongBrStr, StringSplitOptions.None).Length > 1 && butikPostnrNode?.InnerHtml.Split(StrongBrStr, StringSplitOptions.None)[1] .Split(BrStr, StringSplitOptions.None).Length > 1) { butikPostnrStr = butikPostnrNode?.InnerHtml .Replace("\r\n", "") .Trim() .Split(StrongBrStr, StringSplitOptions.None)[1] .Split(BrStr, StringSplitOptions.None)[1] .Trim() .Split(' ')[0] .Trim(); } string butikPostnr = butikPostnrStr; HtmlNode butikPostnrTitelNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='estate-50 margin-top margin-right agent-box fill']/div[@class='wrapper']"); string butikPostnrTitelStr = null; if (butikPostnrTitelNode?.InnerHtml.Replace("\r\n", "").Trim().Split(StrongBrStr, StringSplitOptions.None).Length > 1 && butikPostnrTitelNode?.InnerHtml.Replace("\r\n", "").Trim().Split(StrongBrStr, StringSplitOptions.None)[1] .Split(BrStr, StringSplitOptions.None).Length > 1 && butikPostnrTitelNode?.InnerHtml.Replace("\r\n", "").Trim().Split(StrongBrStr, StringSplitOptions.None)[1] .Split(BrStr, StringSplitOptions.None)[1].Trim().Split(' ').Length > 1) { butikPostnrTitelStr = butikPostnrTitelNode?.InnerHtml .Replace("\r\n", "") .Trim() .Split(StrongBrStr, StringSplitOptions.None)[1] .Split(BrStr, StringSplitOptions.None)[1] .Trim() .Split(' ')[1] .Trim(); } string butikPostnrTitel = WebUtility.HtmlDecode(butikPostnrTitelStr); HtmlNode prisforskelProcentdelNode = htmlDoc.DocumentNode.SelectSingleNode( "//div[@class='estate-50 margin-top gauge-box fill']/div[@class='wrapper']/strong"); int?prisforskelProcentdel = null; if (prisforskelProcentdelNode?.InnerText.Split(ProcentStr, StringSplitOptions.None).Length > 1 && prisforskelProcentdelNode?.InnerText.Split(ProcentStr, StringSplitOptions.None).Length > 1) { string prisforskelProcentdelNumber = prisforskelProcentdelNode.InnerText .Split(ProcentStr, StringSplitOptions.None)[0]; string prisforskelProcentdelPlusMinus = prisforskelProcentdelNode.InnerText .Split(ProcentStr, StringSplitOptions.None)[1]; prisforskelProcentdelNumber = prisforskelProcentdelPlusMinus == "lavere" ? $"-{prisforskelProcentdelNumber}" : prisforskelProcentdelNumber; prisforskelProcentdel = prisforskelProcentdelNumber != null?int.Parse(prisforskelProcentdelNumber, NumberStyles.Number, _danishCulture) : (int?)null; } HtmlNode kvmprisBoligenNode = htmlDoc.DocumentNode.SelectSingleNode("//table[@class='table table-compare']/tr/td[contains(.,'Kvmpris boligen')]/following-sibling::td/strong"); string kvmprisBoligenStr = kvmprisBoligenNode?.InnerText; decimal?kvmprisBoligen = kvmprisBoligenStr != null?decimal.Parse(kvmprisBoligenStr, _danishCulture) : (decimal?)null; HtmlNode kvmprisOmradetNode = htmlDoc.DocumentNode.SelectSingleNode("//table[@class='table table-compare']/tr/td[contains(.,'Kvmpris området')]/following-sibling::td/strong"); string kvmprisOmradetNodeStr = kvmprisOmradetNode?.InnerText; decimal?kvmprisOmradet = kvmprisOmradetNodeStr != null?decimal.Parse(kvmprisOmradetNodeStr, _danishCulture) : (decimal?)null; result.Titel = titel; result.Postnr = postnr; result.PostnrTitel = postnrTitel; result.Kontantpris = kontantpris; result.Ejerudgift = ejerudgift; result.Kvmpris = kvmpris; result.Type = type; result.Bolig = bolig; result.Grund = grund; result.Vaerelser = vaerelser; result.Etage = etage; result.Byggear = byggear; result.Oprettet = oprettet; result.Liggetid = liggetid; result.BrokerLink = brokerLink; result.ButikTitel = butikTitel; result.ButikAdresse = butikAdresse; result.ButikPostnr = butikPostnr; result.ButikPostnrTitel = butikPostnrTitel; result.PrisforskelProcentdel = prisforskelProcentdel; result.KvmprisBoligen = kvmprisBoligen; result.KvmprisOmradet = kvmprisOmradet; } return(result); }