19/4/2014

Widget button y Scatter (widget de comportamiento) en kivy.

El artículo anterior se mostró una pequeña introducción de kivy y como tener una ventana con una etiqueta.

También se mostró como separar el layaout de la programación.
A continuación se mostrará dos ejemplos, uno utilizando el widget button y otro con una etiqueta dentro de un Scatter (widget de comportamiento que permite drag, rotar y escalar un widget).
El artículo se basa del vídeo tutorial No.1 del equipo de kivy:

El código python del ejemplo del botón se muestra a continuación:
#!/usr/bin/env python

#Se importa kivy

import kivy

#Se valida que se tiene la versión 1.8.0 de kivy

kivy.require('1.8.0')



#Se importa la clase App y el widget Button

from kivy.app import App

from kivy.uix.button import Button



#Se crea la clase Hola3App que hereda de App

class Hola3App(App):

    #Se define el método build que devuelve el widget Button sin argumentos.

    def build(self):

        return Button()





if __name__ == "__main__":

    #Se crea la instancia de la clase y se ejecuta.

    Hola3App().run()

El archivo hola3.kv con el layaout de hola3.py se muestra a continuación:
Se define el texto del botón, el color será azul y su tamaño.
# File name: hello2.kv

#:kivy 1.8.0

<Button>: 

  text: 'Hola mundo v3!'

  font_size:100

  background_color:(0,0,1,1)

El siguiente vídeo muestra la ejecución del script:


El siguiente ejemplo es del uso del widget de comportamiento Scatter, este widget permite realizar drag, cambiar de escala de lo que contenga el widget y rotar, aparte es un wiget que soporta multitouch.

El código de hola4.py se muestra a continuación:

#!/usr/bin/env python

#se importa kivy

import kivy

#Se válida que la versión de kivy sea la 1.8.0

kivy.require('1.8.0')



#Se importa la clase App

from kivy.app import App

#Se importa Scatter, Label y FloatLayout

from kivy.uix.scatter import Scatter

from kivy.uix.label import Label

from kivy.uix.floatlayout import FloatLayout





#Se crea la clase Hola4App que hereda de App

class Hola4App(App):

    #Se define el método build

    def build(self):

        #Se instancia al objeto FloatLayout

        f = FloatLayout()

        #Se instancia al objeto Scatter

        s = Scatter()

        #Se instancia al objeto Label con el texto y el tamaño.

        l = Label(text="Hola v4",font_size=100)

        #Se agrega a FloatLayout la instancia del widget scatter

        f.add_widget(s)

        #Se agrega el widget Label a Scatter

        s.add_widget(l)

        #Se retorna la instancia de FloatLayout

        return f





if __name__ == "__main__":

    #Se ejecuta run de la instancia del objeto Hola4App 

    Hola4App().run()



El siguiente vídeo muestra el resultado de la ejecución del script:



18/4/2014

Desarrollo de aplicaciones multiplataforma con python y kivy

Kivy es una librería que permite usar python para crear aplicaciones para el escritorio y dispositivos móviles con soporte multitouch.

Es multiplataforma:
Soporta:

  • Linux (Debian, Ubuntu, Fedora, ArchLinux, etc). 
  • Raspberry Pi
  • IOS de Apple
  • OSX de Apple
  • Windows
  • Android


Para descargarlo pueden visitar la página del proyecto.

En el caso de Debian en la versión estable (wheezy) toca instalarlo vía pip o bajar la fuente del enlace anterior.
pip install kivy (aplica para cualquier versión de Debian o distro basada en Debian).

Para el caso de la versión de pruebas (Jessie) ya viene en los repositorios de Debian:
apt-get install python-kivy python3-kivy python-kivy-examples


Para más información del proyecto pueden visitar su wiki en github.

El ejemplo que se explicará es el de una ventana con una etiqueta que diga "Hola Mundo!", la primera versión contendrá todo el código en un script en python y la siguiente versión se separa el script python de las características de los widgets.

Código del hola mundo versión 1:
#!/usr/bin/env python

#Se importa kivy

import kivy

#Se válida que se esté usando la versión 1.8.0 de kivy

kivy.require('1.8.0')



#Se importa la clase App y el widget Label

from kivy.app import App

from kivy.uix.label import Label



#Se crea la clase HolaApp que hereda de App

