Raspado de texto: un tutorial paso a paso

Esta guía abarca el raspado de texto en Python, desde la configuración hasta el almacenamiento de datos, con consejos sobre el uso de proxies para evitar los bloqueos de IP.
14 min read
Text scraping tutorial blog image

El raspado web es el proceso de extracción de datos de las páginas web. Como los datos pueden adoptar muchas formas, el término raspado de texto se usa específicamente para hacer referencia a la recopilación de datos textuales.

Disponer de una gran cantidad de datos relevantes es esencial para el éxito de cualquier decisión empresarial. Raspar información de los sitios web de la competencia puede darte una idea de su lógica empresarial, lo que puede ayudarte a obtener una ventaja competitiva. En este tutorial, aprenderás a implementar un raspador de texto en Python, lo que facilita la extracción y el uso de datos web.

Requisitos previos

Antes de comenzar este tutorial, necesitas los siguientes requisitos previos:

  • La versión más reciente de Python y pip instalada en tu sistema.
  • Un entorno virtual de Python. Asegúrate de instalar todos los paquetes necesarios en el entorno virtual, incluidas requests para obtener el contenido HTML de una página web, Beautiful Soup para analizar y extraer el texto o los datos deseados del HTML y pandas para organizar y almacenar los datos extraídos en un formato estructurado, como un archivo CSV.

Si buscas más información que te ayude a empezar a hacer raspado web con Python, consulta este artículo.

Comprender la estructura del sitio web

Antes de empezar a hacer raspado, debes analizar la estructura del sitio web al que te diriges. Los sitios web se crean con HTML, que es un lenguaje de marcado que define cómo se organiza y muestra el contenido.

Cada parte del contenido, ya sea un título, un párrafo o un enlace, se incluye en etiquetas HTML. Estas etiquetas te ayudan a identificar dónde se encuentran los datos que quieres raspar. Así, en este ejemplo, raspas las citas de Quotes to Scrape, un sitio web simulado. Para ver la estructura de este sitio web, debes abrir el sitio web en tu navegador y acceder a las Herramientas para desarrolladores haciendo clic con el botón derecho en la página y seleccionando Inspeccionar o Inspeccionar elemento. Al hacerlo, se abre el código HTML de la página:

Inspecciona el elemento en un navegador web

Tómate un tiempo para familiarizarte con la estructura: busca etiquetas como 

, ya que suelen contener el texto o los enlaces que quieras extraer. Además, ten en cuenta que las etiquetas suelen contener un atributo class.  Su propósito es definir una clase específica para el elemento HTML, lo que permite diseñarlo con CSS o seleccionarlo con JavaScript.

Nota: el atributo class es especialmente práctico para el raspado de texto porque te ayuda a seleccionar elementos específicos de una página que comparten el mismo estilo o estructura, lo que facilita la extracción de los datos exactos que necesitas.

Aquí, cada cita está contenida en un elemento div con la clase quote. Si te interesa el texto y el autor de cada cita, el texto está dentro de un div con la clase text y el autor está contenido en un elemento pequeño con la clase author:

Estructura HTML de una cita

Si no conoces el funcionamiento del HTML, consulta este artículo sobre raspado web HTML para obtener más información.

Raspado de texto de un sitio web

Teniendo en cuenta la estructura del sitio web, el siguiente paso es escribir el código que utilizarás para raspar el sitio Quotes to Scrape. 

Python es una opción popular para esta tarea dada su facilidad de uso y sus potentes bibliotecas, que incluyen requests y BeautifulSoup. Utiliza la biblioteca requests para obtener el contenido HTML de la página. Esta acción es necesaria porque debes recuperar los datos sin procesar antes de poder analizarlos o extraerlos. Una vez que tengas el contenido HTML, puedes dividirlo en una estructura más manejable usando BeautifulSoup.

