Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

miércoles, 1 de abril de 2015

Extra: Desarrollo Online de un marcador de records para un juego (IV): En el cliente: Python

Desarrollo Online de un marcador de records para un juego (IV): En el cliente: Python


Desarrollo Online de un marcador de records para un juego (IV): En el cliente: Python 




Bien, una vez desarrollado el programa que estará en el servidor, hoy vamos a desarrollar el programa cliente. Este realmente estará incorporado como librería/módulo al juego.

¿con que lenguaje lo podemos hacer?
Con cualquiera que tenga la posibilidad de cargar páginas web y parsearla (ver nota 1), parsear es  obtener la información que nos interese. Lo voy a hacer con dos lenguajes: Python y Gambas3

En este artículo desarrollaré la forma de hacerlo con Python.

Datos del entorno de programación:
¿que versión de python he usado? 
Python2
¿que módulos/librerias necesitamos tener instalado? 
Tenemos que tener instalados los paquetes python-request y python-urllib3
Yo las he instalado usando el comando pip
$sudo apt-get install python-pip
$sudo pip install requests
(o  sudo pip install --upgrade requests, para actualizar la libreria)


El código que he realizado, lo he  programado y probado en la distribución gnu/linu  Linux Mint 17,  pero si tenéis los módulos instalado, lo podéis usar en cualquier sistema operativo, ya que Python es multiplataforma.

El código fuente lo podemos dividir varias zonas:
1) Importar los módulos necesarios
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #!/usr/bin/env python
  2. #hay que instalar el paquete.. python-request y python-urllib3
  3. import requests
  4. from lxml import html
  5. from io import BytesIO
  6. import sys



Nota: Si no tenemos instalados los módulos necesarios, saldrá este error cuando se intente ejecutar el programa:
import requests #hay que instalar el paquete.. python-request y python-urllib3
ImportError: No module named requests


2) Creamos una clase y el método leermarcador
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. class marcador():
  2.         ''' clase para leer lista de records en la web'''
  3.     defleermarcador(self,url='http://www.marcadorjsbsan.hostinazo.com/marcador.php', jugador='',pais='',marcador=''):
  4.         ''' url, jugador, pais y puntuacion'''


3) Cargar el contenido de la página web en una lista:
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. session = requests.Session()
  2.         Jugador = jugador
  3.         Pais = pais
  4.         Marcador = marcador
  5.         if url== '':
  6.             url = 'http://www.marcadorjsbsan.hostinazo.com/marcador.php'
  7.         if jugador == '' and pais == '' and marcador == '':
  8.             #consulta de solo el marcador
  9.             source_code = session.get(url)
  10.         else:
  11.             rutadatos = url + "?jugador=" + Jugador + "&pais=" + Pais+"&marcador=" + str(Marcador)
  12.             source_code = session.get(rutadatos)
  13.        
  14.         content = html.parse(BytesIO(source_code.content))
  15.         line = content.xpath("//text()")


Como veis uso la dirección http://www.marcadorjsbsan.hostinazo.com/marcador.php con la cual consigo los datos del marcador, si hay datos de los parametros usa la forma de pasar estos datos en la url: (http://www.marcadorjsbsan.hostinazo.com/marcador.php?jugador=DATOJUGADOR&pais=DATOPAIS&marcador=DATOPUNTUACION ) ,
lo que hacemos en enviar el nombre del jugador (DATOJUGADOR) , pais (DATOPAIS), y la puntuacion (DATOPUNTUACION).
Esta información la puedo poner usando  variables, para introducir los datos que el programa necesite.

La información que se devuelve (line) es una lista, con todo el contenido de la pagina webparseada.

4) Vamos a "limpiar" la lista de line
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. for l in line:
  2.         for l in line:
  3.                 if l == '\n':
  4.                         line.remove('\n')
  5.                
  6.         for l in line:
  7.                 if l == '\n':
  8.                         line.remove('\n')
  9.  
  10.         for l in line:
  11.                 if l == '\n\t\t':
  12.                         line.remove('\n\t\t')
  13.  
  14.         for l in line:
  15.                 if l == '\n\t':
  16.                         line.remove('\n\t')


Limpiamos de los caracteres como los tabuladores y retornos de carro

5) Borrado de elementos extraídos no necesarios.
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. try:
  2.     line.remove('Connected successfully')
  3.     print("La conexión se realizo correctamente, borro este texto de la lista line")
  4.        
  5. except ValueError:
  6.     print("No se habia conectado...., paro el programa")
  7.     sys.exit(0)
Si vemos la lista de elementos que se extrae de la página web, veremos (si se ha conectado correctamente) que el primer elemento es este: 'Connected successfully'
Este valor nos indica que la conexión se ha realizado correctamente y que podemos seguir leyendo los datos. En caso de que de error al borrarlo, querá decir que no se conecto. Para capturar este error, , usamos excepcciones (try.... excep..), y si ocurre paramos el programa.



6) Lectura de los datos, creando estructura de datos.

Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #creando estructura de datos
  2. for i in range(0,len(line),4):
  3.     jugador=line[i+1]
  4.     pais=line[i+2]
  5.     marcador=line[i+3]
  6.     dato.append(jugador + '|'+ pais + '|'+marcador)
  7.     print(line[i],line[i+1],line[i+2],line[i+3])

7) Muestra da datos.

Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. print("Datos en una lista...")
  2. for i in dato:
  3.     print(i)

En cada elemento de la lista "dato" se va almacenando el nombre del jugador, pais, y su puntuacion

Podemos hacer un pequeño código como ejemplo de uso:
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #!/usr/bin/env python
  2.  
  3. #Programa Principal#
  4. from leerweb import *
  5. #creo objeto#
  6. = marcador()
  7. #muestro en la consola el marcador actual
  8. c.leermarcador()
  9. #paso datos y muestro en la consola el marcador actual
  10. = c.leermarcador('', 'pepe', 'cub',8)
  11.  
  12. print("Datos en una lista Devuelta...")
  13. for i in d:
  14.     print(i)
En este codigo primero creamos un objeto marcador, luego llamamos al método leermarcador(), sin parametros para que nos muestre por consola el marcador Luego le pasamos los datos "pepe", pais "cub" y puntuacion "8", y los devuelve la variable "d" con los datos del marcador, que los escribirmos de nuevo en la consola.

Para ejecutarlo:
 $ python2 usandoleerweb.py
(tiene que estar en la misma carpeta el archivo leerweb.py)

Descarga de los archivos:

Salida por consola despues de ejecutar "usandoleerweb.py"
(Los resultados varian segun los datos almacenados en el servidor)



 Nota:
1) En linux tenemos la posibilidad de usar comandos del bash (por ejemplo, el wget), para descargarnos la pagina web, pasarlo a un archivo .html, y ya con el programa analizarlo. He preferido hacerlo con las herramientas o librerias propias que tenga el lenguaje de programación (Python y/o Gambas3)

Enlaces donde he encontrado la información:
http://python.majibu.org/preguntas/2699/extraccion-de-texto-plano-de-una-web-con-python-como

No hay comentarios:

Publicar un comentario

A falta de donativos... un poco de publicidad