Scraping Python, ESPN Liga BBVA y OTRAS [Parte 2]steemCreated with Sketch.

in #spanish8 years ago

Hoy vamos a tener 1 solo código para las 4 ligas principales del mundo como lo son: Liga BBVA, La Bundesliga, La Premier y La serie A... mi meta es crear una Base de Datos interesante con lo mejor de estas 4 ligas, y el código de hoy nos acerca mas a nuestra meta.

Con el siguiente código vamos a ir dando forma a los campos que vamos a utilizar en una de las tablas de nuestra interesante Base de Datos:

import urllib2, re
from bs4 import BeautifulSoup
import re
from prettytable import PrettyTable

# url that we are scraping
urls = ["http://www.espnfc.us/english-premier-league/23/table" , "http://www.espnfc.us/spanish-primera-division/15/table" , "http://www.espnfc.us/german-bundesliga/10/table" , "http://www.espnfc.us/italian-serie-a/12/table"]
hh = 0
for url in urls:
 page = urllib2.urlopen(url)

 soup = BeautifulSoup(page, "lxml")


 table = soup.find('table')

 rows = table.find_all('tr')

 results = []

 for row in rows:
       table_headers = row.find_all('th')
       if table_headers:
           results.append([headers.get_text() for headers in table_headers])

       table_data = row.find_all('td')
       if table_data:
   results.append([data.get_text() for data in table_data])


 tabla_formateada = []

 nueva_form = []
 
 equipo_nombre = []
 posicion_eq = []
 #Listas para totales
 PJ_totales = []
 PG_totales = []
 PE_totales = []
 PP_totales = []
 Goles_Favor_totales = []
 Goles_contra_totales = []
 Goles_Diferencia = []
 Puntos_tot = []
#Listas para casa
 PJ_totales = []
 PG_totales = []
 PE_totales = []
 PP_totales = []
 Goles_Favor_totales = []
 Goles_contra_totales = []
#Listas para visita
 PJ_totales = []
 PG_totales = []
 PE_totales = []
 PP_totales = []
 Goles_Favor_totales = []
 Goles_contra_totales = []

 i = 0
 for datos  in results:
 
   if i >= 2:
       while ( u'\xa0'  or u'\n' or u'' )  in datos:
           if (u'')  in datos :
               datos.remove(u'')
           elif  u'\n'  in datos:
      datos.remove(u'\n')
   elif  u'\xa0'  in datos:
      datos.remove(u'\xa0')
      
       
       
       
       tabla_formateada.append(datos)

   i += 1        


 
 for h in tabla_formateada:
  
     posicion = h[0]
     posicion_eq.append(posicion)
       
   
     equipo_nom = h[1]
     equipo_nom = equipo_nom.strip()
     equipo_nombre.append(equipo_nom)
       
     #Listas para totales
     PJ_totales = []
     PG_totales = []
     PE_totales = []
     PP_totales = []
     Goles_Favor_totales = []
     Goles_contra_totales = []
       
     Goles_Dif = h[-2]
     Goles_Diferencia.append(Goles_Dif)
       
     Puntos = h[-1]
     Puntos_tot.append(Puntos)

       
     #Listas para casa
     PJ_totales = []
     PG_totales = []
     PE_totales = []
     PP_totales = []
     Goles_Favor_totales = []
     Goles_contra_totales = []
     #Listas para visita
     PJ_totales = []
     PG_totales = []
     PE_totales = []
     PP_totales = []
     Goles_Favor_totales = []
     Goles_contra_totales = []
     
 numero_items = len(posicion_eq)
  


 table = PrettyTable(["Posicion", "Equipo", "Puntos", "Dif_Gol"])
 i = 0
 
 for i in range(0,numero_items):
   
   table.add_row([posicion_eq[i], equipo_nombre[i], Goles_Diferencia[i] , Puntos_tot[i]])
   
   i += 1
 if hh == 0:
   print " "
   print " "

   print "                     Liga Premier"
 elif hh == 1:
   print "                     Liga BBVA"

 elif hh == 2:
   print "                     Bundesliga"

   
 elif hh == 3:
   print "                     Seie A"
   
 print table
 hh += 1
 print " "
 print " "


Hay listas que se pueden llenar pero no las he llenado por que lo pienso hacer cuando comencemos con nuestra Base de Datos, la salida del programa es la siguiente:


Liga Premier
+----------+----------------------+--------+---------+
| Posicion |        Equipo        | Puntos | Dif_Gol |
+----------+----------------------+--------+---------+
|    1     |   Manchester City    |   6    |    9    |
|    2     |       Chelsea        |   5    |    9    |
|    3     |  Manchester United   |   5    |    9    |
|    4     |       Everton        |   2    |    7    |
|    5     |      Hull City       |   2    |    6    |
|    6     |    Middlesbrough     |   1    |    5    |
|    7     |  Tottenham Hotspur   |   1    |    5    |
|    8     |       Arsenal        |   1    |    4    |
|    9     |    Leicester City    |   0    |    4    |
|    10    | West Bromwich Albion |   0    |    4    |
|    11    |      Liverpool       |   -1   |    4    |
|    12    |   West Ham United    |   -2   |    3    |
|    13    |       Burnley        |   -2   |    3    |
|    14    |     Swansea City     |   -2   |    3    |
|    15    |     Southampton      |   -2   |    2    |
|    16    |      Sunderland      |   -2   |    1    |
|    17    |    Crystal Palace    |   -2   |    1    |
|    18    |       Watford        |   -3   |    1    |
|    19    |   AFC Bournemouth    |   -3   |    1    |
|    20    |      Stoke City      |   -4   |    1    |
+----------+----------------------+--------+---------+


                    Liga BBVA
+----------+---------------------+--------+---------+
| Posicion |        Equipo       | Puntos | Dif_Gol |
+----------+---------------------+--------+---------+
|    1     |      Las Palmas     |   6    |    6    |
|    2     |      Barcelona      |   5    |    6    |
|    3     |     Real Madrid     |   4    |    6    |
|    4     |      Sevilla FC     |   2    |    4    |
|    5     |    Sporting Gijón   |   1    |    4    |
|    6     | Deportivo La Coruña |   1    |    4    |
|    7     |       Leganes       |   1    |    4    |
|    8     |        Eibar        |   0    |    3    |
|    9     |    Real Sociedad    |   -1   |    3    |
|    10    |        Málaga       |   0    |    2    |
|    11    |   Atletico Madrid   |   0    |    2    |
|    12    |      Villarreal     |   0    |    2    |
|    13    |        Alavés       |   0    |    2    |
|    14    |       Espanyol      |   -2   |    1    |
|    15    |       Osasuna       |   -2   |    1    |
|    16    |       Granada       |   -4   |    1    |
|    17    |      Real Betis     |   -4   |    1    |
|    18    |      Celta Vigo     |   -2   |    0    |
|    19    |   Athletic Bilbao   |   -2   |    0    |
|    20    |       Valencia      |   -3   |    0    |
+----------+---------------------+--------+---------+


                    Bundesliga
+----------+--------------------------+--------+---------+
| Posicion |          Equipo          | Puntos | Dif_Gol |
+----------+--------------------------+--------+---------+
|    1     |      Bayern Munich       |   6    |    3    |
|    2     |        FC Cologne        |   2    |    3    |
|    2     |      VfL Wolfsburg       |   2    |    3    |
|    4     |    Borussia Dortmund     |   1    |    3    |
|    4     |      Hertha Berlin       |   1    |    3    |
|    4     | Borussia Monchengladbach |   1    |    3    |
|    7     |   Eintracht Frankfurt    |   1    |    3    |
|    8     |      TSG Hoffenheim      |   0    |    1    |
|    8     |        RB Leipzig        |   0    |    1    |
|    10    |        Hamburg SV        |   0    |    1    |
|    10    |     FC Ingolstadt 04     |   0    |    1    |
|    12    |       SC Freiburg        |   -1   |    0    |
|    12    |     Bayer Leverkusen     |   -1   |    0    |
|    12    |          Mainz           |   -1   |    0    |
|    15    |        Schalke 04        |   -1   |    0    |
|    16    |     SV Darmstadt 98      |   -2   |    0    |
|    16    |       FC Augsburg        |   -2   |    0    |
|    18    |      Werder Bremen       |   -6   |    0    |
+----------+--------------------------+--------+---------+


                    Seie A
+----------+----------------+--------+---------+
| Posicion |     Equipo     | Puntos | Dif_Gol |
+----------+----------------+--------+---------+
|    1     |     Genoa      |   4    |    6    |
|    2     |    Juventus    |   2    |    6    |
|    3     |   Sampdoria    |   2    |    6    |
|    4     |    AS Roma     |   4    |    4    |
|    5     |   US Pescara   |   3    |    4    |
|    6     |     Napoli     |   2    |    4    |
|    7     |     Torino     |   3    |    3    |
|    8     | Chievo Verona  |   1    |    3    |
|    9     |     Lazio      |   0    |    3    |
|    10    |   Fiorentina   |   0    |    3    |
|    11    |    AC Milan    |   -1   |    3    |
|    12    |    Udinese     |   -2   |    3    |
|    13    |    Sassuolo    |   -2   |    3    |
|    14    |    Bologna     |   -3   |    3    |
|    15    |    Palermo     |   -1   |    1    |
|    16    |    Cagliari    |   -2   |    1    |
|    17    | Internazionale |   -2   |    1    |
|    18    |    Atalanta    |   -2   |    0    |
|    19    |    Crotone     |   -3   |    0    |
|    20    |     Empoli     |   -3   |    0    |
+----------+----------------+--------+---------+
 


Voy a hacer realmente corta estas entradas por que esoty un poco cansado creando el codigo, voy a recalcar algunas cosas del mismo:

Por ejemplo la linea urls = ["http://www.espnfc.us/english-premier-league/23/table" , "http://www.espnfc.us/spanish-primera-division/15/table" , "http://www.espnfc.us/german-bundesliga/10/table" , "http://www.espnfc.us/italian-serie-a/12/table"] que es importante si queremos agregar otras ligas, y la linea  equipo_nom = equipo_nom.strip() que es importante para formatear una cadena, Hasta aquí lo vamos a dejar por esta entrada en un rato subo  la otra...

Dios les Bendiga