Para empezar, crea un archivo Python para el script de raspado de texto denominado text-scraper.py. Luego, importa BeautifulSoup y requests:

import requests
from bs4 import BeautifulSoup

Especifica la URL del sitio web que raspas y envía una solicitud GET:

# URL of the quotes website
url = 'https://quotes.toscrape.com/'

# Send a GET request to the URL
response = requests.get(url)

Tras enviar la solicitud GET, recibirás el HTML de una página completa. Tienes que analizarlo para extraer solo los datos que necesitas, que en este caso son el texto y el autor de cada cita. Para ello, lo primero que tienes que hacer es crear un objeto BeautifulSoup para analizar el HTML:

soup = BeautifulSoup(response.text, 'html.parser')

Busca todos los elementos div que contienen citas (es decir, que pertenecen a la clase quote): 

quotes = soup.find_all('div', class_='quote')

Crea una lista para almacenar las citas en:

data = []

Luego, extrae el texto y el autor de cada cita y guárdalos en la lista data: 

for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

El script debería tener un aspecto similar al siguiente:

import requests
from bs4 import BeautifulSoup

# URL of the quotes website
url = 'http://quotes.toscrape.com/'

# Send a GET request to the URL
response = requests.get(url)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Find all quote containers
quotes = soup.find_all('div', class_='quote')

# Extract data from each quote
data = []
for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

print(data)

Es el momento de ejecutar el script desde tu terminal:

# For Linux and macOS
python3 text-scraper.py

# For Windows
python text-scraper.py

Deberías imprimir una lista de las citas extraídas:

[{'Author': 'Albert Einstein',
  'Text': '"The world as we have created it is a process of our thinking. It '
        'cannot be changed without changing our thinking."'},
 {'Author': 'J.K. Rowling',
  'Text': '"It is our choices, Harry, that show what we truly are, far more '
        'than our abilities."'},
 {'Author': 'Albert Einstein',
  'Text': '"There are only two ways to live your life. One is as though '
        'nothing is a miracle. The other is as though everything is a '
        'miracle."'},
 {'Author': 'Jane Austen',
  'Text': '"The person, be it gentleman or lady, who has not pleasure in a '
        'good novel, must be intolerably stupid."'},
 {'Author': 'Marilyn Monroe',
  'Text': ""Imperfection is beauty, madness is genius and it's better to be "
        'absolutely ridiculous than absolutely boring."'},
 {'Author': 'Albert Einstein',
  'Text': '"Try not to become a man of success. Rather become a man of '
        'value."'},
 {'Author': 'André Gide',
  'Text': '"It is better to be hated for what you are than to be loved for '
        'what you are not."'},
 {'Author': 'Thomas A. Edison',
  'Text': ""I have not failed. I've just found 10,000 ways that won't work.""},
 {'Author': 'Eleanor Roosevelt',
  'Text': '"A woman is like a tea bag; you never know how strong it is until '
        "it's in hot water.""},
 {'Author': 'Steve Martin',
  'Text': '"A day without sunshine is like, you know, night."'}]

Si bien este raspado de texto parecía bastante sencillo, es probable que tengas problemas durante el raspado web, como el bloqueo de IP, si el sitio web detecta demasiadas solicitudes, o CAPTCHA para evitar el acceso automatizado. Para superarlos, puedes usar proxies.

Usar proxies para el raspado anónimo

Los proxies te ayudan a evitar y eludir los bloqueos de IP y los CAPTCHA al rotar tu dirección IP y hacer que tus solicitudes parezcan provenir de diferentes ubicaciones. Para usar proxies, debes configurar el método request.get() para enrutar todas las solicitudes a través de un servidor proxy.

En este escenario, utiliza los proxies rotativosde Bright Data, que te dan acceso a más de 72 millones de direcciones IP de más de 195 países. Para empezar, crea una cuenta gratuita de Bright Data seleccionando Iniciar prueba gratuita en la esquina superior derecha, rellenando el formulario de registro y haciendo clic en Crear cuenta:

Formulario de registro de Bright Data

Crea un proxy residencial básico

Cuando tengas una cuenta de Bright Data, inicia sesión y dirígete a la sección Proxies y raspado.  En la sección Redes de proxy,  busca proxies residenciales y haz clic en Empezar:

Panel de Bright Data: sección **Proxies y raspado**

Se te pedirá que añadas una nueva zona para el proxy residencial. Conserva todos los valores predeterminados, asigna un nombre a la zona y haz clic en Añadir:

Crea una nueva zona proxy residencial

¡Y eso es todo lo que necesitas para crear una nueva zona proxy residencial!

Para usar el proxy, necesitas tus credenciales (es decir, nombre de usuario, contraseña y host). Para encontrar estas credenciales, ve de nuevo a la sección Proxies y raspado y selecciona la zona proxy que acabas de crear:

Lista de zonas proxy creadas

Tras hacer clic en la zona proxy, verás el panel de control de la zona. En la sección Autorización, verás tus credenciales:

Credenciales de la zona proxy de Bright Data

Actualiza el script de raspado

Ahora que tienes tus credenciales de proxy, es el momento de configurar el proxy. Para empezar, almacena tus credenciales como variables:

host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'

Luego, compón una URL proxy a partir de las credenciales almacenadas:

proxy_url = f'http://{username}:{password}@{host}:{port}'

Crea una configuración de proxy para las solicitudes HTTP y HTTPS:

proxies = {
    'http': proxy_url,
    'https': proxy_url
}

Y añade la configuración de proxy a la llamada requests.get() existente:

response = requests.get(url, proxies=proxies)

Llegados a este punto, el script debería tener el siguiente aspecto:

import requests
from bs4 import BeautifulSoup

# BrightData credentials
host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-<customer_id>-zone-<zone_name>'
password = '<zone_password>'

# Compose a proxy URL
proxy_url = f'http://{username}:{password}@{host}:{port}'

# Create a proxy configuration
proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# URL of the quotes website
url = 'http://quotes.toscrape.com/'

# Send a GET request to the URL via the specified proxy
response = requests.get(url, proxies=proxies)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

# Find all quote containers
quotes = soup.find_all('div', class_='quote')

# Extract data from each quote
data = []
for quote in quotes:
    text = quote.find('span', class_='text').text.strip()
    author = quote.find('small', class_='author').text.strip()

    data.append({
        'Text': text,
        'Author': author
    })

print(data)

Ejecuta y prueba el script

Al ejecutar este script se obtiene el mismo resultado que el script sin proxies. La diferencia es que el sitio web que raspas ahora cree que envías una solicitud desde otro lugar, por lo que tu ubicación real permanece privada. Vamos a ilustrar esto escribiendo un nuevo script sencillo.

Importa las bibliotecas necesarias y establece la URL en "http://lumtest.com/myip.json" en el script:

import requests
from bs4 import BeautifulSoup

url = "http://lumtest.com/myip.json"

Envía una solicitud GET a la URL sin una configuración de proxy y crea un objeto BeautifulSoup para la respuesta:

# Send a GET request to the URL
response = requests.get(url)

# Create a BeautifulSoup object to parse the HTML
soup = BeautifulSoup(response.text, 'html.parser')

Por último, imprime el objeto soup

print(soup)

Ejecuta este script. A continuación, recibirás información sobre tu dirección IP y ubicación como respuesta.

Para comparar, configura la solicitud GET para usar un proxy de Bright Data y deja todo lo demás igual:

# BrightData credentials
host = 'brd.superproxy.io'
port = 22225

username = 'brd-customer-hl_459f8bd4-zone-test_residential_proxy'
password = '8sdgouh1dq5h'

proxy_url = f'http://{username}:{password}@{host}:{port}'

proxies = {
    'http': proxy_url,
    'https': proxy_url
}

# Send a GET request to the URL
response = requests.get(url, proxies=proxies)

Cuando ejecutes el script actualizado, deberías ver que recibes una dirección IP diferente como respuesta; esa no es tu IP real, sino la dirección IP de un proxy que hayas configurado. Básicamente, lo que haces es esconder tu dirección IP detrás de un servidor proxy.

Almacenamiento de datos

Una vez que hayas raspado con éxito los datos de un sitio web, el siguiente paso es almacenarlos en un formato estructurado que permita un fácil acceso y análisis. El formato CSV es el más utilizado, ya que está ampliamente extendido entre las herramientas de análisis de datos y los lenguajes de programación.

Para guardar los datos extraídos en un archivo CSV, empieza por importar la biblioteca pandas (en la parte superior del script de raspado), ya que cuenta con métodos para convertir datos a formato CSV:

import pandas as pd

Luego, crea un objeto Pandas DataFrame a partir de los datos raspados que recopilaste:

df = pd.DataFrame(data)

Por último, convierte el DataFrame en un archivo CSV y asígnale un nombre (por ejemplo, quotes.csv):

df.to_csv('quotes.csv', index=False)

Tras realizar estos cambios, ejecuta el script. A continuación, obtendrás los datos raspados almacenados en el archivo CSV.

En este sencillo ejemplo, no hay mucho que puedas hacer con las citas. Sin embargo, según los datos que raspes, hay muchas formas de analizarlos para extraer información.

Puedes empezar por explorar las estadísticas descriptivas utilizando la función pandas describe() Esta función ofrece un vistazo rápido de los datos numéricos, incluidas la media, la mediana y la desviación típica. Puedes visualizar tus datos con Matplotlib o seaborn para crear histogramas, diagramas de dispersión o gráficos de barras, lo que te ayudará a identificar patrones o tendencias visualmente. En el caso de los datos textuales, considera la posibilidad de utilizar técnicas de procesamiento del lenguaje natural, como el análisis de frecuencia de palabras o el análisis de sentimiento, para comprender los temas comunes o el sentimiento general en las reseñas o comentarios.

Para obtener información más detallada, busque correlaciones entre las distintas variables del conjunto de datos. Por ejemplo, puedes examinar la relación entre las valoraciones de los libros y la extensión de las reseñas o analizar cómo varían las valoraciones entre distintos géneros o autores. Usa la función pandas groupby() para añadir datos y comparar métricas entre categorías.

No olvides tener en cuenta el contexto de tus datos y las preguntas a las que intentas responder. Por ejemplo, si está analizando reseñas de libros, puede investigar qué factores contribuyen más a las valoraciones altas o identificar tendencias en géneros populares a lo largo del tiempo. Mantén siempre una actitud crítica ante tus conclusiones y ten en cuenta los posibles sesgos en el proceso de recopilación de datos.

Conclusión

En este tutorial, has aprendido a raspar texto con Python, has explorado las ventajas de usar proxies y has descubierto cómo los proxies rotativos de Bright Data pueden ayudarte a evitar los bloqueos de IP y a mantener el anonimato.

Si bien desarrollar tus propias soluciones de raspado puede resultar gratificante, a menudo entraña dificultades, como mantener el código, gestionar los CAPTCHA y cumplir con las políticas del sitio web. Aquí es donde las API de raspado de Bright Data pueden ayudarte. Con funciones como resolución automática de CAPTCHA, rotación de IP y análisis de datos sólido, Bright Data simplifica el proceso de raspado web y te permite centrarte en el análisis de datos en vez de en la gestión de la infraestructura.

Regístrate para obtener una prueba gratuita de Bright Data para ver cómo Bright Data puede mejorar tus proyectos de raspado web, proporcionándote soluciones de recopilación de datos fiables, escalables y eficientes para las necesidades de tu empresa.

No se requiere tarjeta de crédito