19 may. 2017

Obtener datos de eventos sismológicos de Funvisis con Python

Este artículo es gracias al código desarrollado por William Cabrera, donde en su blog menciona que creó un Canal en Telegram sobre los Sismos en Venezuela. El código fuente de sus scripts en php fueron la base para el código Python que se muestra en este artículo.

Gracias William por esta herramienta de información que es el Canal en Telegram.


Se usará mechanizeBeautifulSoup para obtener la información del sitio de funvisis por medio de WebScraping.  La información que se quiere obtener se muestra en un recuadro en la siguiente figura:





Para ver cual sección del código html se tiene que buscar, se le da boton derecho a inspeccionar elemento y la siguiente figura muestra el resultado:


Ahí se ve claramente  el tag html que es necesario buscar.

A continuación se muestra el código de la aplicación:



#!/usr/bin/env python





#Se importa mechanize y cookielib

import mechanize

import cookielib

#Se importa beautifulSoup

from BeautifulSoup import BeautifulSoup





def Sismo():

    br = mechanize.Browser()

    #Se crea una instancia para la Cookie

    cj = cookielib.LWPCookieJar()

    #Se asocia la instancia del cookie con el navegador.

    br.set_cookiejar(cj)

    #Se deshabilita el manejo de robots.txt

    br.set_handle_robots(False)

    #Se define el tiempo de refrescamiento

    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

    #Se pasa el url del sitio timeanddate con la informacion

    url = "http://www.funvisis.gob.ve/"



    urlhome = url + "index.php"

    #de la salida y ocultamiento del sol en Venezuela.

    #Se define las cabeceras del navegador, en este caso se le esta diciendo

    # que el navegador es un firefox desde Linux Debian

    br.addheaders = [('SSL_VERIFYHOST', False),\

        ('FRESH_CONNECT',True),\

        ('RETURNTRANSFER',True),\

        ('SSL_VERIFYPEER', False),\

        ('Referer', 'http://www.cantv.com.ve'),\

        ('User-agent','Mozilla/5.0 (X11; U; Linux i686; es-VE; rv:1.9.0.1)Gecko/2008071615 Debian/6.0 Firefox/9')]

    #Se abre el url

    r = br.open(urlhome)

    #Se lee el htmml de la pagina

    html = br.response().read()

    #Se crea una instancia de BeautifulSoup pasando el html

    #a verificar

    soup = BeautifulSoup(html)

    sismo = {}



    #SE obtiene el primer  div que tengan class module

    for row in soup('div', {'class': 'module'})[0]:

        #Se obtiene el tag a para luego obtener el href y tener el url

        #del gif del sitio de funvisis que tiene la imagen del sitio donde

        #fue el sismo.

        trs = row.find('a')

        if trs == -1:

            continue

        sismo['urlref'] = url  + trs.get('href',None)



        trs = row.find('tr')

        if trs == -1:

            continue

        #Obtiene los datos del sismo del sitio de funvisis

        datos = trs.find('td').getText()

        sismo['fecha'] = datos.split(' ')[1][:-5]

        sismo['hora'] =  datos.split(' ')[2][-20:-14]

        sismo['magnitud'] = datos.split(' ')[3][-16:-12]

        sismo['profundidad'] = datos.split(' ')[4][-6:] + " " + datos.split(' ')[5][-11:-8]

        sismo['latitud'] = datos.split(' ')[6].split('º')[0][-9:] +datos.split(' ')[6][-10:-9]

        linea = datos.split(' ')[7].split('º')

        sismo['longitud'] = linea[0][-9:]+ linea[1][0]

        sismo['epicentro'] = datos.split(' ')[8]

        return sismo



def EventoSismoJSON():

    #Devuelve los datos del sismo en formato JSON

    import json

    return json.dumps(Sismo())



if __name__ == '__main__':

    print Sismo()

    print EventoSismoJSON()



A ejecutar el Script devuelve el diccionario con la información del evento sismológico.

python sismux_getdata.py 
{'hora': u'16:13 ', 'latitud': u'   11.73 N', 'epicentro': u'52 Km al sur de Curazao', 'profundidad': u'  40.6 km', 'fecha': u'19/05/2017', 'urlref': u'http://www.funvisis.gob.ve/images/reportes/2017/05/reporte_7415.gif', 'magnitud': u' 3.0', 'longitud': u'  -68.93 O'}
{"hora": "16:13 ", "latitud": "   11.73 N", "epicentro": "52 Km al sur de Curazao", "profundidad": "  40.6 km", "fecha": "19/05/2017", "urlref": "http://www.funvisis.gob.ve/images/reportes/2017/05/reporte_7415.gif", "magnitud": " 3.0", "longitud": "  -68.93 O"}


