Volver al blog
Guías
Raluca PenciucLast updated on Mar 31, 20266 min read

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

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

Vivimos en la era digital y tenemos acceso a una gran cantidad de datos. Gracias a esta información, podemos comprender mejor cómo trabajamos, jugamos, aprendemos y vivimos. ¿No sería estupendo poder obtener información más específica sobre un tema concreto?

En este artículo, te mostraremos cómo utilizar BeautifulSoup y WebScrapingAPI conjuntamente para crear nuestros propios rastreadores y recopilar datos específicos de sitios web.

Una advertencia: extraer contenido protegido por derechos de autor o información personal es ilegal en la mayoría de los casos. Para estar seguros, es mejor obtener un consentimiento explícito antes de extraer datos de cualquier sitio web, especialmente de las redes sociales.

¿Qué son los rastreadores web?

Existen numerosos motores de búsqueda, y todos los usamos. Sus servicios son fáciles de usar: solo tienes que 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 tan exitoso.

Al escanear 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 mostrarlas más tarde mediante la indexación. Los motores de búsqueda dependen de los rastreadores para recopilar información de los sitios web, incluyendo URL, hipervínculos, metaetiquetas y artículos, así como para examinar el texto HTML.

Gracias a la capacidad del bot para rastrear lo que ya ha visitado, 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 datos, y ni siquiera voy a mencionar cuántos sitios web nuevos aparecen a diario.

Al final, esto les obligaría a buscar entre millones de páginas y 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é mencionarlos? 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 tenemos una comprensión básica de los rastreadores web, quizá te preguntes cómo funciona todo esto en la práctica. ¡Pues vamos a profundizar en ello!

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

  • Python 3;
  • Un IDE de Python. En esta guía utilizaremos Visual Studio Code porque es ligero y no requiere ninguna configuración adicional. El código es independiente del IDE, así que puedes elegir cualquier IDE con el que te sientas cómodo;

Por último, pero no menos importante, necesitaremos una clave API. Puedes crear una cuenta gratuita de WSA, que te dará 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.

Desarrollo del rastreador

Bien, 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 un sitio web de comercio electrónico que vende productos de cero residuos para diferentes usos. Navegaremos por todas las páginas, extraeremos la lista de productos de cada una y, finalmente, almacenaremos los datos en un archivo CSV para cada página.

Para ello, primero tenemos que echar un vistazo a la estructura de la página y decidir nuestra estrategia. Haz clic con el botón derecho en cualquier lugar de la página, luego en «Inspeccionar elemento», y aparecerá la «Consola de desarrollador». Aquí puedes ver el documento HTML del sitio web, que contiene todos los datos que necesitamos.

Crear el rastreador

¡Bien, ahora 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 «products». Te ayudará a organizar y almacenar los resultados del scraping en varios archivos CSV.

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

> py crawler.py

Continuando, 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 para nuestro rastreador:

def crawl(url, filename):
    page_body = get_page_source(url, filename)
    soup = BeautifulSoup(page_body, 'html.parser')
    start_crawling(soup, filename)

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

Implementamos la función crawl, que extraerá los documentos HTML a través de nuestro procedimiento get_page_source. A continuación, creará el objeto BeautifulSoup que facilitará nuestro análisis 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)

Como se ha indicado anteriormente, la función get_page_source utilizará WebScrapingAPI para obtener el contenido HTML del sitio web y lo escribirá en un archivo de texto en la sección <body>, ya que es la que contiene toda la información que nos interesa.

Ahora, demos un paso atrás y veamos cómo lograr nuestros objetivos. Los productos están organizados en páginas, por lo que necesitamos acceder a cada página repetidamente para extraerlos todos.

Esto significa que nuestro rastreador seguirá unos pasos recursivos mientras haya páginas disponibles. Para plasmar esta lógica en código, tenemos que fijarnos en 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, teniendo en cuenta que estamos en la primera página y no hay ninguna anterior a esta, la flecha de la izquierda está desactivada.

Por lo tanto, el siguiente algoritmo debe:

  • Acceder a la página;
  • Extraer los datos (lo implementaremos en el siguiente paso);
  • Encontrar el contenedor de paginación en el documento HTML; Verificar si la flecha de «Página siguiente» está desactivada; si lo está, detenerse; si no, obtener el nuevo enlace y llamar 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. Echaremos otro vistazo al documento HTML y veremos que podemos acceder a la información relevante fijándonos en los nombres de las clases.

Extraeremos el nombre del producto, la valoración, el número de reseñas y el precio, pero puedes ir tan lejos como quieras.

¿Recuerdas la carpeta «products» que creamos antes? Ahora crearemos 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])

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

Reflexiones finales

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

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

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

Acerca del autor
Raluca Penciuc, Desarrollador full-stack @ 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.