static void Main(string[] args) { List <DataModel> records = new List <DataModel>(); try { var client = new RestClient("https://socms.polkcountyiowa.gov/"); var request = new RestRequest("sheriffsaleviewer/Home/PropertyListJson", Method.POST); request.AddParameter("draw", 1); request.AddParameter("start", 0); request.AddParameter("length", 100); request.AddParameter("isOpenStatus", true); var responce = client.Execute <RootObject>(request); var data = responce.Data.data; Console.WriteLine("Total Records: " + data.Count); if (data.Count > 0) { HtmlWeb web = new HtmlWeb(); int i = 1; foreach (var item in data) { Console.WriteLine("===============================PROCESSING RECORD==============================="); //Get Details of each property string url = "https://apps.polkcountyiowa.gov/sheriffsaleviewer/Home/Detail/" + item.propertyId; var doc = web.Load(url); var table = doc.DocumentNode.SelectSingleNode("/html/body/div/div[3]/div/table/tbody"); DataModel model = new DataModel() { Id = i }; Console.WriteLine("Getting details..."); if (table != null) { foreach (var entry in table.ChildNodes.Where(x => x.Name != "#text")) { try { HtmlDocument row = new HtmlDocument(); row.LoadHtml(entry.InnerHtml); var title = row.DocumentNode.SelectSingleNode("/th[1]").InnerText.Replace("\n", "").Replace("\r", ""); title = title.Trim(); string value = ""; switch (title) { case "Sheriff Number": value = row.DocumentNode.SelectSingleNode("/td[1]").InnerText.Replace("\n", "").Replace("\r", ""); model.SheriffNumber = value.Trim(); break; case "Approximate Judgment": value = row.DocumentNode.SelectSingleNode("/td[1]").InnerText.Replace("\n", "").Replace("\r", ""); model.ApproxJudgment = Convert.ToDouble(value.Replace("$", "").Replace(",", "").Trim()); break; case "Sales Date": value = row.DocumentNode.SelectSingleNode("/td[1]").InnerText.Replace("\n", "").Replace("\r", ""); model.SalesDate = value.Trim(); break; case "Plaintiff": value = row.DocumentNode.SelectSingleNode("/td[1]").InnerText.Replace("\n", "").Replace("\r", ""); model.PlainTiff = value.Trim(); break; case "Defendant": value = row.DocumentNode.SelectSingleNode("/td[1]").InnerText.Replace("\n", "").Replace("\r", ""); model.Defendant = value.Trim(); break; case "Address": value = row.DocumentNode.SelectSingleNode("/td[1]").InnerText.Replace("\n", "").Replace("\r", ""); model.Address = value.Trim(); break; case "Redemption Period": value = row.DocumentNode.SelectSingleNode("/td[1]").InnerText.Replace("\n", "").Replace("\r", ""); model.RedemptionPeriod = value.Trim(); break; default: break; } } catch (Exception ex) { Console.WriteLine("Unable to compile record.\nReason:" + ex.Message); } } } else { Console.WriteLine("Record details page not found"); model.SheriffNumber = item.referenceNumber.ToString(); model.SalesDate = item.salesDate.ToString("MM/dd/yyyy"); model.PlainTiff = item.plaintiff; model.Defendant = item.defendant; model.Address = item.propertyAddress; } if (!string.IsNullOrEmpty(model.Address)) { Console.WriteLine("Getting Data from zillow..."); ReturnedResult dataModel = GetZestimateAPI(model.Address); model.Zestimate = (string.IsNullOrEmpty(dataModel.Zestimate)) ? 0 : Math.Round(Convert.ToDouble(dataModel.Zestimate)); model.TaxAssesment = string.IsNullOrEmpty(dataModel.TaxAssestment) ? 0 : Convert.ToDecimal(dataModel.TaxAssestment); model.IndexValue = dataModel.ZillowHomeValueIndex; if (model.Zestimate == 0) { if (model.TaxAssesment != 0) { model.Zestimate_Approx_Judgement_Diff = Math.Round((double)model.TaxAssesment - model.ApproxJudgment, 2); if (model.TaxAssesment > 0) { model.Zestimate_Approx_Judgement_Division = model.ApproxJudgment / (double)model.TaxAssesment; } } } else { model.Zestimate_Approx_Judgement_Diff = Math.Round(model.Zestimate - model.ApproxJudgment, 2); if (model.Zestimate > 0) { model.Zestimate_Approx_Judgement_Division = model.ApproxJudgment / model.Zestimate; } } } else { Console.WriteLine("Address not found. So we cant get zestimate"); } records.Add(model); i += 1; } //Console.WriteLine("Fetching data from realtor.com. This may take few minutes..."); //records = GetRealtorEstimate(records); //foreach (var model in records) //{ // model.Zestimate_Approx_Judgement_Diff = Math.Round(model.Zestimate - model.ApproxJudgment, 2); // if (model.Zestimate > 0) // { // model.Zestimate_Approx_Judgement_Division = model.ApproxJudgment / model.Zestimate; // } //} List <string> entries = new List <string>(); entries.Add(string.Format("\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\",\"{8}\",\"{9}\",\"{10}\",\"{11}\"", "SalesDate", "PlainTiff", "Defendant", "SheriffNumber", "ApproxJudgment", "RedemptionPeriod", "Address" , "Zestimate", "Zestimate_Approx_Judgement_Diff", "Zestimate_Approx_Judgement_Division", "Tax Assestment", "Home Index Value")); foreach (var item in records) { entries.Add(string.Format("\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\",\"{8}\",\"{9}\",\"{10}\",\"{11}\"", item.SalesDate, item.PlainTiff, item.Defendant, item.SheriffNumber, item.ApproxJudgment, item.RedemptionPeriod, item.Address , item.Zestimate, item.Zestimate_Approx_Judgement_Diff, item.Zestimate_Approx_Judgement_Division, item.TaxAssesment, item.IndexValue)); } DateTime today = DateTime.Now; var time = string.Format("{0}{1}{2}{3}{4}{5}", today.Year, today.Month, today.Day, today.Hour, today.Minute, today.Second); File.WriteAllLines("results-" + time + ".csv", entries); } else { Console.WriteLine("No record found. Please try again another time."); } } catch (Exception ex) { Console.WriteLine("Unable to fetch data.\nReason: " + ex.Message); } Console.WriteLine("Operation Completed. Press any key to exit."); Console.ReadKey(); }
private static ReturnedResult GetZestimateAPI(string address) { ReturnedResult result = new ReturnedResult(); string[] parts = address.Split(','); switch (parts.Count()) { case 3: break; case 4: break; case 5: break; default: break; } try { var client = new RestClient("https://www.zillow.com/"); var request = (parts.Count() == 5) ? new RestRequest("webservice/GetDeepSearchResults.htm?zws-id=X1-ZWz17v7h6igwzv_75222&address=" + parts[0] + "&citystatezip=" + string.Format("{0},{1},{2}", parts[2], parts[3], parts[4]) + "", Method.GET) : new RestRequest("webservice/GetDeepSearchResults.htm?zws-id=X1-ZWz17v7h6igwzv_75222&address=" + parts[0] + "&citystatezip=" + string.Format("{0},{1},{2}", parts[1], parts[2], parts[3]) + "", Method.GET); request.AddHeader("Accept", "application/json"); var responce = client.Execute(request); if (responce.Content.Contains("<zestimate>")) { try { var text = responce.Content.Substring(responce.Content.IndexOf("<zestimate>")); var another = text.Substring(text.IndexOf("</zestimate>") + 12); text = text.Replace(another, ""); XmlSerializer serializer = new XmlSerializer(typeof(Zestimate), new XmlRootAttribute("zestimate")); StringReader stringReader = new StringReader(text); Zestimate zen = (Zestimate)serializer.Deserialize(stringReader); result.Zestimate = zen.Amount.Text; //return zestimate; } catch (Exception ex) { Console.WriteLine("Failed to get zestimate. Exception: " + ex.Message); } } if (responce.Content.Contains("<taxAssessment>")) { try { var text = responce.Content.Substring(responce.Content.IndexOf("<taxAssessment>")); var another = text.Substring(text.IndexOf("</taxAssessment>") + 16); text = text.Replace(another, ""); XmlSerializer serializer = new XmlSerializer(typeof(string), new XmlRootAttribute("taxAssessment")); StringReader stringReader = new StringReader(text); result.TaxAssestment = (string)serializer.Deserialize(stringReader); } catch (Exception ex) { Console.WriteLine("Failed to get tax assestment. Exception: " + ex.Message); } // result.Zestimate = tax.Text; //return zestimate; } if (responce.Content.Contains("<localRealEstate>")) { try { var text = responce.Content.Substring(responce.Content.IndexOf("<localRealEstate>")); var another = text.Substring(text.IndexOf("</localRealEstate>") + 18); text = text.Replace(another, ""); XmlSerializer serializer = new XmlSerializer(typeof(LocalRealEstate), new XmlRootAttribute("localRealEstate")); StringReader stringReader = new StringReader(text); var m = (LocalRealEstate)serializer.Deserialize(stringReader); result.ZillowHomeValueIndex = m.Region[0].ZindexValue; } catch (Exception ex) { Console.WriteLine("Failed to get z-index-value. Exception: " + ex.Message); } // result.Zestimate = tax.Text; //return zestimate; } } catch (Exception ex) { Console.WriteLine("Unable to get zestimate.\nReason: " + ex.Message); } return(result); }