El código fuente del script lo pueden ver en el repositorio de gitlab.

El siguiente artículo será subir la información en una base de datos mongoDB en mongolab y consultar si el evento sismográfico ya no está registrado.


8 may. 2017

Cálculo de Pi por el método MonteCarlo usando Python.

El método MonteCarlo es un método estadístico numérico que se usa para aproximar expresiones matemáticas complejas y costosas de evaluar conexactitud. Para más información pueden revisar wikipedia.

La expresión matemática que se va a resolver es el cálculo de Pi.

En este artículo mostraré dos versiones del uso del Método MonteCarlo.

El primer ejemplo el algoritmo fue tomado de un código en Pascal y llevado a Python. A continuación el código:


#!/usr/bin/env python

#Se importa el modulo random

import random



#Se define la funcion

def Pi(limite=10000000):

    dentro = 0

    contador = 0

    #Se hace un ciclo hasta que contador sea igual al limite

    while contador < limite:

        #Se calcula  que los puntos esten dentro del radio del circulo

        #Si es asi se incrementa la variable dentro. y luego se incrementa

        #contador para pasar al siguiente ciclo.

        if ((random.random()**2 + random.random()**2) <= 1):

            dentro += 1

        contador += 1

    #Se retorna el resultado de la cantida de puntos dentro del circulo

    #entre el limite por 4.

    return 4.0*float(dentro)/limite



if __name__ == "__main__":

    n = (10000, 1000000,100000000)

    for i in n:

        print ("El valor de pi es: {0:2.8f} para n {1}".format(Pi(i),i))


Al ejecutar el código se tiene:

El valor de pi es: 3.14960000 para n 10000
El valor de pi es: 3.14308000 para n 1000000
El valor de pi es: 3.14141900 para n 100000000


Al aumentar el valor de n se logra tener un número más preciso del valor de PI, claro también se llevará más tiempo en calcular.

En el siguiente ejemplo se basa en un articulo en inglés publicado en Medium que se llama Day 9: Monte Carlo Pi y el código del mismo se encuentra en github.

El código se muestra a continuación:

#!/usr/bin/env python

#Se importa el modulo numpy

import numpy as np





def pi(n, batch=1000):

    t = 0

    for i in range(n // batch):

        p = np.random.rand(batch, 2)

        p = (p * p).sum(axis=1)

        t += (p <= 1).sum()

    return 4 * float(t) / n





if __name__ == "__main__":

    print ("El valor de pi es: {0:2.8f} para n {1}".format(pi(10**8),10**8))


Al ejecutarlo se obtiene:

El valor de pi es: 3.14146076 para n 100000000


Como ven la última versión es menos la cantidad de líneas de código y más rápida. 


7 may. 2017

Restructuración del blog.

Tengo varios días sin escribir algo en el blog, primero está la situación local, y lo otro es que ando pensando hacer una restructuración de los blogs que tengo.

Los blogs que tengo son:

  •  ernestocrespo.blogspot.com: Blog en inglés que lo tengo algo descuidado. Este blog lo pienso migrar de primero al url http://blog2.crespo.org.ve y usaré pelican para el contenido.
  • blog.crespo.org.ve: Versión en Español del blog, que tiene más de 300 posts. Como este blog es el que tiene más contenido, la migración será por etapas teniendo una versión beta con nombre blog3.crespo.org.ve, cuando esté lista la migración pasará a ser blog.crespo.org.ve
  • Medium: Este blog será para temas generales no técnicos o algunos técnicos (muy pocos). 
  • ernestocrespo13.wordpress.com: Este normalmente es un respaldo del blog en Español,  ahora manejará los posts de ambos blogs  en inglés y español como respaldo.


En un futuro dejaré de publicar en blogspot y wordpress dejando sólo los blogs  en  pelican.

Otro actividad que tengo es levantar www.crespo.org.ve, y que los dos blogs junto con el de Medium estén enlazaos allí.

El otro punto es que voy a empezar a utilizar acortadores de URL que permitan monetizar el blog, así como ya he colocado enlaces para recibir donaciones vía Billetera Bitcoin o paypal.

A continuación les dejo una imagen donde se encierra en un recuadro negro la billetera bitcoin y el formulario para donar por medio de paypal.




Billetera Bitcoin para donaciones:

197vyJ3KSCj287nLqhb7FSJpJUDayDoTMP

Donar vía Paypal: