Inicio Apuntes FPApuntes DAW Scraping con Python y BeautifulSoup, algo básico para empezar

Scraping con Python y BeautifulSoup, algo básico para empezar

Pequeño tutorial de scraping web con Python

Publicado por entreunosyceros

AVISO: Esta entrada tiene más de dos años desde su publicación. Es posible que el contenido esté desactualizado.

Después de un tiempo sin publicar, durante la convalecencia me ha dado por pensar en algunas cosas que quiero hacer. Para realizar algunas de ellas, digamos que voy a necesitar obtener información de un sitio web. En estos casos, en lo primero en lo que solemos pensar los usuario, es en copiar y pegar la información en nuestro propio equipo. Pero si esto se quiere hacer a gran escala y de forma rápida, copiar y pegar no funcionará de forma eficiente. Y es aquí donde se puede necesitar el scraping web. Por esto vamos a ver algunos ejemplos básicos con los que realizar Scraping con Python y BeautifulASoup.

Por este motivo, y pensando en aquello que quiero hacer, en las siguiente líneas vamos a ver cómo realizar un scraping web básico usando la biblioteca de solicitudes y la biblioteca BeautifulSoup en Python.

Módulo de solicitudes para realizar Scraping con Python y BeautifulSoup

La biblioteca de solicitudes se utiliza para realizar solicitudes HTTP a una URL específica, devolviendonos su correspondiente respuesta. Las solicitudes de Python proporcionan funcionalidades integradas para administrar tanto la solicitud como la respuesta.

Instalación

Esto depende del tipo de sistema operativo que utilicemos. En caso de usar Ubuntu, como es mi caso, tendrás que comenzar por instalar Pip. Para hacer esto, basta con abrir una terminal (Ctrl+Alt+T) y ejecutar el comando:

instalar python3-pip
sudo apt install python3-pip

El siguiente paso será instalar el paquete requests. Esto se conseguirá escribiendo en la misma terminal:

pip install requests
pip install requests

Hacer una solicitud

Una vez instalado, debemos tener claro que el módulo de solicitudes de Python tiene varios métodos integrados para realizar solicitudes HTTP a una URL específica mediante solicitudes GET, POST, PUT, PATCH o HEAD.

Una solicitud HTTP está destinada a recuperar datos de una URL específica, o a enviar datos a un servidor. Funciona como un protocolo de solicitud-respuesta entre un cliente y un servidor. En el siguiente ejemplo vamos a utilizar la solicitud GET.

El método GET se usa para recuperar información del servidor dado usando una URL dada. Este método envía la información de usuario codificada adjunta a la solicitud de página.

Ejemplo de una solicitud de Python que realiza una solicitud GET

Como va a ocurrir en todos los ejemplos mostrados, el código que vamos a ver a continuación lo guardaremos dentro de un archivo .py, para este ejemplo yo lo llamo requests-python.py.

Scraping con Python y Beautifulsoup requests python
import requests
 
# Hacer una solicitud GET
solicitud = requests.get('https://entreunosyceros.net/apuntes-fp/apuntes-dam/')
 
# Verifica el código de estado para la respuesta recibida
# código de éxito - 200
print(solicitud)
 
# Imprimir el contenido de la solicitud
print(solicitud.content)

Cuando ejecutemos este archivo, veremos una salida como la siguiente:

resultado requests

Ejemplo para solicitar con Python un objeto de respuesta

También podemos optar pos solicitar el objeto de respuesta, que como ocurría en el anterior ejemplo, si devuelve el código de éxito 200, la URL estará online y será accesible.

Scraping con Python y Beautifulsoup response code objetc
import requests
 
# Solicitud GET
solicitud = requests.get('https://entreunosyceros.net/apuntes-fp/apuntes-dam/')
 
# Objeto de la solicitud de impresión
print(solicitud.url)
   
# Código de estado 
print(solicitud.status_code)

Al ejecutar el archivo en incluya este código, veremos una salida como la siguiente:

Biblioteca BeautifulSoup

BeautifulSoup se utiliza para extraer información de los archivos HTML y XML. Proporciona un árbol de análisis y las funciones para navegar, buscar o modificar este árbol de análisis.

La biblioteca BeautifulSoup se basa en las bibliotecas de análisis de HTML como html5lib, lxml, html.parser, etc.

Instalación

Para instalar BeautifulSoup en Gnu/Linux o cualquier otro sistema operativo (me parece), se necesita el paquete pip. En Ubuntu, este paquete se puede instalar fácilmente con pip escribiendo en la terminal (Ctrl+Alt+T):

instalar beaufifulsoup4
pip install beautifulsoup4

Inspeccionar el sitio web para realizar Scraping con Python y BeautifulSoup