class HolaApp(App):

    #Se crea la función build

    def build(self):

        #Se retorna el widget Label con un texto y el tamaño del mismo

        return Label(text='Hola Mundo!!!',

                     font_size=100)







if __name__ == "__main__":

    #Se instancia la clase y se ejecuta

    HolaApp().run()

El script se llamará hola.py.

A continuación se muestra la figura del resultado de la ejecución del script:



La versión 2 del hola mundo se diferencia del primero por que ahora se manejará dos archivos, hola2.py y hola2.kv, su nombre tiene relación con el nombre de la clase que se crea y es la forma como python y kivy reconoce los archivos que necesita ejecutar.

A continuación el código de hola2.py:
#!/usr/bin/env python

#Se imposta kivy

import kivy

#Se valida que se use la versión 1.8.0 de kivy

kivy.require('1.8.0')



#Se importa la case App y el widget Label

from kivy.app import App

from kivy.uix.label import Label



#Se crea la Clase Hola2App que hereda de App

class Hola2App(App):

    #Se define la función build que retorna el widget Label

    #Esta vez sin ningún argumento ya que será manejado por el archivo hola2.kv

    def build(self):

        return Label()





if __name__ == "__main__":

    #Se instancia la clase Hola2App y se ejecuta.

    Hola2App().run()



Código del archivo hola2.kv:
# File name: hola2.kv

#:kivy 1.8.0

<Label>:

  text: 'Hola mundo v 2!'

  font_size:100

Este archivo tiene la descripción de la etiqueta, con el parámetro text y font_size, esto facilita tener ordenada y cambiar los parámetros de los widgets sin tener que modificar código.

El resultado de la ejecución del script hola2.py se muestra en la siguiente figura:


En siguientes artículos se seguirá explicando el uso de los widgets y como instalar la librería en Android y crear aplicaciones para Android.


2/2/2014

Crear un demonio de Linux con Python

Este artículo se basa en el siguiente artículo en inglés.
La idea es crear un proceso demonio de Linux con Python.
Para ello se requerirá los 2 siguientes librerías de python:

  • Python-daemon
  • Python-lockfile
A lo debian se usa el comando apt-get:
#apt-get install python-daemon python-lockfile

A lo python se ejecuta el comando pip:
#pip install python-daemon lockfile

A continuación se muestra el archivo demonioprueba.py que se colocará en el directorio /usr/share/demonioprueba/ .

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#libreria estándar loggin y time
import logging
import time
#de python-daemon import runner
from daemon import runner
class App():
    def __init__(self):
        #Se define unos path estándar en linux.
        self.stdin_path = '/dev/null'
        self.stdout_path = '/dev/tty'
        self.stderr_path = '/dev/tty'
        #Se define la ruta del archivo pid del demonio.
        self.pidfile_path = '/var/run/demonioprueba/demonioprueba.pid'
        self.pidfile_timeout = 5
    def run(self):
        i = 0
        while True:
            #El código principal va acá
            i += 1
            #Diferentes niveles de registro de bitacora
            logger.debug("Debug message %s" %i)
            logger.info("Info message %s" %i)
            logger.warn("Warning message %s" %i)
            logger.error("Error message %s" %i)
            time.sleep(1)
#Se crea la instancia de la clase
app = App()
#define la instancia de la clase logging para generar la bitacora
logger = logging.getLogger("demonioprueba log")
logger.setLevel(logging.INFO)
#Se define el forma del log
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler = logging.FileHandler("/var/log/demonioprueba/demoniopruebas.log")
handler.setFormatter(formatter)
logger.addHandler(handler)
#Se ejecuta el demonio llamando al objeto app
daemon_runner = runner.DaemonRunner(app)
#Esto evita que el archivo log no se cierre durante la ejecución del demonio
daemon_runner.daemon_context.files_preserve=[handler.stream]
#Ejecuta el método run del objeto app
daemon_runner.do_action()
El archivo se salva en la ruta /usr/share/demonioprueba/demonioprueba.py .
Se crean los directorios /var/log/demonioprueba y /var/run/demonioprueba/ :
#mkdir -p /var/log/demonioprueba
#mkdir -p /var/run/demonioprueba

Se puede probar el demonio al ejecutar el siguiente comando:
python /usr/share/demonioprueba/demonioprueba.py start
root@heimdal:~# started with pid 5915

