Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }