25 ene. 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 ene. 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 ene. 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.