Se muestra que el demonio se inicio con el pid 5915.
Al ejecutar ps aux  | grep demonioprueba.py se verá el proceso en ejecución:
root@heimdal:~# ps aux | grep demonioprueba.py
root      5915  0.0  0.1  38088  6656 ?        S    17:00   0:00 python /usr/share/demonioprueba/demonioprueba.py start

Como se ve el proceso se inicio con el pid 5915. 

Se puede ver la bitacora al ejecutar:
tail -f /var/log/demonioprueba/demonioprueba.log

A continuación se muestra una parte del log:
2014-02-02 17:01:25,516 - demonioprueba log - WARNING - Warning message 80
2014-02-02 17:01:25,516 - demonioprueba log - ERROR - Error message 80
2014-02-02 17:01:26,517 - demonioprueba log - INFO - Info message 81
2014-02-02 17:01:26,517 - demonioprueba log - WARNING - Warning message 81
2014-02-02 17:01:26,518 - demonioprueba log - ERROR - Error message 81
2014-02-02 17:01:27,519 - demonioprueba log - INFO - Info message 82
2014-02-02 17:01:27,519 - demonioprueba log - WARNING - Warning message 82
2014-02-02 17:01:27,519 - demonioprueba log - ERROR - Error message 82
2014-02-02 17:01:28,520 - demonioprueba log - INFO - Info message 83
2014-02-02 17:01:28,521 - demonioprueba log - WARNING - Warning message 83
2014-02-02 17:01:28,521 - demonioprueba log - ERROR - Error message 83
2014-02-02 17:01:29,522 - demonioprueba log - INFO - Info message 84
2014-02-02 17:01:29,523 - demonioprueba log - WARNING - Warning message 84
2014-02-02 17:01:29,523 - demonioprueba log - ERROR - Error message 84
2014-02-02 17:01:30,523 - demonioprueba log - INFO - Info message 85
2014-02-02 17:01:30,524 - demonioprueba log - WARNING - Warning message 85
2014-02-02 17:01:30,524 - demonioprueba log - ERROR - Error message 85

Se puede detener el demonio ejecutando:
root@heimdal:~# python /usr/share/demonioprueba/demonioprueba.py stop
Terminating on signal 15



Ahora se creará el archivo init de demonio prueba ( salvar el archivo en /etc/init.d/demonioprueba ):

A continuación se muestra el script bash que se usa de plantilla como demonio init:
#!/bin/bash

# Copyright (c) 1996-2012 My Company.

# All rights reserved.

#

# Author: Bob Bobson, 2012

#

# Please send feedback to bob@bob.com

#

# /etc/init.d/demonioprueba

#

### BEGIN INIT INFO

# Provides: demonioprueba

# Required-Start:

# Should-Start:

# Required-Stop:

# Should-Stop:

# Default-Start:  3 5

# Default-Stop:   0 1 2 6

# Short-Description: Test daemon process

# Description:    Runs up the test daemon process

### END INIT INFO



# Activate the python virtual environment

#    . /path_to_virtualenv/activate



case "$1" in

  start)

    echo "Starting server"

    # Start the daemon

    python /usr/share/demonioprueba/demonioprueba.py start

    ;;

  stop)

    echo "Stopping server"

    # Stop the daemon

    python /usr/share/demonioprueba/demonioprueba.py stop

    ;;

  restart)

    echo "Restarting server"

    python /usr/share/demonioprueba/demonioprueba.py restart

    ;;

  *)

    # Refuse to do other stuff
    echo "Usage: /etc/init.d/demonioprueba.sh {start|stop|restart}"
    exit 1
    ;;
esac
exit 0


Se le cambia el permiso al script:
chmod u+x demonioprueba.sh

Se habilita el script para la ejecución automática:
root@heimdal:/etc/init.d# insserv demonioprueba.sh

Acá les dejo un ejemplo parecido.


25/1/2014

Crear URL recortadas con Python (bit.ly)

Todos conocemos lo famoso que se han hecho los sitios para recortar URL debido al problema de microblogin a 144 caracteres (donde tenemos que ahorrar en la escritura).

Los recortadores reducen la cantidad de carácteres que puede llegar a tener un url que queramos compartir.

Existen varios sitios que facilitan el recortar URL:

  • Bit.ly
  • Goo.gl
  • TinyURL
En este caso se va a probar con bit.ly, el sitio tiene un API para poder acceder desde un programa, su documentación se encuentra acá.

