Tag Archive for 'python'

Identificando posibles “drops” de usuarios de Twitter, con Python

Hace un par de días se supo que Twitter liberará aquellos nombres de usuario que no hayan registrado actividad durante 6 meses o más.

Les dejo una herramienta para obtener los días de inactividad de un usuario a través de su último status publicado. Esta clase puede ser utilizada, por ejemplo, para recorrer listados de palabras en búsqueda de nombres valiosos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import twitter
import sys
import urllib2
from datetime import datetime
 
class UnknownUser(Exception):
    pass
 
class UnknownStatus(Exception):
    pass
 
class TwitterExpire(object):
    def __init__(self):
        self.__t = twitter.Api()
 
    def verify(self, username):
        try:
            user = self.__t.GetUser(user=username)
        except urllib2.HTTPError:
            raise UnknownUser
        else:
            status = user.GetStatus()
            if status:
                timestamp = status.GetCreatedAtInSeconds()
                d = datetime.fromtimestamp(timestamp)
                td = datetime.now() - d
                return td
            else:
                raise UnknownStatus
 
def main(username):
    te = TwitterExpire()
    try:
        result = te.verify(username)
    except UnknownUser:
        print u"User '%s' doesn't exist" % username
    except UnknownStatus:
        print u"Couldn't find any status for '%s'" % username
    else:
        print result
 
if __name__ == '__main__':
    if len(sys.argv) >= 2:
        main(username=sys.argv[1])

Algunos resultados:

mahadeva@blue:~$ python2.5 last_status.py patito
258 days, 11:16:49.425212
mahadeva@blue:~$ python2.5 last_status.py patricio
Couldn't find any status for 'patricio'
mahadeva@blue:~$ python2.5 last_status.py usuarioinexistente
User 'usuarioinexistente' doesn't exist
mahadeva@blue:~$ python2.5 last_status.py shitmydadsays
1 day, 22:35:44.434214

Python 2.5 en iPod Touch 2G

Calculando un timedelta con Python 2.5.1 en el iPod Touch ¡Muy groso!

Me encanta recibir “buenas noticias” (con Python)

Acá les dejo un pequeño programa en Python que busca “buenas noticias” en los feeds RSS de Clarín, InfoBAE y La Nación.

Es altamente configurable (pueden agregar o quitar palabras clave y feeds editando FEEDS y KEYWORDS).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-
 
import feedparser
import re
 
FEEDS = {
    u'Clarín': 'http://www.clarin.com/diario/hoy/um/sumariorss.xml',
    u'InfoBAE': 'http://www.infobae.com/adjuntos/html/RSS/hoy.xml',
    u'La Nación': 'http://www.lanacion.com.ar/herramientas/rss/index.asp',
}
 
KEYWORDS = ['muerto', 'caos', 'inseguridad']
 
def main():
    regexps = [re.compile(keyword, re.IGNORECASE) for keyword in KEYWORDS]
    for feed_name, feed_source in FEEDS.iteritems():
        for entry in feedparser.parse(feed_source).entries:
            for r in regexps:
                if r.search(entry.title):
                    print '%s: %s - %s' % (feed_name, entry.title, entry.link)
                    break 
 
if __name__ == '__main__':
    main()

Acá tienen unos resultados de ejemplo:

1
2
3
4
5
6
7
mahadeva@blue:~$ python buenasnoticias.py
InfoBAE: Un muerto y miles de evacuados por una explosión en Rusia - http://www.infobae.com/mundo/484082-101275-0-Un-muerto-y-miles-de-evacuados-por-una-explosión-en-Rusia
La Nación: Varios muertos en Rusia tras una explosión en un arsenal militar - http://www.lanacion.com.ar/nota.asp?nota_id=1199099
Clarín: Inseguridad: en medio de los cruces, el oficialismo se despega de D'Elía - http://www.clarin.com/diario/2009/11/13/um/m-02040147.htm
Clarín: 12:35 - Detienen a tres chicos por el caso del empresario muerto por una pedrada - http://www.clarin.com/diario/2009/11/13/um/m-02040124.htm
Clarín: Otro choque en la General Paz provocó un caos en el tránsito - http://www.clarin.com/diario/2009/11/13/um/m-02040083.htm
Clarín: Detienen a tres chicos por el caso del empresario muerto por una pedrada - http://www.clarin.com/diario/2009/11/13/um/m-02040124.htm

Consultando Crunchbase con Python

Por mi trabajo, siempre estoy pendiente de lo que sucede en Crunchbase (de hecho, estoy suscripto a su feed de páginas recientes). Con tantas empresas y personas yendo y viniendo por Twitter, se transformó en una fuente de consulta permanente.

