lunes, 25 de abril de 2011

Obteniendo perfiles de google dado una palabra clave

Quisiera compartir con ustedes la forma que encontré para obtener los perfiles de google, dado una palabra clave, usando web scrapping, ya que luego de una lectura minuciosa, no encuentro una dichosa API de google, que me facilite la vida… agradecería recomendaciones:

La intencion de la siguiente funcion es simular lo que hacemos en http://www.google.com/profiles?q=Reiner. Disculpen por haberla escrito en python ;-)

def search_profiles(keyword):

        """
Devuelve una lista de los perfiles encontrados, a partir de una keyword suministrada

"""
#using first name got better results
start_index = -10
scrapper = Scrapper() #[1]

list_result = []
list_uids = []
stop_loop = False
while not stop_loop:
start_index += 10
step1 = {'http://www.google.com/profiles?q=%s&start=%d' % (keyword, start_index) : None}
scrapper.go(step1)
soup = scrapper.getSoup()
elements_profiles = soup.findAll('div', {'class':'profile-result'})
if not elements_profiles:
break
for element in elements_profiles:
anchor_element = element.find('a')

url_profile = anchor_element['href']
uid = url_profile.split('/')[-1]
#mechanism to determine when stop the search[2]
if uid in list_uids:
stop_loop = True
break
else:
list_uids.append(uid)

url_profile = "http://www.google.com%s" % url_profile

src_picture = anchor_element.find('img')['src']
src_picture = "http://www.google.com%s" % src_picture

text_element = element.find('div', {'class':'profile-result-text-block'})
full_name = text_element.find('h1').text

list_result.append({
'uid' : uid,
'full_name' : full_name,
'url_public_profile' : url_profile,
'photo' : src_picture,
})

return list_result

[1]La clase Scrapper, pues contiene una implementación sencilla de un scrapper en python, que manipula el html usando la librería BeautifulSoup,

[2]Los cantidad de resultados encontrados, es un valor mal aproximado, por lo que no me sirve para saber cuándo detener la iteración y si el parámetro start es mucho mayor que los resultados reales encontrados, siempre se muestra la última pagina de resultados.

A partir del análisis anterior, tuve que emplear una lista temporal que va almacenando los id de los perfiles (únicos) para saber cuando estoy en una página que ya fue mostrada anteriormente, y así saber cuándo dejar de buscar.


Agradezco cualquier sugerencia..... animo!!!

jueves, 21 de abril de 2011

como ordenar columnas de tipo date y datetime usando jquery.DataTables

Este articulo va dedicado a todos aquellos que usan DataTables, para mostrar sus datos, y desean poder ordenar por columnas que contengan como tipo de dato fecha en cualquier formato....

segun la documentacion, en la inicializacion del datatable, el reconoce por defecto el tipo de dato de cada columna (string, date, numeric, por defecto), y basado en el, escoge la funcion a usar para ordenar esta columna.

cuando la fecha a mostrar en la tabla, tiene formatos no compatibles con javascript, es decir
Date.parse("Jan. 1, 2011, 3 a.m.") == NaN

pues empiezan los problemas, y no se consigue ordenar la columna tan facilmente, ya que tenemos que implementar funciones que parseen el valor mostrado para luego poder compararlos, como ejemplo cito el pluging de
sedovsek (https://github.com/sedovsek/DataTables-EU-date-Plug-In), cuyo objetivo es poder parsear, comparar y por tanto ordenar columnas que tengan como tipo de dato fecha en formato europeo.

Pero que si mi columna no tiene ese formato, tendria que tener un plugign por cada formato en que vaya a mostrar la fecha.

Mi solución fue buscar un mecanismo independiente del formato en que se muestre la fecha,

para cada columna que muestra valores de tipo fecha, agregamos otra columna (invisible) en el DOM, que contenga los valores en timestamp, y diciendole a Datable, que cuando vaya a ordenar la columna de la fecha, se guia por la columna que tiene el timestamp..

Aqui va:

<script>
$(document).ready(function() {
$('table#timeline').dataTables({
"aoColumnDefs": [
{ "bVisible": false, "aTargets": [ 1 ] }
],
"aoColumns": [
{ "iDataSort": 1 },
null,
null,
]
});


});
</script>


<table id="timeline">
<thead>
<th>Date created<th>
<th>timestamp Date created</th>
<th>Text</th>
</thead>
<tbody>
{% for status in statuses %}
<tr>
<td>{{ status.date_created }}</td>
<td>{{ status.date_created|date:"U" }}</td>
<td>{{ status.text }}</td>
</tr>
{% endfor %}

</tbody>
</table>


espero les sea util, y que vengan los comentarios!!!