Es necesario registrar la aplicación y luego buscar el apikey.

El script que se va a hacer tiene de requerimiento los siguientes módulos de python:

  • urllib
  • urllib2
  • re
  • simplejson
El script es sencillo, se pasa la serie de módulos a utilizar, se pasa el usuario y el apikey que se obtuvo de bit.ly y se llama a la función que recorta el url.

A continuación se muestra el código:
#!/usr/bin/python
# Script que convierte un url a un url recortado por medio de bit.ly
# requiere urllib, urllib2, re, simplejson
#Se intenta importar los modulos que se necesito si no devuelve mensaje de error
#donde se menciona que se requiere los los modulos.
try:
from re import match
from urllib2 import urlopen, Request, HTTPError
from urllib import urlencode
from simplejson import loads
except ImportError, e:
raise Exception('Required module missing: %s' % e.args[0])
#Definicion de usuario y clave bit.ly
user = "o_5j8ri77vv6aa"
apikey = "R_172fe1dcf183470c85ce345aaa784cf9395"
#Funcion que recorta el url, se le pasa un url y devuelve el mismo recortado
def shorten(url):
#Se maneja la excepcion de error http
try:
#Se le pasa los parametros url, user, apikey y formato de serializacion en
#este caso json
params = urlencode({'longUrl': url, 'login': user, 'apiKey': apikey, 'format': 'json'})
#Se hace la solicitud al api de bit.ly pasandole los parametros
req = Request("http://api.bit.ly/v3/shorten?%s" % params)
#Se abre la respuesta.
response = urlopen(req)
#Se lee y se carga
j = loads(response.read())
#Si el codigo de estatus de la peticion http es 200
#se retona el url recortada
if j['status_code'] == 200:
return j['data']['url']
#Si no es 200 se genera una excepcion pasando el mensaje de estatus
raise Exception('%s'%j['status_txt'])
#Si no se logra la conexion http se devuelve un mensaje de error.
except HTTPError, e:
raise('HTTP error%s'%e.read())
if __name__ == '__main__':
#Se importa argv del modulo sys
from sys import argv
#Si no inicia el argumento con http se devuelve un mensaje de error
#solicitando que se coloque el http al url.
if not match('http://',argv[1]):
raise Exception('Debe iniciar con "http://"')
#Se muestra en la consola el url recortado
    print shorten(argv[1])
Al ejecutar el script se tiene lo siguiente:
ernesto@grievous:~/bin/python$ ./acortarurl.py http://blog.crespo.org.ve

http://bit.ly/LXP0QB

Con el script ya se puede ir recortando url de por ejemplo el artículo anterior donde se obtiene la lista de artículos de un blog por medio de rss.

19/1/2014

Obtener información del clima en una ciudad con Python


Existe la librería PyOWM el cual es un wrapper para el API de OpenWeatherMap.
La documentación para utilizar la librería se encuentra en el siguiente enlace.

Para poder utilizar la librería es necesario crear una cuenta en OpenWeatherMap y en el perfil del usuario buscar el APPID. En el  enlace explican el procedimiento.

Para instalar la librería se ejecuta pip:
#pip install pyowm

A continuación se muestra el código de un script que muestra el uso de la librería:




