Scraping con Python, Buscar todas las href


En estos días que he estado  trabajando con Scraping de ESPN específicamente NFL, me he dado cuenta que una de las cosas que voy a hacer siempre es revisar las URLs que hay en la pagina para conectarme a otras paginas de interés, claro queda a cada diseño de aplicación cuales datos guardar y cuales no….

No quise seguir con el Scraping a el fútbol soccer ya que me di cuenta que no contaban con tantas estadísticas por jugador, y a mi lo que me interesa es esto para implementar la Sabermetria de Jugadores y cuanto ayudan al equipo esta o aquella rotación o esta o aquella batería(en Béisbol) en NFL se manejan muchas otras cosas aunque se tratan con mayor sencillez y creo que esto puede cambiar….

Como ejemplo podemos tomar la NFL, donde tenemos los partidos jugados y de aquí podemos hacer clics en el equipo y entrar a plantillas o estadísticas o a la ficha del juego, pero para poder hacer un robot que consuma todos estos datos necesitamos decirle busca las URLs y ya luego decirle cuales visitar y que datos buscar, así de sencillo es…

Vamos a tomar como ejemplo en lo que estoy trabajando Equipos de la NFL vamos a verificar cuales son todas las paginas a las que hace referencia esta pagina simplemente mirando los href que son los hipervinculos a otras paginas :D, ojo en el camino nos vamos a encontrar con partes de la paginas con sus prefijos en las mismas pero esto es otra historia….

Para buscar las URLs tenemos 2 opciones usar Expresiones Regulares y usar BeautifulSoup que es mas o menos lo mismo pero creo que la que consume menos recursos es Expresiones regulares aquí vamos a ver los 2 ejemplos, aquí el primero con Expresiones Regulares:

import urllib2, re

    
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="(http://.*?)"', html)
for enlace in enlaces:
    print enlace

la salida de este programa es la siguiente:

http://espndeportes.espn.com/futbol-americano/nfl/equipos
http://www.espn.com.mx/futbol-americano/nfl/equipos
http://www.espn.com.co/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.cl/futbol-americano/nfl/equipos
http://www.espn.com.ar/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://buscar.espn.go.com/s/opensearch_es
http://a.espncdn.com/combiner/c?v=201105061640&css=global_reset.r1.css,base.r236.css,modules.r453.css,global_header.r41.css,modules/global_nav.r47.css,mem2010/mem.r5.css,mem2010/mem_espn360.r2.css,warvertical12e.css,universal_overlay/universal_overlay.css,universal_overlay/media_overlay.css,universal_overlay/video_overlay.css,universal_overlay/photo_overlay.css,universal_overlay/dyk_overlay.css,modules_deportes.201004281136.css,/espn/espn/styles/frontpage_scoreboard_10,base.deportes.r21.css,soccer.base.r31.css
http://a.espncdn.com/combiner/c?css=sprites/teamlogos.r15.css
http://a.espncdn.com/prod/styles/modules/master_tables_09.r3.css
http://a.espncdn.com/players/web-player-bundle/latest/espn-web-player-bundle.css
http://a.espncdn.com/legacy/transitionalHeader/1.0.10/css/transitional-header.css
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/mia/miami-dolphins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ne/new-england-patriots
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyj/new-york-jets
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ari/arizona-cardinals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/la/los-angeles-rams
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sf/san-francisco-49ers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sea/seattle-seahawks
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/den/denver-broncos
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/kc/kansas-city-chiefs
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/oak/oakland-raiders
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sd/san-diego-chargers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/chi/chicago-bears
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/det/detroit-lions
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/gb/green-bay-packers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/min/minnesota-vikings
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/bal/baltimore-ravens
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cin/cincinnati-bengals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cle/cleveland-browns
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/pit/pittsburgh-steelers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/atl/atlanta-falcons
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/car/carolina-panthers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/no/new-orleans-saints
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/tb/tampa-bay-buccaneers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/hou/houston-texans
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ind/indianapolis-colts
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/jax/jacksonville-jaguars
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ten/tennessee-titans
http://www.espnrun.com/
http://espnplay.com
http://www.espn.com.ve
http://guia.espn.com/
http://www.espn.com.ve/videohub/video/indexDeportes
http://www.espn.com.ve/futbol-americano/nfl/estadisticas
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/jugadores
Home
http://preferences.truste.com/2.0/?type=espn&affiliateId=148 http://www.espn.com/espn/news/story?page=patents http://www.espn.bumeran.com.ar http://www.joinourteam.espn.com/joinourteam/
Spanish – Latin American / Español – Latinoamérica – Disney Terms of Use
Spanish

