Volver al blog
Guías
Raluca Penciuc13 de agosto de 20217 min de lectura

Cómo construir un rastreador web en menos de 100 líneas de código

Cómo construir un rastreador web en menos de 100 líneas de código

¿Qué son los rastreadores web?

Existen numerosos motores de búsqueda, y todos los utilizamos. Sus servicios son fáciles de usar: basta con preguntar algo y ellos buscan por toda la web para encontrarte una respuesta. Entre bastidores, es el rastreador Googlebot de Google el que hace que el motor de búsqueda de Google sea todo un éxito.

Al rastrear la web en busca de páginas según las palabras clave introducidas, los rastreadores ayudan a los motores de búsqueda a catalogar esas páginas y a mostrarlas posteriormente mediante la indexación. Los motores de búsqueda dependen de los rastreadores para recopilar información de los sitios web, como direcciones URL, hipervínculos, metaetiquetas y artículos, además de examinar el código HTML.

Gracias a la capacidad del bot para realizar un seguimiento de las páginas a las que ya ha accedido, no tienes que preocuparte de que se quede atascado en la misma página web indefinidamente. La Internet pública y la selección de contenidos plantean varios retos a los rastreadores web. Cada día, los sitios web existentes publican docenas de nuevos contenidos, y ni siquiera voy a mencionar la cantidad de sitios web nuevos que aparecen a diario.

Al final, esto les obligaría a revisar millones de páginas y a actualizar sus índices continuamente. Los sistemas que analizan el contenido de los sitios web dependen de ellos, por lo que son esenciales.

Así pues, los rastreadores son importantes, pero ¿por qué los mencionamos? Porque vamos a crear nuestro propio bot para que nos ayude en el proceso de extracción de datos. De esta forma, podremos confiar en él para que recupere las URL en lugar de tener que introducirlas manualmente en el scraper. ¡Más automatización, genial!

Instalación

Ahora que ya tenemos una idea básica de cómo funcionan los rastreadores web, quizá te preguntes cómo funciona todo esto en la práctica. ¡Pues vamos a profundizar en el tema!

Lo primero es lo primero: tenemos que configurar nuestro entorno de trabajo. Asegúrate de que tu equipo cumple los siguientes requisitos previos:

  • python3;
  • Un entorno de desarrollo integrado (IDE) para Python. En esta guía utilizaremos Visual Studio Code, ya que es ligero y no requiere ninguna configuración adicional. No obstante, el código es independiente del IDE, por lo que puedes elegir cualquier IDE con el que te sientas cómodo;

Por último, pero no por ello menos importante, necesitaremos una clave API. Puedes crear una cuenta gratuita de WSA, que te dará derecho a 5000 llamadas API durante los primeros 14 días. Una vez te hayas registrado, solo tienes que ir a tu panel de control, donde encontrarás tu clave API y otros recursos útiles.

Página de configuración que muestra un campo para la clave de acceso a la API con un icono de copiar y una opción para restablecer la clave

Desarrollo del rastreador

Genial, ya tenemos las herramientas, así que estamos más cerca de empezar a crear nuestro rastreador. Pero, ¿cómo lo vamos a utilizar? Su implementación puede variar en función de nuestro objetivo final.

Elige un sitio web e inspecciona el HTML

Para este tutorial, hemos elegido una página web de comercio electrónico que vende productos de cero residuos para distintos usos. Navegaremos por todas las páginas, extraeremos la lista de productos de cada una de ellas y, por último, guardaremos los datos en un archivo CSV para cada página.

Para ello, primero debemos examinar la estructura de la página y definir nuestra estrategia. Haz clic con el botón derecho en cualquier punto de la página, selecciona «Inspeccionar elemento» y aparecerá la «Consola de desarrollador». Aquí podrás ver el documento HTML del sitio web, que contiene toda la información que necesitamos.

Página de productos de comercio electrónico abierta con las herramientas de desarrollador y el menú contextual «Inspeccionar elemento»

Construye el robot de rastreo

¡Bien, ahora ya podemos escribir algo de código!

Empieza abriendo una ventana de terminal en tu IDE y ejecuta el siguiente comando, que instalará BeautifulSoup, una biblioteca que nos ayudará a extraer los datos del HTML:

> pip install beautifulsoup4

A continuación, crea una carpeta llamada «productos». Esto te ayudará a organizar y guardar los resultados del scraping en varios archivos CSV.

Por último, crea el archivo «crawler.py». Aquí es donde vamos a escribir todo nuestro código y la lógica de rastreo. Cuando hayamos terminado, podremos ejecutar el archivo con el siguiente comando:

> py crawler.py

A continuación, importemos las bibliotecas que necesitamos y definamos algunas variables globales:

import requests
from bs4 import BeautifulSoup
import csv
 
BASE_URL = "https://www.shopetee.com"
SECTION = "/collections/all-collections"
FULL_START_URL = BASE_URL + SECTION

ENDPOINT = "https://api.webscrapingapi.com/v1/"
API_KEY = "API_KEY"

Ahora, definamos el punto de entrada de nuestro rastreador:

def crawl(url, nombre_archivo):
    cuerpo_página = get_page_source(url, nombre_archivo)
    soup = BeautifulSoup(cuerpo_página, 'html.parser')
    start_crawling(soup, nombre_archivo)

crawl(FULL_START_URL, 'etee-page1.txt')

