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-
https://www.crummy.com/software/BeautifulSoup/
https://es.slideshare.net/