Antes de sacar cualquier información del HTML de la página, es necesario tener clara la estructura de la página. Esto es necesario para que podamos seleccionar los datos que nos interesen de toda la página.

Esta estructura la podemos conocer haciendo clic derecho en la página que muestra el navegador web, y seleccionando «inspeccionar«.

seleccionar inspeccionar

Después de hacer clic en el botón de inspección, se van a abrir las herramientas de desarrollo en el navegador. Ahora, casi todos los navegadores vienen con las herramientas de desarrollo instaladas. Para este ejemplo yo estoy utilizando Firefox.

inspector en firefox

Las herramientas del desarrollador permiten ver el Modelo de objetos del documento (DOM) del sitio.

Analizando el HTML

Después de conocer el HTML de la página, vamos a ver cómo analizar este código HTML sin procesar para obtener información útil. En primer lugar, crearemos un objeto BeautifulSoup especificando el analizador que queremos usar.

Ejemplo de Scraping con Python y Beautifulsoup analizando HTML

scraping con pyton y beautifulsoup para analizar el html
import requests
from bs4 import BeautifulSoup
 
 
# Solicitud GET
solicitud = requests.get('https://entreunosyceros.net/apuntes-fp/apuntes-dam/')
 
# Verificar el código de estado para la respuesta recibida
# código de éxito - 200
print(solicitud)
 
# Analizando el HTML
soup = BeautifulSoup(solicitud.content, 'html.parser')
print(soup.prettify())

El anterior código, nos dará como salida al ejecutar el archivo en el que guardemos este código, algo como lo siguiente:

resultado de analizar el html

Esta información todavía no es muy útil. Por eso vamos a ver como extraer el título de la página que pasamos como URL.

Scraping con Python y Beautifulsoup para obtener el título de una página
import requests
from bs4 import BeautifulSoup
 
# Solicitud GET
solicitud = requests.get('https://entreunosyceros.net/apuntes-fp/apuntes-dam/')
 
# Analizazndo el HTML
soup = BeautifulSoup(solicitud.content, 'html.parser')
 
# Obteniendo el tag del título
print(soup.title)
 
# Obteniendo el nombre del tag del título
print(soup.title.name)
 
# Obtener el nombre de la etiqueta principal
print(soup.title.parent.name)

Este código nos mostrará una salida como la siguiente:

obtener título de una página

Scraping con Python y BeautifulSoup para encontrar elementos

Llegados a este punto, es hora de extraer algunos datos útiles del contenido HTML. El objeto soup contiene todos los datos en la estructura anidada que podrían extraerse mediante programación. El sitio web que queremos scrapear contiene texto, así que ahora vamos a raspar todo ese contenido. Primero, inspeccionemos la página web que nos interesa.

Ejemplo para encontrar elementos por clase

Si la página que estamos viendo nos ofrece todo su contenido bajo un div, el cual utiliza la clase ‘post-entry‘, podemos usar la clase find para encontrar la clase ‘post-entry. Así encontraremos la etiqueta dada con el atributo dado. En nuestro caso, encontrará todos los div que tengan la clase ‘post-entry‘. Gracias a esto podemos encontrar todo el contenido del sitio.

En el caso de este ejemplo, el contenido se encuentra bajo la etiqueta p. Esta etiqueta de párrafo, se encuentra dentro de la etiqueta div con la clase ‘post-entry‘. Por eso, para llegar al texto, tenemos que encontrar todas las etiquetas p presentes en esta clase. Podemos usar la clase find_all de BeautifulSoup de la siguiente manera.

Scraping con Python y Beautifulsoup con find_all
import requests
from bs4 import BeautifulSoup
 
 
# Solicitud GET
solicitud = requests.get('https://entreunosyceros.net/recortar-un-texto-con-css-que-no-cabe-en-una-sola-linea/')
 
# Analizando el HTML
soup = BeautifulSoup(solicitud.content, 'html.parser')
 
busqueda = soup.find('div', class_='post-entry')
content = busqueda.find_all('p')
 
print(content)

Con el anterior código veremos algo como lo siguiente:

buscar por clase

Ejemplo de búsqueda de elementos por ID

En el ejemplo anterior, hemos encontrado los elementos por el nombre de la clase, pero también podremos encontrar elementos por su id. Ahora, para esta tarea, vamos a scrapear el contenido de la lista de artículos de una categoría. El primer paso es inspeccionar la página y ver bajo qué etiqueta está.

estructura web

La imagen de arriba muestra que el listado de artículos está bajo la etiqueta div con id como ‘main‘. Ahí es dónde podremos encontrar la etiqueta ul con la clase como ‘penci-grid’. Y lo que buscamos es encontrar todos los li bajo esta ul. Para ello el código necesario sería algo como lo siguiente:

Scraping con Python y Beautifulsoup para buscar por id
import requests
from bs4 import BeautifulSoup
 
# Solicitud GET
solicitud = requests.get('https://entreunosyceros.net/apuntes-fp/apuntes-dam/')
 
# Analizar el HTML
soup = BeautifulSoup(solicitud.content, 'html.parser')
 
# Buscar por id
busqueda = soup.find('div', id= 'main')
 
# Obtener la lista del grid
grid = busqueda.find('ul', class_='penci-grid')
 
# Todo el li debajo del ul anterior
contenido = grid.find_all('li')
 
print(contenido)

Esto nos mostrará:

resultado de la búsqueda por id

Extracción de enlaces

Hasta ahora hemos visto cómo extraer un conjunto de texto, pero ahora veamos cómo extraer los enlaces de la página.

Ejemplo de Python BeautifulSoup extrayendo enlaces

En este ejemplo, como veremos en el resultado, se va a mostrar algunos enlaces repetido dos veces. Esto es así por que en el tema que utilizo, cada imagen contiene un enlace a la entrada, y cada título de entrada contiene también un enlace a la misma entrada que las imágenes.

extraer enlaces con beautifulsoup
import requests
from bs4 import BeautifulSoup
 
 
# Solicitud GET
solicitud = requests.get('https://entreunosyceros.net/')
 
#  Analizando el HTML
soup = BeautifulSoup(solicitud.content, 'html.parser')
 
# Encontrar todas las etiquetas de anclaje con 'href'
for link in soup.find_all('a'):
    print(link.get('href'))

Este código que acabamos de ver, al ejecutarlo nos devolverá algo como lo siguiente:

enlaces obtenidos

Extraer información de la imagen

Al inspeccionar nuevamente la página, podemos ver que las imágenes se encuentran dentro de la etiqueta img y el enlace de esa imagen está dentro del atributo src. También buscaremos el contenido del atributo alt.

Ejemplo para extraer las URL de imágenes con Python BeautifulSoup

import requests
from bs4 import BeautifulSoup
 
 
# Solicitud GET
solicitud = requests.get('https://entreunosyceros.net/eversticky-una-aplicacion-de-notas-adhesivas-compatible-con-evernote/')
 
# Analizando el HTML
soup = BeautifulSoup(solicitud.content, 'html.parser')
 
images_list = []
 
images = soup.select('img')
for image in images:
    src = image.get('src')
    alt = image.get('alt')
    images_list.append({"src": src, "alt": alt})
     
for image in images_list:
    print(image)

El anterior código nos va a mostrar por pantalla un listado de las URL de las imágenes que se encuentran en la URL dada.

info imagenes de URL

Guardar datos en CSV

Para hacer esto primero crearemos una lista de diccionarios con los pares clave-valor que queremos añadir al archivo CSV. Después vamos a usar el módulo csv para escribir la salida en el archivo CSV.

Ejemplo para guardar los datos obtenidos con Python BeautifulSoup en un archivo CSV

guardar datos obtenidos con beautifulsoup en un archivo .csv
import requests
from bs4 import BeautifulSoup as bs
import csv
 
# Solicitud GET
pagina = requests.get('https://entreunosyceros.net/informatica/wordpress-informatica/')

# Analizando el HTML
soup = bs(pagina.text, 'html.parser')

# Títulos de cada celda
titulos = soup.find_all('h2', attrs={'class', 'entry-title'})
lista_titulos = []
 
contador = 1
for title in titulos:
    d = {}
    d['Título Número'] = f'Título {contador}'
    d['Nombre del Título'] = title.text
    contador += 1
    lista_titulos.append(d)

# Archivo .csv y escritura 
archivo = 'titulos.csv'
with open(archivo, 'w', newline='') as f:
    w = csv.DictWriter(f,['Título Número','Nombre del Título'])
    w.writeheader()
     
    w.writerows(lista_titulos)

Al ejecutar el anterior código, obtendremos un listado como el siguiente:

datos guardados con beautifulsoup en un archivo .csv utilizando BeautifulSoup

Y bueno, con esto hemos visto algunos ejemplos básicos del Scraping con Python y Beautifulsoup. Todo esto se puede desarrollar mucho más, según lo que necesites raspar de la página web de turno. Pero eso ya es cosa de cada usuario.

También te puede interesar ...

Deja un comentario

* Al utilizar este formulario, aceptas que este sitio web almacene y maneje tus datos.

Adblock Detectado!!

Ayúdanos deshabilitando la extensión AdBlocker de tu navegador para visitar esta web.
Si no sabes hacerlo en Chrome, consulta el siguiente enlace. Si utilizas Firefox, puedes consultar este otro enlace.
Esto mejorará tu experiencia en este sitio web.