Pyquery web scrapping al estilo jquery

imagen / Anita Ritenour - flickr
  
8 de Agosto de 2015   5  

Antes que nada recordemos que es web scraping.

Web Scraping es una técnica utilizada mediante un software para extraer información de un sitio web de internet, por ejemplo es muy comun que los programadores hagan algún script que vaya consultando información de un sitio web como por ejemplo la bolsa de valores, tipo de cambio de monedas, el clima, etc. 

Sabemos que existen muchas librerás con este objetivo, el día de hoy hablaremos de PYQUERY que es una librería de python que te permite utilizar funciones que emulan las de jquery como por ejemplo el famoso $(selector) es posible en pyquery. He probado la librería y me ha dado una muy buena impresión ya que estoy muy familiarizado con jquery y el uso de pyquery en especial me ha gustado bastante.

Instalación

La instalación es muy sencilla gracias a pip

pip install pyquery

Ejemplos

He realizado 3 ejemplos muy simples pero que muestran el potencial de esta librería.

Ejemplo 1: consulta de moneda MX

Este ejemplo toma valores de elementos html del sitio  www.cambiodolar.mx para consultar el valor del dolar con respecto al peso mexicano, este ejemplo solamente usa 4 lineas de código!! y con esto pyquery nos muestra su gran potencial.

 

# coding=utf-8
__author__ = 'gaspar'

from pyquery import PyQuery as pq

# ejemplo consulta valor del peso mexicano
print("---- ejemplo de consulta de divisa ----")
jquery = pq(url="http://www.cambiodolar.mx/") #obtenemos todo el html y lo asignamos a la variable jquery
print(jquery('div.valor').text()) #imprime el texto del div que tiene la clase "valor" 
print (jquery('p.day').text()) # imprime el texto de la etiqueta p que tiene la clase "day"

El resultado de este ejemplo es lo siguiente:

---- ejemplo de consulta de divisa ----
1 Dolar = $ 16,16 Pesos Mexicanos
Valor día Sábado, 8 de Agosto de 2015

 

Ejemplo 2: consulta de las imagenes de un sitio web.

En este ejemplo utilizamos como prueba la página de pythoniza.me y el objetivo es extraer las url de las imagenes que utiliza este gran blog! :P

#consulta de imagenes de un sitio en internet
print("---- ejemplo de consulta de imagenes de pythonizame ----")
print("consultando imagenes de pythonizame") 
jquery = pq(url="https://instagram.com/pythonizame") # obtenemos el html del sitio pythoniza.me
# obtenemos una colección de todos los atributos src de los elementos img 
elementos = [elemento.attr('src') for elemento in jquery.items('img')]  
# con .items(selector) obtenemos todos los elementos que contienen el selector deseado
for img in elementos: #recorremos la colección obtenida
        print(img)

El resultado de este script es: 

