---
title: Scraping en Python (BeautifulSoup), con ejemplos
url: https://jarroba.com/scraping-python-beautifulsoup-ejemplos/
author: Richard [Admin Jarroba]
date: 2015-05-27
modified: 2026-10-21
language: es
license: CC BY-NC-SA 3.0 (https://creativecommons.org/licenses/by-nc-sa/3.0/) — attribution: "Scraping en Python (BeautifulSoup), con ejemplos", Richard [Admin Jarroba], jarroba.com
categories: Inteligencia Artificial, Lenguajes de Programación
tags: BeautifulSoup, python, scraping
repository: https://github.com/jarroba/Scraping_Python_jarroba
---

# Scraping en Python (BeautifulSoup), con ejemplos

> El Web Scraping son un conjunto de técnicas que se utilizan para obtener de forma automática el contenido que hay en páginas web a través de su código HTML.

El proyecto de este post los puedes descargar pulsando [AQUI](https://github.com/jarroba/Scraping_Python_jarroba).

 

El ***Web Scraping (o Scraping)*** son un conjunto de técnicas que se utilizan para obtener de forma automática el contenido que hay en páginas web a través de su código HTML. El uso de estas técnicas tienen como finalidad recopilar grandes cantidades de datos de diferentes páginas web cuyo uso posterior puede ser muy variado: homogenización de datos, tratamiento de contenido para la extracción de conocimiento, complementar datos en una web, etc. Decir por último en esta introducción que las técnicas de Scraping se pueden enmarcar dentro de los campos de la Inteligencia Artificial y del Big Data en la primera fase de recolección de datos para su posterior almacenamiento, tratamiento y visualización.

 

En este tutorial vamos a «scrapear» (o a obtener los datos) de los artículos y tutoriales de esta página web, utilizando la librería «[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/bs4/doc/)» (para Python) que es una librería que nos facilita muchísimo la labor de scrapeo. La finalidad de este tutorial no es hacer un tutorial para expertos, sino hacer una introducción de como hacer las conexiones HTTP y como tratar y extraer el contenido que nos interesa de los HTMLs que obtenemos con la libreria JSoup. Para este tutorial es necesario que se tengan conocimientos mínimos de HTML y CSS (no hace falta ser un experto) ya que a la hora de scrapear tenemos que tener conocimiento de las etiquetas de HTML como pueden ser head, body, h1, h2, …, h6, p, div, span, table, etc. y de los estilos CSS que se pueden aplicar a estas etiquetas con id y class.

 

Dadas las directrices y los conocimientos mínimos necesarios para este tutorial vamos a proceder a explicar como scrapear y obtener los datos de las entradas de jarroba.com. En primer lugar deberemos de hacer un "pip install" para descargarnos e instalar los paquetes de 'request' y 'beautifulsoup':

 

```bash

$ pip install beautifulsoup4
$ pip install requests
```

 

En segundo lugar, se ha de ***estudiar la estructura del HTML de la web*** para ver de qué forma podemos extraer su contenido. En este caso en el que queremos extraer la información de cada entrada de este web (título, autor y fecha), podemos ver como todas las entradas están entre etiquetas ‘div’ con la clase CSS ‘col-md-4 col-xs-12’; es decir (tal y como vemos en la siguiente imagen), debemos de obtener el contenido que hay entre «***<div class="col-md-4 col-xs-12">******contenido******</div>***"

 

[![scraping_jarroba_1](https://jarroba.com/wp-content/uploads/2015/04/scraping_jarroba_1.png)](https://jarroba.com/wp-content/uploads/2015/04/scraping_jarroba_1.png)

 

Como podemos ver, puede resultar relativamente sencillo crearse una expresión regular y obtener todas las apariciones que hay entre las etiquetas ‘div’ con la clase CSS mencionada anteriormente (por cierto son clases de CSS Bootstrap), pero la libreria ***BeautifulSoup ya nos aporta los métodos necesarios*** (y muy bien optimizados ya que el Patter y Matcher son procesos muy pesados y lentos) para obtener el contenido que hay entre las etiquetas HTML.

 

Dentro de esas etiquetas, tenemos que seguir extrayendo los datos del título, autor y fecha. Si vemos más en detalle su HTML, vemos lo siguiente:

 

[![scraping_html_jarroba](https://jarroba.com/wp-content/uploads/2015/04/scraping_html_jarroba.png)](https://jarroba.com/wp-content/uploads/2015/04/scraping_html_jarroba.png)

 

Por tanto con esto ya hemos hecho un estudio del HTML y ya sabemos a partir de que etiquetas tenemos que scrapear los datos, por tanto vamos a pasar ahora a explicar como hacer el scrapeo con la libreria BeautifulSoup de python, utilizando también la libreria request para hacer la petición http.

 

En primer lugar tenemos que hacer ***una petición HTTP*** a la página web para obtener su HTML. Para ello utilizaremos la libreria 'request' y utilizando el método get (pasandole como parámetro la url) nos dará entre otras cosas el HTML de la web y su "Status Code". Esto lo hacemos de la siguiente forma:

 

```py

url = "https://jarroba.com/"
# Realizamos la petición a la web
req = requests.get(url)
```

 

A partir del objeto «req», que almacena muchos datos relacionados con la petición HTTP (cabeceras, cookies, etc.) obtenemos el Status Code y el HTML (como un string) de la web. Esto lo hacemos de la siguiente forma:

 

```py

statusCode = req.status_code
htmlText = req.text
```

 

Con el Status Code y con el HTML de la web, ya podemos empezar a scrapear la web. A continuación (y hecho ya el estudio del HTML de la web y como obtener el HTML y su Status Code) se muestra todo el código y posteriormente se explicará paso a paso, para que tengáis una visión más general:

 

```py

# -*- coding: utf-8 -*-
__author__ = 'RicardoMoya'

from bs4 import BeautifulSoup
import requests

URL = "http://jarroba.com/"

# Realizamos la petición a la web
req = requests.get(URL)

# Comprobamos que la petición nos devuelve un Status Code = 200
status_code = req.status_code
if status_code == 200:

    # Pasamos el contenido HTML de la web a un objeto BeautifulSoup()
    html = BeautifulSoup(req.text, "html.parser")

    # Obtenemos todos los divs donde están las entradas
    entradas = html.find_all('div', {'class': 'col-md-4 col-xs-12'})

    # Recorremos todas las entradas para extraer el título, autor y fecha
    for i, entrada in enumerate(entradas):
        # Con el método "getText()" no nos devuelve el HTML
        titulo = entrada.find('span', {'class': 'tituloPost'}).getText()
        # Sino llamamos al método "getText()" nos devuelve también el HTML
        autor = entrada.find('span', {'class': 'autor'})
        fecha = entrada.find('span', {'class': 'fecha'}).getText()

        # Imprimo el Título, Autor y Fecha de las entradas
        print "%d - %s  |  %s  |  %s" % (i + 1, titulo, autor, fecha)

else:
    print "Status Code %d" % status_code
```

 

En primer lugar ***definimos la url***para obtener el Status Code y el HTML. En segundo lugar ***comprobamos que el "status code" es igual a 200*** y si es así obtenemos en un objeto de la clase "***BeautifulSoup***", pasándole el HTML de la web. Con ese objeto, vamos a poder obtener con los métodos pertinentes los elementos de la web. En este caso vamos a obtener todas las entradas que las guardaremos en una lista que corresponda a una serie de etiquetas y estilos CSS. En este caso guardaremos todos los fragmentos HTML que correspondan a cada entrada (ver primer imagen de la entrada):

 

```py

# Pasamos el contenido HTML de la web a un objeto BeautifulSoup()
html = BeautifulSoup(req.text, "html.parser")

# Obtenemos todos los divs donde estan las entradas
entradas = html.find_all('div',{'class':'col-md-4 col-xs-12'})
```

 

En este caso utilizamos el método "***find_all()***» que lo que hace es coger todos los fragmentos del HTML que correspondan a una etiqueta div, seguido de las clases ‘col-md-4’ y ‘col-xs-12’. Ahora ya tenemos en una lista (entradas), todas las entradas en HTML. Ahora debemos de recorrer esa lista y obtener de esos fragmentos de código los datos del título, autor y fecha. De la misma forma esa información está dentro de etiquetas HTML y clases CSS que debemos de tratar (como se muestra en la segunda imagen de la entrada). BeautifulSoup nos da los métodos para obtener el contenido pasandole el nombre de la clase CSS. Esto se hace de la siguiente forma:

 

```py

# Recorremos todas las entradas para extraer el título, autor y fecha
for i,entrada in enumerate(entradas):
    # Con el método "getText()" no nos devuelve el HTML
    titulo = entrada.find('span', {'class' : 'tituloPost'}).getText()
    # Sino llamamos al método "getText()" nos devuelve también el HTML
    autor = entrada.find('span', {'class' : 'autor'})
    fecha = entrada.find('span', {'class' : 'fecha'}).getText()

    # Imprimo el Título, Autor y Fecha de las entradas
    print "%d - %s  |  %s  |  %s" %(i+1,titulo,autor,fecha)
```

 

Como vemos a los métodos "***find()***" se les pasa el nombre de la clase CSS y te obtiene el contenido que hay entre esas etiquetas. Por último señalar lo que dejo en el comentario del fragmento de código anterior, que si no se utiliza el método "***getText()***", se muestra también el contenido HTML, mientras que si lo utilizamos, solo mostramos el contenido que hay entre las etiquetas HTML. Como resultado de la ejecución del programa tenemos lo siguiente:

 

```text

1 - Arquitectura Android – ART vs Dalvik  |  Por: Ramón	Invarato  |  17-may-2015
2 - Scraping en Java (JSoup), con ejemplos  |  Por: Ricardo	Moya  |  12-may-2015
3 - Diccionario en python, con ejemplos  |  Por: Ricardo	Moya  |  05-may-2015
4 - DataSet de resultados de partidos de fútbol para su predicción (Machine Learning)  |  Por: Ricardo	Moya  |  26-abr-2015
5 - Intalar Ubuntu en una máquina virtual con VirtualBox (Video)  |  Por: Ricardo	Moya  |  15-abr-2015
6 - Lectura y Escritura de ficheros en Java, con ejemplos  |  Por: Ricardo	Moya  |  08-abr-2015
7 - List en Python, con ejemplos  |  Por: Ricardo	Moya  |  06-abr-2015
8 - Python MongoDB Driver (pymongo), con ejemplos (Video)  |  Por: Ricardo	Moya  |  23-mar-2015
9 - Java MongoDB Driver, con ejemplos (Video)  |  Por: Ricardo	Moya  |  18-mar-2015
```

 

Esta libreria BeautifulSoup, es una libreria muy potente para hacer scraping. En esta entrada hemos visto como hacer una conexión HTTP y obtener el contenido HTML para almacenarlos en una lista para posteriormente sacar elementos o fragmentos de código HTML (***find() o find_all()***) como si de un parseo con expresiones regulares se tratase pero sin meterse en el "engorro" de trabajar con expresiones regulares. BeautifulSoup también tiene métodos para sacar el contenido de etiquetas como los h1, h2, …, p, img, etc. que en este caso no hemos visto en el ejemplo pero que si revisais su documentación veréis los métodos que permiten hacer esas acciones.

 

Para terminar dejo el programa que permite obtener todas las entradas de Jarroba.com (título, autor y fecha) y no solo los de la página principal como en el ejemplo mostrado:

 

```py

# -*- coding: utf-8 -*-
__author__ = 'RicardoMoya'

from bs4 import BeautifulSoup
import requests

URL_BASE = "http://jarroba.com/"
MAX_PAGES = 20
counter = 0

for i in range(1, MAX_PAGES):

    # Construyo la URL
    if i > 1:
        url = "%spage/%d/" % (URL_BASE, i)
    else:
        url = URL_BASE

    # Realizamos la petición a la web
    req = requests.get(url)
    # Comprobamos que la petición nos devuelve un Status Code = 200
    statusCode = req.status_code
    if statusCode == 200:

        # Pasamos el contenido HTML de la web a un objeto BeautifulSoup()
        html = BeautifulSoup(req.text, "html.parser")

        # Obtenemos todos los divs donde estan las entradas
        entradas = html.find_all('div', {'class': 'col-md-4 col-xs-12'})

        # Recorremos todas las entradas para extraer el título, autor y fecha
        for entrada in entradas:
            counter += 1
            titulo = entrada.find('span', {'class': 'tituloPost'}).getText()
            autor = entrada.find('span', {'class': 'autor'}).getText()
            fecha = entrada.find('span', {'class': 'fecha'}).getText()

            # Imprimo el Título, Autor y Fecha de las entradas
            print "%d - %s  |  %s  |  %s" % (counter, titulo, autor, fecha)

    else:
        # Si ya no existe la página y me da un 400
        break
```