#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyowm
#Llave del uso del API
apikey = "abcdefghijklimnopqrstuvxyz"
#Se crea la instancia OWM pasando la llave para el uso del API.
owm = pyowm.OWM(apikey)
#Se obtiene la llave de uso del API
print owm.get_API_key()
#Se define la ciudad por nombre o se pasa la coordenada.
obs = owm.weather_at('Valencia,ve')
#obs = owm.weather_at_coords(-0.107331,51.503614)
print "tiempo: ", obs.get_reception_time()
print "tiempo: ", obs.get_reception_time(timeformat='iso')
#Se Instancia los datos de la estacion meterologica.
w = obs.get_weather()
print "Fecha y hora ",w.get_reference_time(timeformat='iso')
print "Nubes:", w.get_clouds()
print "lluvias:", w.get_rain()
print "Nieve: ", w.get_snow()
print "viento", w.get_wind()
print "humedad:",w.get_humidity()
print "presion:", w.get_pressure()
print "Temperatura:",w.get_temperature()
print "Temperatura:",w.get_temperature(unit='celsius')
print "Estatus", w.get_status()
print "Hora de salida del sol",w.get_sunrise_time("iso")
print "Hora de ocultarse el sol",w.get_sunset_time('iso')
l = obs.get_location()
print "nombre:", l.get_name()
print "Longitud: %s, Latitud: %s" %(l.get_lon(),l.get_lat())
print "Identificador", l.get_ID() Al ejecutar la aplicación se tiene lo siguiente: ernesto@heimdal:~/bin/python$ ./clima.py  abcdefghijklimnopqrstuvxyz tiempo:  1390165372 tiempo:  2014-01-19 21:02:52+00 Fecha y hora  2014-01-19 20:00:00+00 Nubes: 20 lluvias: {} Nieve:  {} viento {u'speed': 2.1, u'deg': 110} humedad: 41 presion: {'press': 1012, 'sea_level': None} Temperatura: {'temp_kf': None, 'temp_min': 308.15, 'temp': 308.15, 'temp_max': 308.15} Temperatura: {'temp_kf': None, 'temp_max': 35.0, 'temp': 35.0, 'temp_min': 35.0} Estatus clouds Hora de salida del sol 2014-01-19 10:54:19+00 Hora de ocultarse el sol 2014-01-19 22:31:34+00 nombre: Valencia Longitud: -68.01, Latitud: 10.16 Identificador 3625549
Noten que la hora de salida y ocultamiento del sol está referente al meridiano 
de greenwich (es necesario ajustar al huso horario correspondiente).

18/1/2014

Jugando con RSS del blog desde Python

Feliz año a todos.
Tenía algo de tiempo sin escribir en el blog.
Este artículo trata del como usar la librería Feedparser para extraer información del RSS de este blog.

Al final del blog (blog.crespo.org.ve) aparece la suscripción al Blog por medio de Atom (ver imagen):

Al darle clip al enlace aparece lo siguiente (http://feeds.feedburner.com/LaLibertadDeDesarrollarNoTienePrecio):


El blog está sindicalizado desde FeedBurner.

La idea es utilizar la librería feedparser para extraer información de la sindicalización del blog.

Se importa la librería feedparser:
>>>import feedparser

Se instancia la clase parse con el url  de la sindicalización del blog:
>>>d = feedparser.parse('http://feeds.feedburner.com/LaLibertadDeDesarrollarNoTienePrecio')

Se muestra el título del blog:
>>> d['feed']['title']

u'La libertad de desarrollar no tiene  precio...'

Otra forma de obtener el título del blog:
>>> d.feed.title

u'La libertad de desarrollar no tiene  precio...'

Enlace del blog:
>>> d.feed.link

u'http://blog.crespo.org.ve/'

Descripción del blog:
>>> d.feed.description

u'Blog dedicado al Software Libre en especial Linux Debian, Android y FreeBSD, a la programaci\xf3n en python con gtk, qt y en Android.'

Elementos del diccionario:
>>> d.keys()

['feed', 'status', 'updated', 'updated_parsed', 'encoding', 'bozo', 'headers', 'etag', 'href', 'version', 'entries', 'namespaces']

Para obtener el author del blog, se ejecuta author en feed:
>>> d.feed.author

u'Ernesto Crespo (noreply@blogger.com)'

La codificación del texto del blog es UTF-8:
>>> d.encoding

u'UTF-8'

Estatus:
>>> d.status

200

Actualización:
>>> d.updated

'Sun, 19 Jan 2014 00:03:47 GMT'

En este caso devuelve la hora pero la información separada:
>>> d.updated_parsed

time.struct_time(tm_year=2014, tm_mon=1, tm_mday=19, tm_hour=0, tm_min=3, tm_sec=47, tm_wday=6, tm_yday=19, tm_isdst=0)

Encabezados del blog:
>>> d.headers

{'alternate-protocol': '80:quic', 'x-xss-protection': '1; mode=block', 'x-content-type-options': 'nosniff', 'expires': 'Sun, 19 Jan 2014 01:01:50 GMT', 'server': 'GSE', 'last-modified': 'Sun, 19 Jan 2014 00:03:47 GMT', 'connection': 'close', 'etag': 'hSh9ZbFEawbSc3BqlNVkqha27os', 'cache-control': 'private, max-age=0', 'date': 'Sun, 19 Jan 2014 01:01:50 GMT', 'content-type': 'text/xml; charset=UTF-8'}

Enlace:
>>> d.href

u'http://feeds.feedburner.com/LaLibertadDeDesarrollarNoTienePrecio'

Tipo de RSS (Atom1.0):
>>> d.version

u'atom10'


Cantidad de entradas:
>>> len(d.entries)

25

Si se desea obtener el título de la última entrada en el blog:
>>> d.entries[0].title

u'Webscraping con Python Mechanize y BeautifulSoup4'

Si se desea ver el contenido de la última entrada ( en html) :
>>> d.entries[0]

.....

'guidislink': True, 'published': u'2013-10-29T03:30:00.000-04:30', u'thr_total': u'0'}

