¿Cómo raspar sitios web con Beautifulsoup y Python?

¿Alguna vez te has preguntado cuántos datos se crean en Internet todos los días y qué pasa si quieres trabajar con esos datos? Desafortunadamente, estos datos no están organizados correctamente como algunos archivos CSV o JSON, pero afortunadamente, podemos usar web scraping para extraer los datos de Internet y usarlos de acuerdo con nuestras propias necesidades. Hay muchas formas de extraer datos y una de ellas es usar BeautifulSoup. 

Antes de comenzar a aprender BeautifulSoup, aprendamos qué es un web scraping y si debemos hacerlo o no.

¿Qué es el raspado web?

En términos sencillos, web scraping es el proceso de recopilación de datos de cualquier sitio web. Es como copiar y pegar los datos de un sitio web a su propio archivo, pero de forma automática . En términos técnicos, Web Scripting es un método automático para obtener grandes cantidades de datos de sitios web. La mayoría de estos datos son datos no estructurados en formato HTML que luego se convierten en datos estructurados en una hoja de cálculo o una base de datos para que puedan usarse en varias aplicaciones. 

Nota: Para obtener más información, consulte ¿Qué es Web Scraping y cómo usarlo?

Legalización del Web Scraping

La legalización del web scraping es un tema delicado, dependiendo de cómo se use, puede ser una bendición o una ruina. Por un lado, el raspado web con un buen bot permite que los motores de búsqueda indexen el contenido web, los servicios de comparación de precios para ahorrar dinero y valor al cliente. Pero el web scraping se puede reorientar para cumplir fines más maliciosos y abusivos. El web scraping se puede alinear con otras formas de automatización maliciosa, denominadas «malos bots», que permiten otras actividades dañinas como ataques de denegación de servicio, minería de datos competitiva, secuestro de cuentas, robo de datos, etc.

Ahora, después de aprender los conceptos básicos del web scraping, no perdamos más tiempo y sumerjámonos directamente en BeautifulSoup. Comencemos con la Instalación.

Instalación

Para instalar Beautifulsoup en Windows, Linux o cualquier sistema operativo, se necesitaría el paquete pip . Para verificar cómo instalar pip en su sistema operativo, consulte – Instalación de PIP – Windows || linux _ Ahora ejecute el siguiente comando en la terminal.

pip install beautifulsoup4

Python BeautifulSoup install

Consulte los artículos a continuación para conocer más formas de instalar BeautifulSoup si el método anterior no funciona para usted.

Inspección del sitio web

Antes de raspar cualquier sitio web, lo primero que debe hacer es conocer la estructura del sitio web. Esto es necesario para seleccionar los datos deseados de toda la página. Podemos hacer esto haciendo clic derecho en la página que queremos raspar y seleccionando inspeccionar elemento.

Nota: Estaremos raspando la página de programación de Python para este tutorial.

python bs4 inspect element

Después de hacer clic en el botón de inspección, se abren las herramientas de desarrollo del navegador. Ahora, casi todos los navegadores vienen con las herramientas de desarrollo instaladas, y usaremos Chrome para este tutorial. 

html of the page bs4

Las herramientas de los desarrolladores permiten ver el Modelo de objetos del documento (DOM) del sitio . Si no conoce DOM, no se preocupe, solo considere el texto que se muestra como la estructura HTML de la página. 

Obtener el HTML de la página

Después de inspeccionar el HTML de la página, todavía necesitamos obtener todo el HTML en nuestro código Python para que podamos raspar los datos deseados. Para esto, Python proporciona un módulo llamado requests. La biblioteca de requests es una de las partes integrales de Python para realizar requests HTTP a una URL específica. La instalación de las requests depende del tipo de sistema operativo que se esté usando, el comando básico en cualquier lugar sería abrir una terminal de comando y ejecutar,

pip install requests

Ahora hagamos una solicitud GET simple usando el método get() .

Ejemplo:

Python3

import requests
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# print content of request
print(r.content)

Producción:

python requests get

Consulte el tutorial a continuación para obtener información detallada y bien explicada sobre el módulo de requests.

Analizando el HTML

Después de obtener el HTML de la página, veamos 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.

Nota: la biblioteca BeautifulSoup se basa en la parte superior de las bibliotecas de análisis de HTML como html5lib, lxml, html.parser, etc. Por lo tanto, el objeto BeautifulSoup y especificar la biblioteca del analizador se pueden crear al mismo tiempo.

Ejemplo 1:

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
print(soup.prettify())

Producción:

souping object bs4

Ejemplo 2:

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# Getting the title tag
print(soup.title)
 
# Getting the name of the tag
print(soup.title.name)
 
# Getting the name of parent tag
print(soup.title.parent.name)
 
# use the child attribute to get
# the name of the child tag

Producción: 

<title>Python Programming Language - GeeksforGeeks</title>
title
meta

Encontrar elementos

Ahora, nos gustaría extraer algunos datos útiles del contenido HTML. El objeto de sopa contiene todos los datos en la estructura anidada que podrían extraerse mediante programación. El sitio web que queremos raspar contiene mucho texto, así que ahora vamos a raspar todo ese contenido.

Primero, inspeccionemos la página web que queremos raspar. 

find_all bs4 python tutorial

Encontrar elementos por clase

En la imagen de arriba podemos ver que todo el contenido de la página está bajo el div con class entry-content. Almacenaremos todos los resultados encontrados en esta clase. 

Ejemplo:

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# check status code for response received
# success code - 200
print(r)
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
print(s)

Producción: 

find bs4

 En el ejemplo anterior, hemos utilizado la clase find . Esta clase encontrará la etiqueta dada con el atributo dado. En nuestro caso, encontrará todos los div que tengan clase como contenido de entrada. Tenemos todo el contenido del sitio, pero puede ver que todas las imágenes y enlaces también se eliminan. Entonces, nuestra próxima tarea es encontrar solo el contenido del HTML analizado anteriormente.

Inspeccionemos nuevamente el HTML de nuestro sitio web.
 

find_all bs4 python tutorial

Podemos ver que el contenido de la página está bajo la etiqueta <p> . Ahora tenemos que encontrar todas las etiquetas p presentes en esta clase. Podemos usar la clase find_all de BeautifulSoup.

Ejemplo: 

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
 
lines = s.find_all('p')
print(lines)

 
Producción: 

find_all bs4

Finalmente obtenemos todo el contenido almacenado bajo la etiqueta <p>. 

Búsqueda de elementos por ID

En el ejemplo anterior, hemos encontrado los elementos por el nombre de la clase, pero veamos cómo encontrar elementos por id. Ahora, para esta tarea, raspamos el contenido de la barra izquierda de la página. El primer paso es inspeccionar la página y ver la barra izquierda bajo qué etiqueta.

find elements by id bs4

La imagen de arriba muestra que la barra izquierda cae bajo la etiqueta <div> con id como principal. Ahora vamos a obtener el contenido HTML bajo esta etiqueta.

Ejemplo: 

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# finding element by id
s = soup.find('div', id= 'main')
 
print(s)

Producción: 

find elements by id bs4 python tutorial

Ahora inspeccionemos más de la página para obtener el contenido de la barra izquierda. 

python bs4 find by elements

Podemos ver que la lista en la barra izquierda está debajo de la etiqueta <ul> con la clase como leftBarList y nuestra tarea es encontrar todos los li debajo de este ul.

Ejemplo: 

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# Finding by id
s = soup.find('div', id= 'main')
 
# Getting the leftbar
leftbar = s.find('ul', class_='leftBarList')
 
# All the li under the above ul
content = leftbar.find_all('li')
print(content)

Producción: 

find all elements by id bs4

Consulte los siguientes artículos para obtener información detallada sobre cómo encontrar elementos. 

Extracción de texto de las etiquetas

En los ejemplos anteriores, debe haber visto que al raspar los datos, las etiquetas también se raspan, pero ¿qué pasa si solo queremos el texto sin ninguna etiqueta? No se preocupe, discutiremos lo mismo en esta sección. Usaremos la propiedad text . Solo imprime el texto de la etiqueta. Usaremos el ejemplo anterior y eliminaremos todas las etiquetas de ellos.

Ejemplo 1: Eliminar las etiquetas del contenido de la página 

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
s = soup.find('div', class_='entry-content')
 
lines = s.find_all('p')
 
for line in lines:
    print(line.text)

Producción:

get all text bs4 python

Ahora hemos extraído con éxito el contenido de nuestro primer sitio web. Este script se ejecutará en todos los sistemas hasta que haya cambios en el HTML de la página web.

Ejemplo 2: Eliminando las etiquetas del contenido de la barra izquierda. 

Python3

import requests
from bs4 import BeautifulSoup
 
 
# Making a GET request
r = requests.get('https://www.geeksforgeeks.org/python-programming-language/')
 
# Parsing the HTML
soup = BeautifulSoup(r.content, 'html.parser')
 
# Finding by id
s = soup.find('div', id= 'main')
 
# Getting the leftbar
leftbar = s.find('ul', class_='leftBarList')
 
# All the li under the above ul
lines = leftbar.find_all('li')
 
for line in lines:
    print(line.text)

 Producción:

extract text from tags bs4

Consulte los siguientes artículos para obtener información detallada sobre la extracción de texto.

Más temas sobre BeautifulSoup

Ejercicios y proyectos de BeautifulSoup

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *