четверг, 29 марта 2007 г.

Тянем курсы валют с сайта ЦБ РФ

Сайт www.cbr.ru предоставляет несколько web-сервисов. Один из них - курс валют на определенную дату. Проверить можно так: http://www.cbr.ru/scripts/XML_daily.asp?date_req=29-03-2007.
Сервис возвращает XML-данные, которые и нужно парсить.
Собственно код на Python:


#!/bin/env python
# -*- coding: cp1251 -*-
#----------------------------------------------------------------------------
# Name: cbrroe.py
# Version: 1.0.8
#
# Get XML document from XML web-service www.cbr.ru,
# Parse it and insert into database.
#
# Purpose: CBR Rate of Exchange
#
# Author: Eugene Klepikov
# E-Mail: klek@comtv.ru
#
# Created: 14.04.2005
# Updated: 20.04.2005
# Copyright: (c) 2005 Klek
# Licence: GPL
#
# Set correct value sEncoding to your system encoding
#
#----------------------------------------------------------------------------
##
'''
Get XML document from XML web-service www.cbr.ru,
Parse it and insert into database.
'''
import sys
from time import localtime, strftime
import MySQLdb
import urllib
import xml.dom.minidom

sEncoding="cp1251"
dbServer="dbserver" # Name or IP MySQl server
dbName="DbName" # Data Base name
tblName="CBRExchange"
dbUser="user" # User name
dbPasswd="pass" # User password
#---------------------------------------------------------------------------
def ekGetInput(sDate):
sURL="http://www.cbr.ru/scripts/XML_daily.asp?date_req=%s" % (sDate)
prxy={"http":"http://proxy.server:port"} # Enter correct data or comment
u=urllib.urlopen(sURL)
return u.read()

#---------------------------------------------------------------------------
def ekParseXMLDoc(xmlDoc):
lstDicXMLNodes=[]
dicXMLNodes={}
xmldoc=xml.dom.minidom.parseString(xmlDoc)
root=xmldoc.documentElement
for valute in root.childNodes:
if valute.nodeName=='#text':
continue
for ch in valute.childNodes:
if ch.nodeName=='#text': # Drop TextNode, that is means "\n" in the xml document
continue
dicXMLNodes[ch.nodeName]=ch.childNodes[0].nodeValue
lstDicXMLNodes.append(dicXMLNodes)
dicXMLNodes={}
return lstDicXMLNodes

#---------------------------------------------------------------------------
def main():
sSql=""
lstDicXMLNodes=()
sDate=strftime("%d.%m.%Y", localtime())
sRevDate=strftime("%Y-%m-%d", localtime())
#sDate="03.04.2005"
#sRevDate="2005-04-03"
print "-----",sDate,"-----\n"
lstDicXMLNodes=ekParseXMLDoc(ekGetInput(sDate))
try:
for dicXMLNode in lstDicXMLNodes:
dbh=MySQLdb.Connect(host=dbServer,user=dbUser,passwd=dbPasswd,db=dbName)
cur=dbh.cursor(cursorclass=MySQLdb.cursors.DictCursor)
sSql="INSERT INTO %s (Date, NumCode, CharCode, Nominal, Name, Value) values('%s', '%d', '%s', '%d', '%s', '%9.4f')" % \
(tblName, sRevDate, int(dicXMLNode['NumCode']), dicXMLNode['CharCode'].encode(sEncoding), int(dicXMLNode['Nominal']), \
dicXMLNode['Name'].encode(sEncoding), float(dicXMLNode['Value'].replace(",",".")))
print "Строка запроса: '%s'" % sSql
cur.execute(sSql)
dbh.close()
except MySQLdb.DatabaseError, tplDetailError:
print "ERROR:", tplDetailError.args

else:
print "\n\nDone ;)"

#---------------------------------------------------------------------------
if __name__ == '__main__' :
sys.exit( main() )

#----------------------------------------------------------------------------
#

4 комментария:

Анонимный комментирует...

Красивый веб-сервис и классный пост!

klek комментирует...

Спасибо.
Скрипт под лицензией GPL, так что пользуйтесь.

Анонимный комментирует...

Спасибо.

rishard комментирует...

Скрипт на пыхе, плюс google chart/ Тоже неплохо: http://masterpro.ws/padenie-rossijskogo-rublya-na-google-chart