Ahora si solo queremos los equipos deberíamos hacer algo como esto:

import urllib2, re

    
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="(http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre.*?)"', html)
for enlace in enlaces:
    print enlace

Y la salida seria algo como lo siguiente:


http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/mia/miami-dolphins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ne/new-england-patriots
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyj/new-york-jets
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ari/arizona-cardinals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/la/los-angeles-rams
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sf/san-francisco-49ers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sea/seattle-seahawks
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/den/denver-broncos
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/kc/kansas-city-chiefs
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/oak/oakland-raiders
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sd/san-diego-chargers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/chi/chicago-bears
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/det/detroit-lions
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/gb/green-bay-packers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/min/minnesota-vikings
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/bal/baltimore-ravens
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cin/cincinnati-bengals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cle/cleveland-browns
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/pit/pittsburgh-steelers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/atl/atlanta-falcons
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/car/carolina-panthers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/no/new-orleans-saints
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/tb/tampa-bay-buccaneers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/hou/houston-texans
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ind/indianapolis-colts
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/jax/jacksonville-jaguars
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ten/tennessee-titans

Ahora si queremos sacar el short-name de cada equipo  seria algo como lo siguiente:

import urllib2,re
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/([a-z]+?)/', html)

nombres_short = []
for enlace in enlaces:
    nombres_short.append(enlace)    

print nombres_short

y la salida algo como esto:

['dal', 'nyg', 'phi', 'wsh', 'buf', 'mia', 'ne', 'nyj', 'ari', 'la', 'sf', 'sea', 'den', 'kc', 'oak', 'sd', 'chi', 'det', 'gb', 'min', 'bal', 'cin', 'cle', 'pit', 'atl', 'car', 'no', 'tb', 'hou', 'ind', 'jax', 'ten']

La verdad no esta mal hacerlo con Expresiones regulares si buscamos cosas muy especificas en el HTML digo, por que casi siempre vamos a tener que hacer uso de ellas, muchos piensan que por que usan librerías externas no están usando RE y les cuento que muchas librerías de búsqueda están programadas en RE básicamente, Para hacer búsquedas a fondo necesitamos librerías especiales para HTML y para esto usaremos BeautifulSoup nada mas miremos como queda nuestro código que busca URLs con esta librería:

from BeautifulSoup import BeautifulSoup
import urllib2
import re

html_page = urllib2.urlopen("http://www.espn.com.ve/futbol-americano/nfl/equipos")
soup = BeautifulSoup(html_page)
for link in soup.findAll('a'):
    print link.get('href')
    
    
print 


La salida contiene en parte esto(no la voy a colocar completa):


http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/estadisticas/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/calendario/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/plantel/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/profundidad/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/estadisticas/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/calendario/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/plantel/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/profundidad/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/estadisticas/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/calendario/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/plantel/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/profundidad/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/estadisticas/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/calendario/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/plantel/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/profundidad/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/estadisticas/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/calendario/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/plantel/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/profundidad/_/nombre/buf/buffalo-bills

Podemos visualizar URLs que antes no veíamos, y ahora si podemos usar nuestras RE para buscar cosas especificas :D, hasta aquí lo vamos a dejar no quiero ser repetitivo, Dios les Bendiga… Hasta la próxima

 

 

Anuncios

Un pensamiento en “Scraping con Python, Buscar todas las href

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s