Páginas

jueves, 15 de junio de 2017

webscraping ¿Como extraer datos de páginas web con Python? Ejemplo con página de apuestas



webscraping 

 ¿Como extraer datos de páginas web con Python?





En python tenemos varias librerías que nos facilitan la extracción de datos de páginas web. En el ejemplo que sigue voy a usar las siguientes:

  • requests (que es la que se encarga de leer la página web) 
  • beatifulsoup4 ( https://www.crummy.com/software/BeautifulSoup/ ) que es la que tiene las herramientas para extraer la información.


Para instalarlas, usa los siguientes comandos.


$ pip install beautifulsoup4
$ pip install requests

Ejemplo:
Trataremos de extraer los datos de la página web www.maratonbet.es de un partido "en vivo", que nos muestre datos del tipo: tiempo, resultado, y las cuotas de los mercados más importante (resultados). En programa necesita que se le pase en la linea de comando un parámetro con la url de la pagina web a analizar.

En el siguiente enlace podéis descargar el código del programa: alojado en google drive


Análisis del código:

1) Importando librerias
from bs4 import BeautifulSoup
import requests
import sys
Importamos las librerías que vamos a usar en la aplicación. La librería "sys" es necesaria para leer los argumentos de la linea de comandos.
2) Análisis de argumentos

if len(sys.argv)>=2:

  Hacemos una comprobación sobre el numero de argumentos. Si hay 2 o más seguimos ejecutando el programa, sino escribiremos en la consola que faltan argumentos:
else:
print "Falta argumento: url de la página mbet a analizar";

3) Cuerpo principal del programa:
3.1) Leer la url del argumento de la linea de comando y cargar página web:
URL=sys.argv[1]

req = requests.get(URL)

3.2) Una vez cargada empezamos con crear un objeto BeautifulSoup con el texto extraido:

html = BeautifulSoup(req.text, "html.parser")


3.3) Extraigo el resultado y el tiempo del encuentro.

resultadoytiempo=html.find('td',{'class':'event-description'})

Nota: Anteriormente he analizado la página web de los encuentros en directo de mbet, y he visto como esta formado la página web, etiquetas tipo table, td, div, class, que usa página web para mostrar la información.
Imprimo el resultado y tiempo:

print " %s " %resultadoytiempo.getText()


3.4) Proceso entradas de resultados:
Las etiquetas "div" que usan la case "nowrap simple-price", contienen datos del mercado y cuota a la que estan referidas. Con la siguiente instrucción, consigo un array con estos datos.


entradas = html.find_all('div', {'class': 'nowrap simple-price'})


Ahora con un bucle for, voy extrayendo los datos del mercado dentro de cada elemento de "entradas"

for i, entrada in enumerate(entradas):
# Con el método "getText()" no nos devuelve el HTML
equipo1 = entrada.find('span', {'class': 'left-simple'}).getText()
cuota1= entrada.find('span', {'class': 'right-simple'}).getText()

Y los imprimo en pantalla:
# Imprimo el equipo/resultado y cuota
print "%d - %s | %s " % (i + 1, equipo1, cuota1)


Pantallazo de uso y salida del script:



Vídeo de uso de la aplicación:




Saludos


Fuentes y Documentación Extra:
https://jarroba.com/scraping-python-beautifulsoup-ejemplos/
https://www.crummy.com/software/BeautifulSoup/
https://es.slideshare.net/ecrespo/webscraping