diff --git a/lesson08/app.id b/lesson08/app.id new file mode 100644 index 0000000..197c38d --- /dev/null +++ b/lesson08/app.id @@ -0,0 +1 @@ +cd2a192eb51c85609c341be8f37d8d7a diff --git a/lesson08/export_openweather.py b/lesson08/export_openweather.py new file mode 100644 index 0000000..0ae9375 --- /dev/null +++ b/lesson08/export_openweather.py @@ -0,0 +1,24 @@ + +""" OpenWeatherMap (экспорт) + +Сделать скрипт, экспортирующий данные из базы данных погоды, +созданной скриптом openweather.py. Экспорт происходит в формате CSV или JSON. + +Скрипт запускается из командной строки и получает на входе: + export_openweather.py --csv filename [<город>] + export_openweather.py --json filename [<город>] + export_openweather.py --html filename [<город>] + +При выгрузке в html можно по коду погоды (weather.id) подтянуть +соответствующие картинки отсюда: http://openweathermap.org/weather-conditions + +Экспорт происходит в файл filename. + +Опционально можно задать в командной строке город. В этом случае +экспортируются только данные по указанному городу. Если города нет в базе - +выводится соответствующее сообщение. + +""" + +import csv +import json diff --git a/lesson08/openweather.py b/lesson08/openweather.py new file mode 100644 index 0000000..a9debfa --- /dev/null +++ b/lesson08/openweather.py @@ -0,0 +1,125 @@ + +""" +== OpenWeatherMap == + +OpenWeatherMap — онлайн-сервис, который предоставляет бесплатный API + для доступа к данным о текущей погоде, прогнозам, для web-сервисов + и мобильных приложений. Архивные данные доступны только на коммерческой основе. + В качестве источника данных используются официальные метеорологические службы + данные из метеостанций аэропортов, и данные с частных метеостанций. + +Необходимо решить следующие задачи: + +== Получение APPID == + Чтобы получать данные о погоде необходимо получить бесплатный APPID. + + Предлагается 2 варианта (по желанию): + - получить APPID вручную + - автоматизировать процесс получения APPID, + используя дополнительную библиотеку GRAB (pip install grab) + + Необходимо зарегистрироваться на сайте openweathermap.org: + https://home.openweathermap.org/users/sign_up + + Войти на сайт по ссылке: + https://home.openweathermap.org/users/sign_in + + Свой ключ "вытащить" со страницы отсюда: + https://home.openweathermap.org/api_keys + + Ключ имеет смысл сохранить в локальный файл, например, "app.id" + + +== Получение списка городов == + Список городов может быть получен по ссылке: + http://bulk.openweathermap.org/sample/city.list.json.gz + + Далее снова есть несколько вариантов (по желанию): + - скачать и распаковать список вручную + - автоматизировать скачивание (ulrlib) и распаковку списка + (воспользоваться модулем gzip + или распаковать внешним архиватором, воспользовавшись модулем subprocess) + + Список достаточно большой. Представляет собой JSON-строки: +{"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}} +{"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}} + + +== Получение погоды == + На основе списка городов можно делать запрос к сервису по id города. И тут как раз понадобится APPID. + By city ID + Examples of API calls: + http://api.openweathermap.org/data/2.5/weather?id=2172797&appid=b1b15e88fa797225412429c1c50c122a + + Для получения температуры по Цельсию: + http://api.openweathermap.org/data/2.5/weather?id=520068&units=metric&appid=b1b15e88fa797225412429c1c50c122a + + Для запроса по нескольким городам сразу: + http://api.openweathermap.org/data/2.5/group?id=524901,703448,2643743&units=metric&appid=b1b15e88fa797225412429c1c50c122a + + + Данные о погоде выдаются в JSON-формате + {"coord":{"lon":38.44,"lat":55.87}, + "weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}], + "base":"cmc stations","main":{"temp":280.03,"pressure":1006,"humidity":83, + "temp_min":273.15,"temp_max":284.55},"wind":{"speed":3.08,"deg":265,"gust":7.2}, + "rain":{"3h":0.015},"clouds":{"all":76},"dt":1465156452, + "sys":{"type":3,"id":57233,"message":0.0024,"country":"RU","sunrise":1465087473, + "sunset":1465149961},"id":520068,"name":"Noginsk","cod":200} + + +== Сохранение данных в локальную БД == +Программа должна позволять: +1. Создавать файл базы данных SQLite со следующей структурой данных + (если файла базы данных не существует): + + Погода + id_города INTEGER PRIMARY KEY + Город VARCHAR(255) + Дата DATE + Температура INTEGER + id_погоды INTEGER # weather.id из JSON-данных + +2. Выводить список стран из файла и предлагать пользователю выбрать страну +(ввиду того, что список городов и стран весьма велик + имеет смысл запрашивать у пользователя имя города или страны + и искать данные в списке доступных городов/стран (регуляркой)) + +3. Скачивать JSON (XML) файлы погоды в городах выбранной страны +4. Парсить последовательно каждый из файлов и добавлять данные о погоде в базу + данных. Если данные для данного города и данного дня есть в базе - обновить + температуру в существующей записи. + + +При повторном запуске скрипта: +- используется уже скачанный файл с городами; +- используется созданная база данных, новые данные добавляются и обновляются. + + +При работе с XML-файлами: + +Доступ к данным в XML-файлах происходит через пространство имен: +