Ahora se tiene varios módulos:
- sismux_getdata.py: Es el módulo que hace el webscraping de la página de funvisis.
- sismux_mongo.py: Es el módulo que implementa un CRUD para mongoDB a MongoLab.
- sismux_main.py: Es el módulo principal que consulta cada 5 min la página de Funvisis para guardar la información en la base de datos si no existe.
- sismux_apirest.py: Es el módulo que implementa un API rest(próximo artículo).
- sismux_graphql.py: Es el módulo que implementa un API con GraphQL (próximo artículo).
Del artículo anterior se muestra el código de sismux_getdata.py:
#! /usr/bin/env python3
#Se importa beautifulSoup
from bs4 import BeautifulSoup
#Se importa la fecha
import datetime
import requests
import sys
import json
class Sismo( object):
def __init__(self,url="http://www.funvisis.gob.ve/",home="index.php",referer='http://www.cantv.com.ve'):
headers = {'User-agent': 'Mozilla/5.0',\
'SSL_VERIFYHOST': 'False', \
'FRESH_CONNECT':'True', \
'RETURNTRANSFER':'True', \
'SSL_VERIFYPEER': 'False', \
'Referer': referer
}
self . __url = url
self . __home = home
self . __urlhome = self. __url + self. __home
self . __session = requests. Session( )
self . __session. headers. update ( headers)
def GetData( self):
#Se obtiene la pagina por medio de session.
try :
self . __r = self. __session. get( self. __urlhome)
self . __page = self. __r. content
except (requests. exceptions. SSLError):
print ( "SSL Error")
sys . exit( 0)
except (requests. exceptions. ConnectionError):
print ( "Connection Error")
sys . exit( 0)
#Se le pasa la pagina a beautifulsoup usando lxml de parser.
self . __soup = BeautifulSoup( self. __page,"lxml ")
#Se crea el diccionario que almacena los datos
self . __sismo = {}
#SE obtiene el primer div que tengan class module
for row in self. __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
self . __sismo[ 'urlref '] = self. __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 ( ). split( ' ')[0].split('\n\t')
self.__s ismo[' fecha'] = datos[0].split('\xa0')[1]
date = self.__s ismo[' fec ha'].s plit("/")
self.__s ismo[ 'hora'] = d ato s[2].s plit (" ")[-2]
time= self.__s ismo[ 'ho ra'].s plit(":")
self.__sismo['datetime'] = datetime.datetime(int(date[2]),int(date[1]),int(date[0]), int(time[0]), int(time[1]))
self.__s ismo['mag nitud'] = d ato s[4].s plit (" ")[-1]
mag = d ato s[6].s plit(" ")[-1].split('\xa0')
self.__s ismo['profun didad'] = mag[0] + " "+ mag[1]
lat = d ato s[8].s plit(" ")
self.__s ismo["la titud"] = lat[-2] + " " + lat[-1]
lon = d atos [10].s plit(" ")
self.__s ismo['lon gitud'] = lon[-2] + " " + lon[-1]
self.__s ismo['epic entro'] = datos[11].split(":")[1].split('\xa0')[-1]
self.__s ismo['loc'] = {'type':'Point','coordinat es' : [ f loa t (lat[- 2]) , f loa t (lon[- 2]) ]}
r eturn self.__sismo
El código del módulos sismux_mongo.py se muestra a continuació n:
#!/usr/bi n/e nv pyt hon3
import py m o ng o
from py mongo import MongoClient
#Se defi ne e l u ri de la con exion a mon gol ab
uri = 'mongodb://usuario:clave@ds045064.mlab.com:45064/basedatos'
#Se define la ba se de datos y la col e
#c cio n
basedatos = "s is m ux "
coleccio n = "s ismo s"
#Se crea la clase BaseDatos que simplemente implemen te un crud.
class BaseD atos(object):
#Se define la intanc ia de mongoclient, se define la ba se de datos y
#la cole ccion
def __init__(self,uri=uri,basedatos=basedatos,coleccion=coleccion):
self.__client = MongoCl ien t(uri)
self.__db = self.__cl ient[base datos]
self.__coleccion = self. __db[cole ccion]
def ConsultarT odos(self):
#Traer todo s los element os de la consulta.
elem entos = []
for i in self.__colec cion. find():
elem e ntos.ap p end(i)
r et urn i
def Consu ltar( self,patron):
#Se devuelve la con sul ta de un elemento
r eturn self.__colec cion.find _one(patron)
def Inse rtar( self,docu mento):
#Se inser ta un documento
self.__colec cion.in sert(docu mento)
def Final izar(self):
#Se cierra la conexion con la ba se de datos
self.__cl ient.c lose()
A continuaci ón se mu estra sismux_ ma in. py:
#!/usr/bi n/env python 3
from sismux_getdata import S ismo
import json
import time
impor t sy s
from sismux_mongo import Base D atos
impor t d at e time
import logg in g
bd = BaseD atos()
sismo = S ismo()
datos = s ismo.Get Data( )
#bd.Inse rtar( datos)
#d atos[' d at etime']
datime = dat e time.dat e time(2017,5,25, 20, 51)
#p ri n t(bd.Consu ltar({'dat etime': d atie} m ))
def main():
#Se crea la instancia a la base de datos
bd = BaseD atos()
#Se crea la instancia del webscraping
sismo = S ismo()
#Se optiene los datos de la pagina de funvisis
datos = s ismo.Get Data()
#Se consulta si ya existe el dato guardado en la base de datos
query1 = bd.Consu ltar({'dat etime': d atos['dat etime']})
query2 = bd.Consu ltar({'loc': {'coordinates': d atos[' loc']['coordinates']}})
if (que ry1 != None):
r eturn False
else:
#Si no e xis te se inserta en la base de datos.
bd.Inse rtar( datos)
r eturn True
#Se crea un ciclo para consultar cada 5 min
def c icl o(tim=300):
#Se defi ne el log
log ging.basicC o nfig(filename="sismux. log",level=log ging.D EBUG,forma t='%(asc time )s %(message)
s'
)
while True:
#Se ej ecuta main.
r esult = main()
#Se g uarda el resulta do de main en el log
logging.info(result)
#Se espera 5 min (por defecto)
time.s lee p(t im)
if __na m e__ == '_ _main__':
#Se ejecuta la funcion ciclo
c iclo()
Para ejecutar el progra ma se corre:
python3 sismux_ ma in.py
Al ejecutarlo se crea un archivo log y en el se tiene lo siguiente :
tail -f sismux.log
2017-07-24 11:42:43,149 Star
2017-07-24 11:42:43,821 http://www.funvisis.gob.ve:80 "GET /index.php HTTP/1.1" 200 14319
2017-07-24 11:42:56,560 False
2017-07-24 11:47:56,637 Starting new HTTP connection (1): www.funvisis.gob.ve
2017-07-24 11:47:57,466 http://www.funvisis.gob.ve:80 "GET /index.php HTTP/1.1" 200 14319
2017-07-24 11:48:12,086 False
2017-07-24 11:53:12,209 Starting new HTTP connection (1): www.funvisis.gob.ve
2017-07-24 11:53:12,976 http://www.funvisis.gob.ve:80 "GET /index.php HTTP/1.1" 200 14319
2017-07-24 11:53:18,516 False
2017-07-24 11:58:18,605 Starting new HTTP connection (1): www.funvisis.gob.ve
2017-07-24 11:58:30,984 http://www.funvisis.gob.ve:80 "GET /index.php HTTP/1.1" 200 14319
2017-07-24 11:58:57,034 False
Como muestra el log ya se tiene el último sismo en la base de datos.
En la siguiente figura se muestra un documento almacenado en la base de datos:
En la siguiente figura se muestra un documento almacenado en la base de datos:
Para el siguiente artículo se desarrollará el API.
Nota: En un futur artículo se muestra la creación de un demonio y como ponerlo a funcionar con SystemD y el empaquetado de todo los módulos desarrollados.
No hay comentarios:
Publicar un comentario