Парсер погоды

28 Май
2012

В данной статье будем получать текущую температуру и осадки в заданном нами городе. Несмотря даже на то, что сервис пока включает не так уж и много городов, он проявляет значительную скорость по обновлению данных, будем надеяться, что в будущем городов будет больше. Ну да ладно, ближе к делу.

Введение


Выбранный объект для парсинга — сайт meteoservice.ru
С сайта будем брать, как уже и говорилось ранее, температуру воздуха, в градусах цельсия, и тип осадков, если нет — облачность.

Реализация


Итак, приступим к реализации нашего темного дела, кхе-кхе.

Для начала объявим две важные сборки
using System.Net;

using System.Text.RegularExpressions;


Далее получим контент нашей странички.
WebRequest request;

request = WebRequest.Create(@"http://www.meteoservice.ru/weather/now/moskva.html");


Как видно, в качестве города указывается название города, написанное транслитом, в нижнем регистре.

Теперь надо скушать ответ, который нам послал сервер, а также передадим этот поток данных, для работы с ним напрямую.
                using (var response = request.GetResponse())

                {

                    using (var stream = response.GetResponseStream())

                    using (var reader = new StreamReader(stream))

                    {

                        string data = reader.ReadToEnd();


А здесь, собственно, ключевая роль — парсинг данных. И тут уже есть два самых оптимальных способа.

Первый — обычная string’овая функция Split.
Вторая — регулярные выражения.

В данном случае лучше всего использовать второй вариант, т.к. первый медленнее, да и городить огород с ним не хочется.

Получаем город.
string town = new Regex(@"<h1>(?<town>.*)</h1>").Match(data).Groups["town"].Value;


Температуру.
string temp = new Regex(@"<span class=""temperature"">(?<temp>[^<]+)<span title=""Градус Цельсия"">").Match(data).Groups["temp"].Value;


Тип осадков.
string osadki = new Regex(@"<td class=""title"">Облачность:</td>[^<]*?<td>(?<osadki>[^<]+)</td>").Match(data).Groups["osadki"].Value;


Уведомляем себя любимого о текущей погоде.
Console.WriteLine(town + "\nТемпература воздуха: " + temp + "\nОсадки: " + osadki);


Полный листинг кода.
                WebRequest request;

                request = WebRequest.Create(@"http://www.meteoservice.ru/weather/now/moskva.html");

                using (var response = request.GetResponse())

                {

                    using (var stream = response.GetResponseStream())

                    using (var reader = new StreamReader(stream))

                    {

                        string data = reader.ReadToEnd();

                        string town = new Regex(@"<h1>(?<town>.*)</h1>").Match(data).Groups["town"].Value;

                        string temp = new Regex(@"<span class=""temperature"">(?<temp>[^<]+)<span title=""Градус Цельсия"">").Match(data).Groups["temp"].Value;

                        string osadki = new Regex(@"<td class=""title"">Облачность:</td>[^<]*?<td>(?<osadki>[^<]+)</td>").Match(data).Groups["osadki"].Value;

                        Console.WriteLine(town + "\nТемпература воздуха: " + temp + "\nОсадки: " + osadki);

                        Console.ReadLine();

                    }

                }

Результат


В итоге, получаем картину примерно следующего содержания.
Температура воздуха: +8°

Осадки: ясно


Заключение


Сайт, конечно, позволяет получить и большее разнообразие данных, таких как: влажность, ветер, атмосферное давление; но мы рассмотрели всего лишь два типа данных, даже три, если учитывать получение города, по этому примеру можно вытащить с сайта то, что вам нужно.
Собственно, этот парсер годится для любого сайта, надо лишь правильно составить регулярное выражение.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх