public bool InsertTrips(int SearchTripProviderId) { bool result = false; try { var SearchTripProvider = _searchTripProviderRepo.Get(SearchTripProviderId); if (SearchTripProvider != null) { #region delete old records // Delete old records var TripsToDelete = SearchTripProvider.Trips.ToList(); foreach (var trip in TripsToDelete) { var FlightsToDelete = trip.Flights.ToList(); foreach (var flight in FlightsToDelete) { _flightRepo.Delete(flight); _flightRepo.Save(); } _tripRepo.Delete(trip); _tripRepo.Save(); } #endregion string HtmlFile = "D:\\Html\\search_" + SearchTripProviderId + ".html"; if (File.Exists(HtmlFile)) { string Html = File.ReadAllText(HtmlFile); if (!String.IsNullOrWhiteSpace(Html)) { TripsFromHtmlResult Result = new TripsFromHtmlResult(); if (SearchTripProvider.ProviderId == Providers.Kayak) { Result = ScrappingHelper.GetKayakTripsFromHtml(Html, SearchTripProviderId, SearchTripProvider.Url, SearchTripProvider.SearchTrip.FromDate, SearchTripProvider.SearchTrip.ToDate); } if (Result.Success) { if (InsertTrips(Result.Trips)) { File.Delete(HtmlFile); } } } else { FlightsEngine.Utils.Logger.GenerateInfo("File empty for SearchTripProviderId = " + SearchTripProviderId); } } } } catch (Exception e) { result = false; FlightsEngine.Utils.Logger.GenerateError(e, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, "SearchTripProviderId = " + SearchTripProviderId); } return(result); }
public static TripsFromHtmlResult GetKayakTripsFromHtml(string html, int SearchTripProviderId, string Url, DateTime OneWayDate, DateTime?ReturnDate) { TripsFromHtmlResult Result = new TripsFromHtmlResult(); try { var doc = new HtmlDocument(); doc.LoadHtml(html); Result.Success = true; var textNodes = doc.DocumentNode.SelectNodes("//*[contains(@class,'Flights-Results-FlightResultItem')]"); if (textNodes != null) { foreach (HtmlNode node in textNodes) { try { TripItem Trip = new TripItem(); Trip.SearchTripProviderId = SearchTripProviderId; Trip.ProviderId = Providers.Kayak; #region price var strPrice = node.SelectSingleNode(".//span[contains(@class,'price option-text')]").InnerHtml.Replace("\n", ""); Tuple <string, decimal> PriceAndCurrency = GetPriceWithCurrencyFromHtml(strPrice); Trip.CurrencyCode = PriceAndCurrency.Item1; Trip.Price = PriceAndCurrency.Item2; if (Trip.Price > 0 && !String.IsNullOrWhiteSpace(Trip.CurrencyCode)) { #endregion // var flightNodes = node.SelectNodes(".//div[contains(@class,'Flights-Results-LegInfo Flights-Results-LegInfoSleek')]"); var flightNodes = node.SelectNodes(".//div[contains(@class,'Flights-Results-FlightLegDetails')]"); bool IsReturnFlight = false; foreach (HtmlNode flight in flightNodes) { #region airlines logo and name HtmlNode airlinePicture = flight.SelectSingleNode(".//img[@src!='']"); if (airlinePicture != null) { string airlinePictureSrc = airlinePicture.Attributes.Where(i => i.Name == "src").FirstOrDefault().Value; string airlineName = airlinePicture.Attributes.Where(i => i.Name == "alt").FirstOrDefault().Value.Replace("logo", "").Trim(); if (IsReturnFlight) { Trip.ReturnTrip_AirlineLogoSrc = airlinePictureSrc; Trip.ReturnTrip_AirlineName = airlineName; } else { Trip.OneWayTrip_AirlineLogoSrc = airlinePictureSrc; Trip.OneWayTrip_AirlineName = airlineName; } } #endregion #region stops int stopsNumber = 0; if (flight.SelectSingleNode(".//div[contains(@class,'stops')]") != null) { string stopsHtml = flight.SelectSingleNode(".//div[contains(@class,'stops')]").SelectSingleNode(".//div[contains(@class,'top')]").InnerText; stopsNumber = GeStopsNumberFromHtml(stopsHtml); } else { stopsNumber = flight.SelectNodes(".//div[contains(@class,'segment-row')]").Count() - 1; } #endregion #region duration string durationHtml = ""; if (flight.SelectSingleNode(".//span[contains(@class,'duration')]") != null) { durationHtml = flight.SelectSingleNode(".//span[contains(@class,'duration')]").InnerText.Replace(" ", ""); } else if (flight.SelectSingleNode(".//span[contains(@class,'segmentDuration')]") != null) { durationHtml = flight.SelectSingleNode(".//span[contains(@class,'segmentDuration')]").InnerText.Replace(" ", ""); } int duration = GetDurationFromHtml(durationHtml); #endregion #region time string arrival = ""; string departure = ""; if (flight.SelectSingleNode(".//div[contains(@class,'segmentTimes')]") != null) { departure = flight.SelectSingleNode(".//div[contains(@class,'segmentTimes')]").SelectNodes(".//span[contains(@class,'time')]")[0].InnerText; arrival = flight.SelectNodes(".//div[contains(@class,'segmentTimes')]")[stopsNumber].SelectNodes(".//span[contains(@class,'time')]")[1].InnerText; DateTime BaseDate = OneWayDate; if (IsReturnFlight) { BaseDate = ReturnDate.Value; } if (flight.SelectSingleNode(".//div[contains(@class,'arrival-date-warning')]") != null) { string warningDate = flight.SelectSingleNode(".//div[contains(@class,'arrival-date-warning')]").InnerHtml; departure = GeFlightDateFromHtml(GetArrivalFlightDateFromHtml(warningDate, BaseDate), departure); } else { departure = GeFlightDateFromHtml(BaseDate, departure); } arrival = GeFlightDateFromHtml(BaseDate, arrival); } #endregion #region airport codes string airportCodes = flight.SelectSingleNode(".//span[contains(@class,'origin-destination')]").InnerText; if (airportCodes.Split('-').Length < 2) { Logger.GenerateInfo("Airport code error for SearchTripProviderId = " + SearchTripProviderId + "and airportCodes = " + airportCodes + " and node = " + flight.InnerHtml); } #endregion if (IsReturnFlight) { Trip.ReturnTrip_FromAirportCode = airportCodes.Split('-')[0].Trim(); Trip.ReturnTrip_ToAirportCode = airportCodes.Split('-')[1].Trim(); Trip.ReturnTrip_Stops = stopsNumber; Trip.ReturnTrip_Duration = duration; Trip.ReturnTrip_ArrivalDate = arrival; Trip.ReturnTrip_DepartureDate = departure; } else { Trip.OneWayTrip_FromAirportCode = airportCodes.Split('-')[0].Trim(); Trip.OneWayTrip_ToAirportCode = airportCodes.Split('-')[1].Trim(); Trip.OneWayTrip_Stops = stopsNumber; Trip.OneWayTrip_Duration = duration; Trip.OneWayTrip_ArrivalDate = arrival; Trip.OneWayTrip_DepartureDate = departure; } IsReturnFlight = !IsReturnFlight; } if (Trip.OneWayTrip_FromAirportCode != null) { Trip.Url = Url; Result.Trips.Add(Trip); } else { Logger.GenerateInfo("OneWayTrip_FromAirportCode error : " + SearchTripProviderId + " and node = " + node.InnerHtml); } } } catch (Exception ex2) { Result.Success = false; FlightsEngine.Utils.Logger.GenerateError(ex2, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, "GetKayakTripsFromHtml Loop, SearchTripProviderId = " + SearchTripProviderId + " and node = " + node.InnerHtml); } } } } catch (Exception e) { Result.Success = false; FlightsEngine.Utils.Logger.GenerateError(e, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, "SearchTripProviderId = " + SearchTripProviderId); } return(Result); }