¿Puedo consultar Crunchbase con Python? La respuesta es obvia :-)

Crunchbase tiene una API muy interesante que devuelve resultados en formato JSON. Pueden encontrar documentación sobre su uso en en crunchbase-api.

Para este programa estoy usando la librería simplejson (sudo apt-get install python-simplejson)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys, urllib, simplejson
 
api = 'http://api.crunchbase.com/v/1/search.js?%s'
 
def main():
    if len(sys.argv) >= 2:
        q = ' '.join(sys.argv[1:])
        source = urllib.urlopen(api % urllib.urlencode({'query': q}))
        results = simplejson.loads(source.read())
        if results['results']:
            for r in results['results']:
                name = r.get('name')
                if not name:
                    name = ' '.join([w.capitalize() \
                        for w in r['permalink'].split('-')])
                print '%s (%s): %s' % (
                    name.strip(),
                    r['namespace'].capitalize(),
                    r['crunchbase_url'],
                )       
        else:
            print 'No results for "%s"' % q
    else:
        print 'Usage: python %s <keyword(s)>' % sys.argv[0]
 
if __name__ == '__main__':
    main()

Aquí tienen algunos resultados:

mahadeva@blue:~$ python crunchbase.py
Usage: python crunchbase.py
mahadeva@blue:~$ python crunchbase.py popego
Popego (Company): http://www.crunchbase.com/company/popego
Santiago Siri (Person): http://www.crunchbase.com/person/santiago-siri

El programa en sí no es muy cómodo de usar (para eso existen los add-ons de de Firefox ;-) ), pero es un buen punto de partida para utilizar, por ejemplo, como una aplicación de Django, o un bot que interactúe con Twitter.

Buscador para Twitter, con Python, en 12 líneas

Hoy estuve viendo los resultados de la búsqueda #pyconar2009 en Twitter Search, y me dije: “por qué no hacer las búsquedas desde consola, con Python?”

Unos minutos después, aquí está el resultado:

1
2
3
4
5
6
7
8
9
10
11
12
import feedparser, urllib
 
def main():
    feed_source = 'http://search.twitter.com/search.atom?%s'
    q = raw_input('Search term: ')
    if q:
        f = feedparser.parse(feed_source % urllib.urlencode({'q': q}))
        for entry in f.entries:
            print '%s: "%s"' % (entry.author, entry.title) 
 
if __name__ == '__main__':
    main()

En este caso usé Universal Feed Parser ($ sudo apt-get install python-feedparser), pero pueden utilizar la librería que más les guste :-)

PyCon Argentina 2009

El 4 y el 5 asistí a la PyCon Argentina 2009, la primera conferencia mundial en castellano sobre el lenguaje de programación Python. Vi muchas caras conocidas: desde compañeros de laburo hasta amigos del mundo del Software Libre. También vi a un par de voluntarios que habían participado de la última Wikimanía en Buenos Aires.

Del primer día quiero destacar dos charlas:

  • Me gustó mucho “Hacking Django, mismo framework, distintos paradigmas” de Nubis. Hizo gala de sus conocimientos y demostró ser un excelente orador. Le veo mucha pasta como conferencista.
  • The State of Django” de Jacob Kaplan-Moss me pareció excelente. De todas formas, no estoy totalmente de acuerdo con su punto de vista sobre los problemas de escalabilidad en Django. Si en algún momento se publica un video sobre la charla, me gustaría hacer algunos comentarios.

Al final del día me fui a tomar unas cervezas con los pibes de Cycle (hace mil que no los veía), y a la nochecita pintó un paintball por Belgrano.

Pintura y metal! (?)

Del segundo día también destaco dos charlas:

Mi balance general sobre PyCon Argentina

A favor:

  • El lugar está muy bueno (salas bien iluminadas, limpias y con buena acústica)
  • En general, la calidad de las charlas programadas fue excelente
  • Buena onda permanente (me sentí como “en familia”)
  • El equipo organizador y los voluntarios hicieron un gran laburo
  • No se afanaron ninguna laptop :-)

En contra:

  • No me gustó casi ninguna charla relámpago del segundo día1
  • Hubiera estado bueno que haya un micrófono entre los asistentes para hacer preguntas sin tener que gritar

Un aplauso para los “pitufos” de PyCon Argentina 2009!

Ah, y el año que viene nos vamos todos a Córdoba, para la PyCon Argentina 2010!

1 – Salvo excepciones, como la de Roberto Alsina o la de Felipe Lerena.