Python. Получение данных о курсе валют. Курс валют python
Про Python - Статьи - pycbrf — узнаём курсы валют при помощи Python
June 27, 2016, 8:43 p.m. (ред. June 27, 2016, 8:46 p.m.)В заметке речь пойдёт о новом пакете, позволяющем получать информацию о курсах валют, установленных Центробанком России.
Сегодня публикую приложение, которое вам пригодится, если требуется узнать курсы валют на определённую дату.При помощи pycbrf можно получать курсы, как из командной строки, так из вашего приложения на Python.
Узнаём курс доллара США, а затем всех валют из командной строки:
$ pycbrf rates -c USD$ pycbrf ratesЕсть возможность получения данных за определённый день. Укажите ключ -h, чтобы получить краткую справку по использованию данного консольного приложения.А теперь пример того, как обращаться к пакету из вашего кода:
from pycbrf.toolbox import ExchangeRates# Запрашиваем данные на 26-е июня.rates = ExchangeRates('2016-06-26')
rates.date_requested # 2016-06-26 00:00:00rates.date_received # 2016-06-25 00:00:00# 26-е был выходной, а курс на выходные установлен 25-гоrates.dates_match # False
# Список всех курсов валют на день доступ в rates.rates.
# Поддерживаются разные идентификаторы валют:rates['USD'].name # Доллар СШАrates['R01235'].name # Доллар СШАrates['840'].name # Доллар США
# Вот, что внутри объекта ExchangeRate:rates['USD']'''ExchangeRate(id='R01235',name='Доллар США',code='USD',num='840',value=Decimal('65.5287'),par=Decimal('1'),rate=Decimal('65.5287'))'''
Под капотом приложение производит запрос к одному из сервисов сайта Центробанка. Возможно в будущем оно будет обучено получению и другой информации.Вы можете принять участие в разработке pycbrf, код проекта доступен на GitHub - https://github.com/idlesign/pycbrf
Будьте в курсе.
pythonz.net
Python-скрипт для получения курсов валют
Довольно часто встречается задача получения курсов валют и сохранение результатов в базу. Задача достаточно проста, чтобы привлекать для этого "тяжелую артиллерию" типа java, поэтому предлагается воспользоваться Python. Почему Python? Во-первых, это современный и популярный язык, во-вторых, python повсеместно используется для автоматизации задач в Linux, так что практически на любом хосте с Linux будет Python, ну и в-третьих интересно было попробовать Python на реальной задаче. Итак, имеем базу данных на MSSQL 2000, в которую нужно сохранить список курсов валют на каждый день. В базу нужно сохранять не все доступные курсы, а только те, которые актуальны для приложения. Таблица со списком актуальных валют также находится в базе данных. Еще имеется внешний ресурс, который выдает список курсов, он расположен по адресу http://www.cbr.ru/scripts/XML_daily.asp. Курсы выдаются в формате XML. Алгоритм работы скрипта выглядит следующим образом:- Получить из базы список актуальных валют,
- Получить и распарсить XML с курсами валют от cbr.ru,
- Найти среди списка курсов курсы нужных валют и сохранить в базу,
- Отправить сообщение на электронную почту с результатами работы скрипта.
- Linux - ну это понятно, я использовал Ubuntu 12, но скорее всего подойдет любой современный дистрибутив,
- Python 2.6 и выше
- База данных, у меня используется MSSQL 2000
- Библиотека pymssql для создания запросов к БД
Затем, получение и парсинг списка курсов валют:
u = urllib2.urlopen("http://www.cbr.ru/scripts/XML_daily.asp", timeout=10) parser = xml.sax.make_parser() handler = CurrencyRateHandler() parser.setContentHandler(handler) parser.parse(u) print handler.mapping Для загрузки файла используется метод urlopen из библиотеки urllib2. Он возвращает поток, который можно сохранить в файл, а можно напрямую передать парсеру, как в данном случае. Для разбора полученного XML используется стандартный SAX-парсер. Чтобы парсер мог что-то сделать с полученным файлом ему необходим обработчик. Код обработчика представлен в классе CurrencyRateHandler, который наследуется от библиотечного класса xml.sax.handler.ContentHandler. Код обработчика: class CurrencyRateHandler(xml.sax.handler.ContentHandler): def __init__(self): self.inTag = "" self.charCode = "" self.mapping = {} def startElement(self, name, attributes): if name in set(["CharCode","Nominal", "Value"]): self.buffer = "" self.inTag = name else: self.inTag = "" def characters(self, data): if self.inTag: self.buffer += data def endElement(self,name): if name == "CharCode": self.charCode = self.buffer self.mapping[self.charCode] = {} elif name == "Nominal": self.mapping[self.charCode][self.inTag] = int(self.buffer) elif name == "Value": self.mapping[self.charCode][self.inTag] = float(self.buffer.replace(',','.')) self.inTag = "" SAX-обработчик получает события startElement и endElement при обработке открывающего и закрывающего тегов XML соответственно. Содержимое тега поступает в метод characters. Обработчик устроен достаточно просто он проверяет на соответствие имени тега с определенными шаблонами и аггрегирует данные в словарь mapping. В результате разбора получается словарь ключами, которого являются коды валют, а значениями словари, каждый из которых содержит информацию о курсе валюты и номинале обмена (1, 10 или 100 единиц). Затем нам нужно из полученного от парсера словаря отфильтровать только те валюты, которые нас интересуют и записать значения их курсов в базу. Фильтрация словаря выполняется с помощью функции filter: update_rates(filter(lambda c: rates.has_key(c['Name']), currencies), rates) Функция update_rates выполняет запись в базу следующим образом: def update_rates(currencies, rates): conn = get_connection() try: cur = conn.cursor() cur.executemany('INSERT INTO Currency_Exchange_Rate(Date,ListID, FromCurrency, Factor,Amount)\ VALUES(dbo.GetDay(GETDATE()),1,%d,%d,%s)', map(lambda c: (c['ID'], rates[c['Name']]['Nominal'], rates[c['Name']]['Value']), currencies)) conn.commit() finally: conn.close() самое интересное в этой функции находится в строке 6, там для формирования списка значений для команды INSERT используется функция map и лямбда-функция, возвращающая кортеж значений для вставки в базу из словаря курсов валют. Вот в общем-то и все, остаются всякие полезные мелочи вроде логгирования и отправки сообщения по электронной почте. Полученный скрипт можно поместить в /etc/cron.daily, чтобы он выполнялся ежедневно по расписанию. Для этого в заголовке нужно указать оболочке какой интерпретатор следует использовать (python конечно же): #!/usr/bin/env python import sys import pymssql import urllib2 import xml.sax.handler и дать файлу разрешение на выполнение: sudo chmod 744 updater.pyjavandweb.blogspot.com
Извлекаем данные о ежедневных курсах валют с сайта ЦБ РФ
В этой статье хочу рассмотреть пример скрипта на языке программирования Python3, который извлекает данные о текущем курсе валют с официального сайта Центрального Банка РФ и сохраняет их в отдельном файле, который в дальнейшем можно открыть с помощью LibreOffice Calc и применить к ним всю его мощь.
Пример больше интересен тем, что в нём используется парсинг XML-файла.
Сам скрипт находится здесь. Условно, скрипт решает три задачи:
- Скачивает XML-файл с курсами валют с сайта ЦБ РФ;
- Анализирует (парсит) XML-файл и извлекает оттуда информацию о курсах валют в нужной нам форме;
- Сохраняет полученную информацию в текстовом файле в виде значений, разделённых запятыми (CSV).
1-й этап
Сайт Центрального Банка РФ позволяет получать данные в виде XML-файлов. Подобнее об этом здесь.
В нашем примере мы получаем данные о ежедневных курсах валют, которые находятся по адресу http://www.cbr.ru/scripts/XML_daily.asp.
Для скачивания XML-файла с сайта ЦБ РФ используется модуль urllib.request:
import urllib.request url = "http://www.cbr.ru/scripts/XML_daily.asp"Открываем URL и считываем его:
webFile = urllib.request.urlopen(url) data = webFile.read()Далее нам надо сохранить данные в файл на жестком диске. По задумке файл должен иметь такое же название, как и конец URL-адреса, но с расширением .xml. Для этого сначала по слэшам разбивается весь URL-адрес и извлекается его концовка.
UrlSplit = url.split("/")[-1]Затем концовка отсеченной части URL-адреса (XML_daily.asp) заменяется на xml:
ExtSplit = UrlSplit.split(".")[1] FileName = UrlSplit.replace(ExtSplit, "xml")Теперь открывается(или создается) на жестком диске файл, в который записываются информация, полученная с интернет страницы:
with open(FileName, "wb") as localFile: localFile.write(data)И в конце выполняется закрытие веб-станицы:
webFile.close()На этом первый этап завершен.
2-й и 3-й этапы
Парсинг XML-файла осуществляется с помощью стандартного модуля xml:
from xml.dom import minidomОткрываем для парсинга скачанный файл:
doc = minidom.parse(FileName)Извлекаем дату из корневого элемента, которая прописана в качестве его первого атрибута:
root = doc.getElementsByTagName("ValCurs")[0]XML-код этого элемента выглядит так:
<ValCurs Date="16.12.2014" name="Foreign Currency Market">Теперь создаем строку с датой, которая позже будет записана в выходной файл в качестве заголовка:
date = "Текущий курс валют на {date}г. \n".format(date= root.getAttribute('Date'))Создадим еще одну строку, которая также будет записана в выходной файл и будет служить строкой таблицы с названиями столбцов (каждый столбец отделен от другого точкой с запятой ;):
head = "Идентификатор; Номинал; Название валюты; Сокращение; Курс (руб) \n"Следующий кусок кода объединяет в себе два этапа. Сначала получаем все данные по валютам:
currency = doc.getElementsByTagName("Valute")Затем открываем файл, в который будут записываться данные. Открывается он также с помощью менеджера контекста With ... as:
with open("exchange.txt","w") as out:Записываем раннее подготовленные строки с датой и заголовками столбцов:
out.write(date) out.write(head)Извлекаем данные по каждой валюте и записываем их в удобной для нас форме:
for rate in currency: sid = rate.getAttribute("ID") charcode = rate.getElementsByTagName("CharCode")[0] name = rate.getElementsByTagName("Name")[0] value = rate.getElementsByTagName("Value")[0] nominal = rate.getElementsByTagName("Nominal")[0] str = "{0}; {1}; {2}; {3}; {4} \n".format(sid, nominal.firstChild.data, name.firstChild.data, charcode.firstChild.data, value.firstChild.data) out.write(str)Все, скрипт готов. Запускаем его командой python3 daily_rate.py и ищем в папке со скриптом файл exchange.txt.
Открываем CSV в LibreOffice и Google Документах
По сути у нас получился CSV-файл, который представляется собой таблицу, столбцы которой отделяются точкой с запятой, а строки - строками. LibreOffice Calc отлично понимает такие файлы (говорят, гораздо лучше чем Exсel).
Достаточно просто открыть наш файл exchange.txt с помощью LibreOffice Calc. Появится диалоговое окно, в котором необходимо поставить галочку напротив Точка с запятой и обязательно снять галочку напротив Запятая, так как запятая используется в качестве разделителя десятичных знаков в столбце с курсом валют.
Теперь можно использовать всю мощь LibreOffice Calc для дальнейшего анализа и построения графиков.
С таким же успехом CSV-файлы понимают и Google Документы.
Смотрите также:
Источники
librerussia.blogspot.com
Python. Получение данных о курсе валют.
В процессе изучения языка python, а именно работа с XML, мной в учебных целях был написан скрипт получающий значения валют в рублях с сайта ЦБР (http://www.cbr.ru/).
Получаемый XMl файл выглядит следующим образом:
<ValCurs Date="10.02.2015" name="Foreign Currency Market"> <Valute> <NumCode>036</NumCode> <CharCode>AUD</CharCode> <Nominal>1</Nominal> <Name>Австралийский доллар</Name> <Value>51,2242</Value> </Valute> <Valute> <NumCode>944</NumCode> <CharCode>AZN</CharCode> <Nominal>1</Nominal> <Name>Азербайджанский манат</Name> <Value>83,9695</Value> </Valute> <Valute> <NumCode>826</NumCode> <CharCode>GBP</CharCode> <Nominal>1</Nominal> <Name>Фунт стерлингов Соединенного королевства</Name> <Value>100,2974</Value> </Valute> ... |
<ValCurs Date="10.02.2015" name="Foreign Currency Market"> <Valute> <NumCode>036</NumCode> <CharCode>AUD</CharCode> <Nominal>1</Nominal> <Name>Австралийский доллар</Name> <Value>51,2242</Value> </Valute> <Valute> <NumCode>944</NumCode> <CharCode>AZN</CharCode> <Nominal>1</Nominal> <Name>Азербайджанский манат</Name> <Value>83,9695</Value> </Valute> <Valute> <NumCode>826</NumCode> <CharCode>GBP</CharCode> <Nominal>1</Nominal> <Name>Фунт стерлингов Соединенного королевства</Name> <Value>100,2974</Value> </Valute> ...
полную его версию можно посмотреть по ссылке: http://www.cbr.ru/scripts/XML_daily.asp?date_req
Чтоб получить значения здесь и сейчас:
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from xml.etree import ElementTree as ET id_dollar = "R01235" id_evro = "R01239" valuta = ET.parse(urllib.urlopen("http://www.cbr.ru/scripts/XML_daily.asp?date_req")) for line in valuta.findall('Valute'): id_v = line.get('ID') if id_v == id_dollar: rub = line.find('Value').text print "\nКурс доллара",rub,"рублей" if id_v == id_evro: rub = line.find('Value').text print "\nКурс евро",rub,"рублей" |
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib from xml.etree import ElementTree as ET id_dollar = "R01235" id_evro = "R01239" valuta = ET.parse(urllib.urlopen("http://www.cbr.ru/scripts/XML_daily.asp?date_req")) for line in valuta.findall('Valute'): id_v = line.get('ID') if id_v == id_dollar: rub = line.find('Value').text print "\nКурс доллара",rub,"рублей" if id_v == id_evro: rub = line.find('Value').text print "\nКурс евро",rub,"рублей"
Чтоб использовать функцию в других скриптах:
import urllib import datetime from xml.etree import ElementTree as ET def dollar_evro(): """Получает значения доллара и евро в рублях на время запуска. Данные берутся с сайта ЦБР. Возвращает значение доллара в рублях, евро в рублях, дату.""" id_dollar = "R01235" id_evro = "R01239" valuta = ET.parse(urllib.urlopen("http://www.cbr.ru/scripts/XML_daily.asp?date_req")) for line in valuta.findall('Valute'): id_v = line.get('ID') if id_v == id_dollar: rub_dollar = line.find('Value').text if id_v == id_evro: rub_evro = line.find('Value').text today = datetime.date.today() return rub_dollar,rub_evro,today if __name__ == "__main__": print dollar_evro() |
import urllib import datetime from xml.etree import ElementTree as ET def dollar_evro(): """Получает значения доллара и евро в рублях на время запуска. Данные берутся с сайта ЦБР. Возвращает значение доллара в рублях, евро в рублях, дату.""" id_dollar = "R01235" id_evro = "R01239" valuta = ET.parse(urllib.urlopen("http://www.cbr.ru/scripts/XML_daily.asp?date_req")) for line in valuta.findall('Valute'): id_v = line.get('ID') if id_v == id_dollar: rub_dollar = line.find('Value').text if id_v == id_evro: rub_evro = line.find('Value').text today = datetime.date.today() return rub_dollar,rub_evro,today if __name__ == "__main__": print dollar_evro()
Результат выполнения первого скрипта будет следующим:
root@my-test-car:~/script/python/xml# ./valuta.py Курс доллара 65,7817 рублей Курс евро 74,5833 рублей |
root@my-test-car:~/script/python/xml# ./valuta.py Курс доллара 65,7817 рублей Курс евро 74,5833 рублей
Аналогично можно получить значения и других валют.
r.edbox.ru