Devuelve un diccionario con dentro código html  e información adicional.

Para obtener el link del último artículo:
>>> d.entries[0].link

u'http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/A9jUi9ATI2g/webscraping-con-python-mechanize-y.html'

La fecha de publicación del último artículo:
>>> d.entries[0].published

u'2013-10-29T03:30:00.000-04:30'

El id del último artículo:
>>> d.entries[0].id

u'tag:blogger.com,1999:blog-882744969176160062.post-8013337259867824164'

Si se desea listar los últimos 25 artículos con su título y enlace se ejecuta un ciclo:
>>> for post in d.entries:

...     print post.title + ": " + post.link + "\n"

... 

Webscraping con Python Mechanize y BeautifulSoup4: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/A9jUi9ATI2g/webscraping-con-python-mechanize-y.html



Extracción de datos con Scraperwiki y Python: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/UbQD5y9jbr0/extraccion-de-datos-con-scraperwiki-y.html



Extracción de datos de página web con pyquery y Python: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/1QbC7CmSqpk/extraccion-de-datos-de-pagina-web-con.html



Extracción de datos de páginas web con Scrapemark y Python: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/g2iUGraxW0M/extraccion-de-datos-de-paginas-web-con.html



Extracción de datos en páginas web con Webscraping y Python: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/W9NyMTnRYok/extraccion-de-datos-en-paginas-web-con.html



Webscraping o extracción de datos de páginas web con BeautifulSoup4 y Python: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/xFr0x9bSo7E/webscraping-o-extraccion-de-datos-de.html



Un introducción a Beautiful Soup 4 en Python.: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/_7MGtsSCnPg/un-introduccion-beautiful-soup-4-en.html



Obtener información de metadatos EXIF de una imagen con Python: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/8U6SjV9RS-w/obtener-informacion-de-metadatos-exif.html



Mostrar tweets en tiempo real con twython y el API Stream de Twitter: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/jdMIKN04gDs/mostrar-tweets-en-tiempo-real-con.html



Descrubiendo Trending Topics de Twitter con twython y python: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/hfKN5Cat5Hw/descrubiendo-trending-topics-de-twitter.html



Probando la librería twython para twitter: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/qfv-BUMniFA/probando-la-libreria-twython-para.html



Manejo de sesión en el ORM sqlalchemy: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/OjR1D7SxjGQ/manejo-de-sesion-en-el-orm-sqlalchemy.html



Bajar vídeos de youtube desde Python con Pafy.: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/IV42QCqWZA8/bajar-videos-de-youtube-desde-python.html



Día Debian en Barquisimeto: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/fK8Q4DtjW8c/dia-debian-en-barquisimeto.html



Nodos más influenyes en un grafo con networkx. Parte 4.: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/knGC3Agy03M/nodos-mas-influenyes-en-un-grafo-con.html



Mejorar la privacidad en celulares y tabletas con Android: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/WHiecOQggP4/mejorar-la-privacidad-en-celulares-y.html



Graficar la tangente de una curva con python, numpy y pylab.: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/YB9pcnkSjPg/graficar-la-tangente-de-una-curva-con.html



Utilizando el API de Stream de Twitter con Python y tweetstream. Parte 1.: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/4XndFuAR-wQ/utilizando-el-api-de-stream-de-twitter.html



Máquinas virtuales con kvm y qemu: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/hBovEziYwnM/maquinas-virtuales-con-kvm-y-qemu.html



Descubriendo trending topics de twitter con python-twitter.: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/kAqQ7BRC_4w/descubriendo-trending-topics-de-twitter.html



Descubrir equipos en una Red Local con Python (ipcalc y scapy).: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/KSulfIHpfaA/descubrir-equipos-en-una-red-local-con.html



