Пример #1
0
        public List <CityInfo> GetFavoriteCities()
        {
            using (var driver = new PhantomJSDriver())
            {
                var baseUri = new Uri("https://www.gismeteo.ru/");
                driver.Navigate().GoToUrl(baseUri);

                var cities_list = driver.GetInnerElement("div", "class", "main")
                                  .GetInnerElement("div", "class", "column-wrap")
                                  .GetInnerElement("section", "class", "cities cities_frame __frame clearfix")
                                  .GetInnerElement("div", "class", "js_cities_pcities cities_section")
                                  .GetInnerElement("div", "class", "cities_list")
                                  .GetInnerElements("div", "class", "cities_item");

                List <CityInfo> result = new List <CityInfo>();
                if (cities_list != null)
                {
                    foreach (var city_div in cities_list.Where(cd => cd != null))
                    {
                        var city_url = city_div.GetInnerElementAtributeValue("a", "href");
                        if (!string.IsNullOrWhiteSpace(city_url))
                        {
                            var city_name = city_div.GetInnerElementText("span", "class", "cities_name");
                            result.Add(new CityInfo()
                            {
                                Name = city_name, Url = city_url, OuterId = ExtractFromUrl(city_url)
                            });
                        }
                    }
                }
                driver.Quit();
                return(result);
            }
        }
Пример #2
0
        public List <WeatherInfo> GetWeatherInfoList(CityInfo city)
        {
            List <WeatherInfo> result = new List <WeatherInfo>();

            using (var driver = new PhantomJSDriver())
            {
                foreach (var day in _days)
                {
                    var baseUri = new Uri(city.Url);
                    driver.Navigate().GoToUrl(new Uri(baseUri, day));

                    var culture  = driver.GetInnerElementAtributeValue("body", "class").Split(' ').Skip(2).FirstOrDefault();
                    var baseNode = driver.GetInnerElement("div", "class", "main")
                                   .GetInnerElement("div", "class", "column-wrap")
                                   .GetInnerElement("div", "class", "__frame_sm")
                                   .GetInnerElement("div", "class", "forecast_frame hw_wrap");

                    var baseDate = baseNode.GetInnerElement("div", "class", "tab  tooltip")
                                   .GetInnerElement("div", "class", "tab_wrap")
                                   .GetInnerElement("div", "class", "tab-content");

                    var date = (baseDate.GetInnerElementText("div", "class", "date ") ??
                                baseDate.GetInnerElementText("div", "class", "date weekend"))
                               ?.Split(',')
                               .LastOrDefault()
                               ?.Trim();

                    if (string.IsNullOrWhiteSpace(date))
                    {
                        continue;
                    }

                    var detailsNode = baseNode.GetInnerElement("div", "class", "widget js_widget")
                                      .GetInnerElement("div", "class", "widget__body")
                                      .GetInnerElement("div", "class", "widget__container");

                    var hours = detailsNode.GetInnerElement("div", "class", "widget__row widget__row_time")
                                .GetInnerElements("div", "class", "widget__item");

                    var icons = detailsNode.GetInnerElement("div", "class", "widget__row widget__row_table widget__row_icon")
                                .GetInnerElements("div", "class", "widget__item");

                    var temps = detailsNode.GetInnerElement("div", "class", "widget__row widget__row_table widget__row_temperature")
                                .GetInnerElement("div", "class", "templine w_temperature")
                                .GetInnerElement("div", "class", "chart chart__temperature")
                                .GetInnerElement("div", "class", "values")
                                .GetInnerElements("div", "class", "value");

                    var winds = detailsNode.GetInnerElement("div", "class", "widget__row widget__row_table widget__row_wind-or-gust")
                                .GetInnerElements("div", "class", "widget__item");

                    var precs = detailsNode.GetInnerElement("div", "class", "widget__row widget__row_table widget__row_precipitation")
                                .GetInnerElements("div", "class", "widget__item");

                    var maxlen = new[] { hours.Count, icons.Count, temps.Count, winds.Count, precs.Count }.Max();

                    var wlist = new List <HourDetails>(Enumerable.Range(0, maxlen).Select(r => new HourDetails()));

                    for (int i = 0; i < maxlen; i++)
                    {
                        var hr = hours.ByInd(i);
                        if (hr != null)
                        {
                            var h = hr.GetInnerElement("div", "class", "w_time").FindElement(By.TagName("span")).Text;
                            var m = hr.GetInnerElement("div", "class", "w_time").FindElement(By.TagName("sup")).Text;
                            if (int.TryParse(h, out var hi) && int.TryParse(m, out var mi))
                            {
                                wlist[i].Time = TimeSpan.FromMinutes(hi * 60 + mi);
                            }
                        }

                        var ic = icons.ByInd(i);
                        if (ic != null)
                        {
                            var svg = ic.GetInnerElement("div", "class", "widget__value w_icon")
                                      .GetInnerElement("span", "class", "tooltip")
                                      .GetAttribute("innerHTML");   // Сакральные знания...
                            wlist[i].IconSvg = svg;
                        }

                        var tm = temps.ByInd(i);
                        if (tm != null)
                        {
                            var t = tm.GetInnerElementText("span", "class", "unit unit_temperature_c");
                            if (double.TryParse(t, out var td))
                            {
                                wlist[i].Temperature = td;
                            }
                        }

                        var wn = winds.ByInd(i);
                        if (wn != null)
                        {
                            var w = wn.GetInnerElement("div", "class", "w_wind")
                                    .GetInnerElement("div", "class", "w_wind__warning w_wind__warning_ ")
                                    .GetInnerElementText("span", "class", "unit unit_wind_m_s");
                            wlist[i].WindText = w;
                        }

                        var pc = precs.ByInd(i);
                        if (pc != null)
                        {
                            var t = pc.GetInnerElement("div", "class", "w_prec")
                                    .GetInnerElementText("div", "class", "w_prec__value");
                            if (double.TryParse(t, out var td))
                            {
                                wlist[i].Humidity = td;
                            }
                        }
                    }

                    result.Add(new WeatherInfo()
                    {
                        CurrDate        = DateTime.ParseExact(date, new[] { "d MMM", "d MMM y", "d MMM yyyy" }, CultureInfo.GetCultureInfo(culture), DateTimeStyles.None),
                        DetailedWeather = new DetailedWeather()
                        {
                            WeatherByHours = new SortedDictionary <TimeSpan, HourDetails>(wlist.ToDictionary(x => x.Time))
                        },
                    });
                }
                driver.Quit();
                return(result);
            }
        }