Tabla de contenido
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:

sudo apt install python3-pip
El siguiente paso será instalar el paquete requests. Esto se conseguirá escribiendo en la misma terminal:

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.

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:

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.

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):

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«.

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.

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

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:

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.

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:

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.

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:

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á.

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:

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á:

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.

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:

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.

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

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:

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.