Resolución de sistemas de ecuaciones lineales por descomposión QR usando Numpy: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/KJ6mmAemwzk/resolucion-de-sistemas-de-ecuaciones.html



Creación de gráfico de burbujas con matplotlib: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/Lu7ps2Z-zQI/creacion-de-grafico-de-burbujas-con.html



Manejar información de un archivo csv con csvkit: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/6opCWEx9RoU/manejar-informacion-de-un-archivo-csv.html



Teorema de muestreo explicado con numpy: http://feedproxy.google.com/~r/LaLibertadDeDesarrollarNoTienePrecio/~3/VoY_nZzRtwY/teorema-de-muestreo-explicado-con-numpy.html

De está forma se puede acceder con python al RSS de blogs.
En próximo artículo se buscará recortar los urls desde python.

29/10/2013

Webscraping con Python Mechanize y BeautifulSoup4

Ahora se utilizará a Python Mechanize con BeautifulSoup4 para extraer la información de la salida y ocultamiento del sol en Venezuela con un breve cambio para mostrar el dinamismo que se le puede dar a la extracción de datos de una página web.

En este caso se extraerá información del mismo sitio timeanddate, la diferencia es que en vez de sólo pasarle el código de Venezuela (58), se le pasará el mes y el año.


El código muestra la información del amanecer y atardecer de todo el mes de Octubre y Noviembre.

A continuación se muestra el código:
#!/usr/bin/env python
#Se importa mechanize y cookielib
import mechanize
import cookielib
#Se importa beautifulSoup
from BeautifulSoup import BeautifulSoup
def DefinirUrl(mes,agno):
    #Se pasa el url del sitio timeanddate con la informacion
    #de la salida y ocultamiento del sol en Venezuela.
    return "http://www.timeanddate.com/worldclock/astronomy.htmln=58&month=%s&year=%s&obj=sun&afl=-11&day=1" %(mes,agno)
def CapturarInformacion(mes,agno):
    #Se crea una instancia de Browser
    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 = DefinirUrl(mes,agno)
    #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 = [('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(url)
    #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)
    #Se busca la palabra table, y de ahi class y se
    #busca el contenido
    #de cada columna de la tabla.
    for row in soup('table', {'class': 'spad'})[0].tbody('tr'):
        tds = row('td')
        #Se muestra la fecha y hora de la salida del sol
        print tds[0].string, tds[1].string,tds[2].string
if __name__== "__main__":
    print "Se muestra la informacion del mes de Octubre"
    print "--------------------------------------------"
    CapturarInformacion(10,2013)
    print "Se muestra la informacion del mes de Noviembre"
    print "--------------------------------------------" 
    CapturarInformacion(11,2013)
A continuación se muestra el resultado del script:
Se muestra la informacion del mes de Octubre

--------------------------------------------

1 Oct 2013 05:46 17:48

2 Oct 2013 05:46 17:47

3 Oct 2013 05:46 17:47

4 Oct 2013 05:46 17:46

5 Oct 2013 05:46 17:45

6 Oct 2013 05:46 17:45

7 Oct 2013 05:46 17:44

8 Oct 2013 05:46 17:44

9 Oct 2013 05:46 17:43

10 Oct 2013 05:46 17:43

11 Oct 2013 05:46 17:42

12 Oct 2013 05:46 17:42

13 Oct 2013 05:46 17:41

14 Oct 2013 05:46 17:41

15 Oct 2013 05:46 17:40

16 Oct 2013 05:46 17:40

17 Oct 2013 05:46 17:39

18 Oct 2013 05:47 17:39

19 Oct 2013 05:47 17:38

20 Oct 2013 05:47 17:38

21 Oct 2013 05:47 17:37

22 Oct 2013 05:47 17:37

23 Oct 2013 05:47 17:36

24 Oct 2013 05:47 17:36

25 Oct 2013 05:47 17:36

26 Oct 2013 05:48 17:35

27 Oct 2013 05:48 17:35

28 Oct 2013 05:48 17:35

29 Oct 2013 05:48 17:34

30 Oct 2013 05:48 17:34

31 Oct 2013 05:48 17:34

Se muestra la informacion del mes de Noviembre

--------------------------------------------

1 Nov 2013 05:49 17:33

2 Nov 2013 05:49 17:33

3 Nov 2013 05:49 17:33

4 Nov 2013 05:49 17:33