Implementamos la función de rastreo, que extraerá los documentos HTML mediante nuestro procedimiento get_page_source. A continuación, creará el objeto BeautifulSoup, que facilitará el análisis del código, y llamará a la función start_crawling, que comenzará a navegar por el sitio web.

def get_page_source(url, filename):
    params = {
        "api_key": API_KEY,
        "url": url,
        "render_js": '1'
    }
    page = requests.request("GET", ENDPOINT, params=params)
    soup = BeautifulSoup(page.content, 'html.parser')
    body = soup.find('body')

    file_source = open(filename, mode='w', encoding='utf-8')
    file_source.write(str(body))
    file_source.close()

    return str(body)

As stated earlier, the get_page_source function will use WebScrapingAPI to get the HTML content of the website and will write in a text file in the <body> section, as it’s the one containing all the information we are interested in.

Ahora, demos un paso atrás y veamos cómo alcanzar nuestros objetivos. Los productos están organizados en páginas, por lo que tendremos que acceder a cada una de ellas varias veces para extraerlos todos.

Esto significa que nuestro rastreador seguirá una serie de pasos recursivos mientras haya páginas disponibles. Para plasmar esta lógica en código, debemos analizar cómo describe el HTML estas condiciones.

Si vuelves a la Consola de desarrolladores, verás que cada número de página es, en realidad, un enlace a una nueva página. Es más, dado que estamos en la primera página y no hay ninguna anterior a esta, la flecha de la izquierda está desactivada.

DevTools resalta el siguiente elemento de enlace de paginación en el código HTML

Por lo tanto, el siguiente algoritmo debe:

  • Accede a la página;
  • Extrae los datos (lo haremos en el siguiente paso);
  • Busca el contenedor de paginación en el documento HTML; comprueba si la flecha «Página siguiente» está desactivada; si es así, detente; si no, obtén el nuevo enlace y llama a la función de rastreo para la nueva página.
def start_crawling(soup, filename):

    extract_products(soup, filename)

    pagination = soup.find('ul', {'class': 'pagination-custom'})
    next_page = pagination.find_all('li')[-1]
    
    if next_page.has_attr('class'):
        if next_page['class'] == ['disabled']:
            print("You reached the last page. Stopping the crawler...")
    else:
        next_page_link = next_page.find('a')['href']
        next_page_address = BASE_URL + next_page_link
        next_page_index = next_page_link[next_page_link.find('=') + 1]
        crawl(next_page_address, f'etee-page{next_page_index}.txt')

Extraer datos y exportarlos a CSV

Por último, veamos cómo podemos extraer los datos que necesitamos. Echemos otro vistazo al documento HTML y veremos que podemos acceder a la información relevante fijándonos en los nombres de las clases.

DevTools resalta los metadatos del producto, como el número de reseñas y el precio, en la ficha del artículo

Extraeremos el nombre del producto, la valoración, el número de reseñas y el precio, pero puedes ampliar la información tanto como quieras.

¿Recuerdas la carpeta «productos» que creamos antes? Ahora vamos a crear un archivo CSV para exportar los datos que extraemos de cada página. La carpeta nos ayudará a organizarlos todos juntos.

def extract_products(soup, filename):
    csv_filename = filename.replace('.txt', '.csv')
    products_file = open(f'products/{csv_filename}', mode='a', encoding='utf-8', newline='')
    products_writer = csv.writer(products_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    products_writer.writerow(['Title', 'Rating', 'Reviews', 'Price on sale'])

    products = soup.find_all('div', {'class': 'product-grid-item'})
    for product in products:
        product_title = product.find('div', {'class': 'item-title'}).getText().strip()
        product_rating = product.find('span', {'class': 'jdgm-prev-badge__stars'})['data-score']
        product_reviews = product.find('span', {'class': 'jdgm-prev-badge__text'}).getText().strip()
        product_price_on_sale = product.find('span', {'class': 'money'}).getText()
        products_writer.writerow([product_title, product_rating, product_reviews, product_price_on_sale])

Una vez ejecutado el programa, podrás ver toda la información extraída en los archivos recién creados.

Hoja de cálculo con los títulos de los productos recopilados, que incluye columnas con la valoración, el número de reseñas y el precio de venta

Reflexiones finales

¡Y eso es prácticamente todo! Acabamos de crear nuestro propio rastreador web utilizando BeautifulSoup y WebScrapingAPI de Python en menos de 100 líneas de código. Por supuesto, puede variar en función de la complejidad de tu tarea, pero es un resultado bastante bueno para un rastreador que recorre las páginas de un sitio web.

Para esta guía, hemos utilizado la versión de prueba gratuita de WebScrapingAPI, que ofrece 5000 llamadas a la API durante los primeros 14 días, más que suficientes para crear un potente rastreador.  

Resultó muy útil centrarnos únicamente en la lógica del rastreador, en lugar de preocuparnos por los diversos retos que plantea el web scraping. Esto nos ahorró tiempo, energía y otros costes considerables, como el uso de nuestros propios proxies, por ejemplo, que son solo algunas de las ventajas que se pueden obtener al utilizar una API para el web scraping.

Acerca del autor
Raluca Penciuc, desarrolladora full-stack en WebScrapingAPI
Raluca PenciucDesarrollador full-stack

Raluca Penciuc es desarrolladora full stack en WebScrapingAPI, donde se dedica a crear rastreadores, mejorar las técnicas de evasión y buscar formas fiables de reducir la detección en los sitios web de destino.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.