---- ejemplo de consulta de imagenes de pythonizame ----
consultando imagenes de pythonizame
/static/app/img/logo.png
/static/app/img/default.gif
https://pythonizame.s3.amazonaws.com/media/cache/74/ff/74ff90542d7f2af295cdb0d3b1308716.jpg
https://pythonizame.s3.amazonaws.com/media/cache/9d/7a/9d7aae6c33933ec2886738fd3ffc505b.jpg
https://pythonizame.s3.amazonaws.com/media/cache/39/9c/399c905df0b4ce194795907d70f00937.jpg
https://pythonizame.s3.amazonaws.com/media/cache/c6/4c/c64c140ab2b7226c0cf40ca781904cf5.jpg
https://pythonizame.s3.amazonaws.com/media/cache/e0/bc/e0bcc7ad89fa412f840b8b0d76eed9ca.jpg
https://pythonizame.s3.amazonaws.com/media/cache/4f/d1/4fd187bdb008d436d966166094de3831.jpg
https://pythonizame.s3.amazonaws.com/media/cache/c0/bc/c0bc5d873ec227969829e936e02658a0.jpg
https://pythonizame.s3.amazonaws.com/media/cache/0b/d1/0bd16d0a91d7d395471ef2e0f7fe4359.jpg
https://pythonizame.s3.amazonaws.com/media/cache/d6/e1/d6e16462c468ded0454cc66ee34def74.jpg
https://pythonizame.s3.amazonaws.com/media/cache/ba/d1/bad1697664cd960ff70c37c308574d21.jpg
https://pythonizame.s3.amazonaws.com/media/cache/8e/ce/8ecea6913c1f02b6b665c7a648955fa0.jpg
https://pythonizame.s3.amazonaws.com/media/cache/6c/60/6c60ee3588d2885ba4506358728f23cd.jpg
https://pythonizame.s3.amazonaws.com/media/cache/9f/87/9f87818919bb358bdaed0cff3a02e8a9.jpg
https://pythonizame.s3.amazonaws.com/media/cache/dc/fa/dcfaef2c4b3af67fd7ac9ea7bf85b624.jpg
https://pythonizame.s3.amazonaws.com/media/cache/fb/04/fb04ee911b2d24ca9ae788e7b70edf35.jpg
https://pythonizame.s3.amazonaws.com/media/cache/f2/94/f2947e3ef8695ca45f978655c831723e.jpg
https://pythonizame.s3.amazonaws.com/media/cache/a0/bc/a0bce39727c2b08414ca671e66027265.jpg
https://pythonizame.s3.amazonaws.com/media/cache/7f/e7/7fe70ee837581decb7c4c1029a893b32.jpg
https://pythonizame.s3.amazonaws.com/media/cache/dc/38/dc38f4d2093a1439e771c6dd70f064bd.jpg
https://pythonizame.s3.amazonaws.com/media/cache/02/13/02139b2e809439b1b6ae53d5e1aaffed.jpg
https://pythonizame.s3.amazonaws.com/media/cache/de/cc/deccf9ad675266e7f7564bed3034372b.jpg
https://pythonizame.s3.amazonaws.com/media/cache/f4/82/f482c234cbf901fb5702113e72ff6bc1.jpg
https://pythonizame.s3.amazonaws.com/media/cache/f0/95/f095fa0a8985386746117e611ebb94f1.jpg
https://pythonizame.s3.amazonaws.com/media/cache/67/9a/679a419a7ce15306c60bdb9fadb54bf2.jpg
https://pythonizame.s3.amazonaws.com/media/cache/1d/5c/1d5c6b484a97fda0b5b9f90f8cb141f2.jpg
https://pythonizame.s3.amazonaws.com/media/cache/35/a1/35a1274647d279ac02aa9014a6ed24df.jpg
https://pythonizame.s3.amazonaws.com/media/cache/da/3d/da3df7bf3e8600d26e21ac35bd380c5e.jpg
https://pythonizame.s3.amazonaws.com/media/cache/c9/1c/c91c3739fca25bd896e345d052b73014.jpg
https://pythonizame.s3.amazonaws.com/media/cache/a2/bb/a2bba8017aeeb622a3d90a8678c3acc8.jpg

Como vemos en pocas lineas de código podemos hacer mucho, jeje , con este ejemplo se me ocurre utilizar PIL para descargar las imagenes en mi equipo.

 

Ejemplo 3: Modificando html:

En este ejemplo vamos a ver como manipular elementos html tal y como lo haría jquery, eliminar atributos, agregar clases, etc. Con pyquery esto es muy muy sencillo, veamos.

#removiendo y agregando clases a elementos html
print("---- removiendo y agregando clases a elementos html----")
jquery = pq("<div id='mi_div' class='myclass'>mi elemento</div>")
id_elemento = jquery.attr('id')
jquery.remove_attr('id') 
print("Removiendo el atributo id de %s" % id_elemento)
print ("resultado: %s" % jquery)

print("Removiendo el atributo class de %s" % id_elemento)
jquery.remove_attr('class')
print ("resultado sin id ni class: %s" % jquery)

print("--agregando nuevos valores---")
jquery.add_class('mynuevaclase')
jquery.attr('id','mnuevoid')
print ("elementos con nuevos valores:%s " % jquery)

Esto nos da el siguiente resultado utilizando el html:

<div id='mi_div' class='myclass'>mi elemento</div>

 ---- removiendo y agregando clases a elementos html----
Removiendo el atributo id de mi_div
resultado: <div class="myclass">mi elemento</div>
Removiendo el atributo class de mi_div
resultado sin id ni class: <div>mi elemento</div>
--agregando nuevos valores---
elementos con nuevos valores:<div class="mynuevaclase" id="mnuevoid">mi elemento</div> 

Como ven manipular el DOM de html es tan facil como lo haría Jquery, este ultimo ejemplo tiene varios usos , por ejemplo imagina que tienes un blog y que cada entrada es un html generado por un wysiwyg y almacenado en la BD, ¿que pasaría si un día decides que todas las etiquetas h2 deben de estar en color naranja? esta herramienta podría recorrer todas las publicaciones del blog y cambiar de manera automática todos los colores de los elementos deseados. Puedes descargar este ejemplo en mi Github 

O.o muy util verdad? jeje bueno pues si quieres obtener mas información revisa la documentación oficial de PYQUERY.

http://pythonhosted.org/pyquery/

 



Gaspar Dzul

Desarrollador Front End y Móvil.

Temas relacionados