5 Nov 2013 05:50 17:33

6 Nov 2013 05:50 17:32

7 Nov 2013 05:50 17:32

8 Nov 2013 05:51 17:32

9 Nov 2013 05:51 17:32

10 Nov 2013 05:51 17:32

11 Nov 2013 05:51 17:32

12 Nov 2013 05:52 17:32

13 Nov 2013 05:52 17:32

14 Nov 2013 05:53 17:31

15 Nov 2013 05:53 17:31

16 Nov 2013 05:53 17:31

17 Nov 2013 05:54 17:31

18 Nov 2013 05:54 17:31

19 Nov 2013 05:54 17:32

20 Nov 2013 05:55 17:32

21 Nov 2013 05:55 17:32

22 Nov 2013 05:56 17:32

23 Nov 2013 05:56 17:32

24 Nov 2013 05:57 17:32

25 Nov 2013 05:57 17:32

26 Nov 2013 05:58 17:32

27 Nov 2013 05:58 17:32

28 Nov 2013 05:59 17:33

29 Nov 2013 05:59 17:33

30 Nov 2013 06:00 17:33

Como se muestra ya se puede agregar dinamismo a las busquedas que se quiera realizar en una página web, extrayendo su información al pasarle datos al url. Además se muestra como usar Python Mechanize para la captura de la página web y BeautifulSoup4 para capturar la información necesaria.

28/10/2013

Extracción de datos con Scraperwiki y Python

Continuando con los artículos sobre webscraping con Python, le toca el turno a Scraperwiki.

La documentación de Scraperwiki la pueden encontrar acá.

Aparte de una librería para Python, tiene un sitio interactivo donde puede usar ScraperWiki para Ruby, Php y Python, en el siguiente enlace  pueden ver la interfaz web de ScraperWiki para Python.

Este artículo se basa en el tutorial oficial de ScraperWiki.

En la siguiente figura se muestra la página web de ScraperWiki para Python:


La siguiente imagen muestra la información de la salida y ocultamiento del Sol en Venezuela del sitio timeanddate:

Se muestra a continuación una imagen del código html de la página de la imagen anterior, sombreando la parte de dicho código que nos interesa:

Para instalar ScraperWiki se ejecuta el comando pip:
#pip install scraperwiki

El código para extraer la información se muestra a continuación:
#!/usr/bin/env python
#importar scraperwiki
import scraperwiki
#importar lxml.html
import lxml.html
#Url de la pagina timeanddate de la
#info de Venezuela.
url = "http://www.timeanddate.com/worldclock/astronomy.html?n=58"
#se crea la instancia de la clase scrape pasando el
#url del sitio a extraer la informacion.
html = scraperwiki.scrape(url)
#Se busca en el codigo html de la pagina
root = lxml.html.fromstring(html)
#Se crea una lista que almacenara los diccionarios conteniendo
#la informacion que se necesita
lista = []
#Se busca el tag html tbody y tr.
#Esto genera una lista con el contenido del tbody.Esto
#se recorre dicha lista
for tr in root.cssselect("tbody tr "):
    #Se selecciona la informacion que aparece en
    #el tag html td
    tds = tr.cssselect("td")
    #Se guarda la informacion en un diccionario
    datos = {
        'fecha': tds[0].text_content(),
        'amanecer': tds[1].text_content(),
        'atardecer': tds[2].text_content()
    }
    #Se agrega los datos a la lista
    lista.append(datos)
#Se muestra la lista en pantalla
for i in lista:
    print i
El resultado de la ejecución del script a continuación:
{'fecha': '26 Oct 2013', 'atardecer': '17:35', 'amanecer': '05:48'}

{'fecha': '27 Oct 2013', 'atardecer': '17:35', 'amanecer': '05:48'}

{'fecha': '28 Oct 2013', 'atardecer': '17:35', 'amanecer': '05:48'}

{'fecha': '29 Oct 2013', 'atardecer': '17:34', 'amanecer': '05:48'}

{'fecha': '30 Oct 2013', 'atardecer': '17:34', 'amanecer': '05:48'}

{'fecha': '31 Oct 2013', 'atardecer': '17:34', 'amanecer': '05:48'}

{'fecha': '1 Nov 2013', 'atardecer': '17:33', 'amanecer': '05:49'}


Puede revisar más tutoriales sobre ScraperWiki en el siguiente enlace.

AddThis