Cómo crear un rastreador web con Python - Guía para principiantes

Ștefan Răcila el 11 Abr 2023

blog-image

El rastreo web es el proceso de visitar automáticamente páginas web y extraer información útil de ellas. Un rastreador web, también conocido como araña o bot, es un programa que realiza esta tarea. En este artículo, vamos a discutir cómo crear un rastreador web utilizando el lenguaje de programación Python. Específicamente, crearemos dos rastreadores web.

Construiremos un sencillo rastreador web desde cero en Python utilizando las librerías Requests y BeautifulSoup . Después, hablaremos de las ventajas de utilizar un framework de rastreo web como Scrapy. Y por último, construiremos un ejemplo de crawler con Scrapy para recoger datos de todos los productos para bebés de Amazon. También veremos cómo Scrapy escala a sitios web con varios millones de páginas.

Requisitos previos

Antes de seguir este artículo, necesitarás tener conocimientos básicos de Python y tenerlo instalado en tu ordenador. Además, tendrás que instalar los módulos Requests y BeautifulSoup. Esto se puede hacer ejecutando el siguiente comando en su símbolo del sistema o terminal:

$ pip install peticiones bs4

Para la segunda parte de este artículo, donde construiremos un ejemplo de rastreador web utilizando Scrapy, necesitarás instalar el framework Scrapy. Los creadores de este framework recomiendan encarecidamente que instales Scrapy en un entorno virtual dedicado, para evitar conflictos con los paquetes de tu sistema.

Te sugiero que instales virtualenv y virtualenvwrapper para crear un entorno Python aislado. Ten en cuenta que existe una versión de virtualenvwrapper para Windows llamada virtualenvwrapper-win.

También tendrá que instalar pipx a través de pip para instalar virtualenv.

$ python -m pip install --user pipx

$ python -m pipx ensurepath

Después de crear un entorno Python aislado puedes instalar Scrapy con el siguiente comando.

$ pip install Scrapy

Puede encontrar la guía de instalación de Scrapy aquí.

¿Qué es un rastreador web?

Web crawling y web scraping son conceptos relacionados pero distintos. El web scraping es el proceso global de extracción de datos de un sitio web. El rastreo web es la tarea específica de navegar automáticamente a través de páginas web para encontrar las URL que necesitan ser raspadas.

Un rastreador web comienza con una lista de URL por las que navegar, conocida como semilla. A medida que navega por cada URL, busca enlaces en el HTML y los filtra en función de criterios específicos. Los nuevos enlaces encontrados se añaden a una cola para procesarlos en el futuro. A continuación, el HTML extraído o la información especificada se pasan a otra cadena para su posterior procesamiento.

blog-image

Al crear un rastreador web, es importante tener en cuenta que no se visitarán todas las páginas de un sitio web. El número de páginas que se visitan depende del presupuesto del rastreador, la profundidad del rastreo o el tiempo asignado para la ejecución.

Muchos sitios web tienen un archivo robots. txt que indica qué partes del sitio web pueden rastrearse y cuáles deben evitarse. Además, algunos sitios web tienen un sitemap.xml que es más explícito que robots.txt e indica específicamente a los robots qué páginas deben rastrearse, y proporciona metadatos adicionales para cada URL.

Los rastreadores web se utilizan habitualmente para diversos fines:

  • Las herramientas de análisis SEO recopilan metadatos como el tiempo y el estado de respuesta, además de HTML para detectar páginas rotas y enlaces entre distintos dominios para recopilar backlinks.
  • Las herramientas de control de precios rastrean los sitios web de comercio electrónico para encontrar páginas de productos y extraer metadatos, concretamente los precios. Las páginas de productos se revisan periódicamente.
  • Los motores de búsqueda, como Googlebot, Bingbot y Yandex Bot, recopilan todo el HTML de una parte importante de la web y utilizan los datos para que se puedan realizar búsquedas.

Más adelante en este artículo, compararemos dos enfoques diferentes para construir un rastreador web en Python. El primer enfoque es utilizar la biblioteca Requests para hacer peticiones HTTP y BeautifulSoup para analizar el contenido HTML. Y el segundo enfoque es utilizar un framework de rastreo web. Nosotros usaremos Scrapy.

Utilización de las bibliotecas Requests y BeautifulSoup

El módulo requests de Python es una potente herramienta para realizar peticiones HTTP. Para utilizarlo para el rastreo web, puedes empezar por importar el módulo y hacer una petición a una URL específica. Por ejemplo:

url = 'https://amazon.com/s?k=baby+productos'

response = requests.get(url)

Una vez que tenga la respuesta, puede extraer todos los enlaces del contenido HTML utilizando BeautifulSoup. Por ejemplo:

import json

from urllib.parse import urljoin

from bs4 import BeautifulSoup

html = response.text

links = []

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

for link in soup.find_all('a'):

path = link.get('href')

if path and path.startswith('/'):

path = urljoin(url, path)



links.append(path)

print(json.dumps(links, sort_keys = True, indent = 2))

A continuación, puede iterar a través de los enlaces y hacerles peticiones, repitiendo el proceso hasta que haya visitado todas las páginas que desea rastrear. Esta es una función recursiva que actúa exactamente así:

import requests

from urllib.parse import urljoin

from bs4 import BeautifulSoup

import logging

logging.basicConfig(

format='%(asctime)s %(levelname)s:%(message)s',

level=logging.INFO)

url = 'https://amazon.com/s?k=baby+products'

visited = []

def crawl(url):

logging.info(f'Crawling: {url}')

visited.append(url)

html = ''

try:

html = requests.get(url).text

except Exception:

logging.exception(f'Failed to crawl: {url}')

return



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

# here you can extract and store useful data from the page

for link in soup.find_all('a'):

path = link.get('href')

if path and path.startswith('/'):

path = urljoin(url, path)



if path not in visited:

crawl(path)

crawl(url)

La función registra una línea por cada URL visitada.

2023-01-16 09:20:51,681 INFO:Crawling: https://amazon.com/s?k=baby+productos

2023-01-16 09:20:53,053 INFO:Crawling: https://amazon.com/ref=cs_503_logo

2023-01-16 09:20:54,195 INFO:Crawling: https://amazon.com/ref=cs_503_link

2023-01-16 09:20:55,131 INFO:Crawling: https://amazon.com/dogsofamazon/ref=cs_503_d

2023-01-16 09:20:56,549 INFO:Crawling: https://www.amazon.com/ref=nodl_?nodl_android

2023-01-16 09:20:57,071 INFO:Crawling: https://www.amazon.com/ref=cs_503_logo

2023-01-16 09:20:57,690 INFO:Crawling: https://www.amazon.com/ref=cs_503_link

2023-01-16 09:20:57,943 INFO:Crawling: https://www.amazon.com/dogsofamazon/ref=cs_503_d

2023-01-16 09:20:58,413 INFO:Crawling: https://www.amazon.com.au/ref=nodl_&nodl_android

2023-01-16 09:20:59,555 INFO:Crawling: None

2023-01-16 09:20:59,557 ERROR:Error en el rastreo: Ninguno

Aunque el código de un rastreador web básico puede parecer sencillo, hay muchos retos que deben superarse para rastrear con éxito un sitio web completo. Entre ellos se incluyen cuestiones como:

  • La lógica de descarga de URL carece de un mecanismo de reintento y la cola de URL no es muy eficiente con un elevado número de URL.
  • El rastreador no se identifica e ignora el archivo robots.txt.
  • El rastreador es lento y no admite el paralelismo. Cada URL tarda aproximadamente un segundo en rastrearse, y el rastreador espera una respuesta antes de pasar a la siguiente URL.
  • La lógica de extracción de enlaces no soporta la estandarización de URLs mediante la eliminación de parámetros de cadenas de consulta, no maneja URLs relativas de anclaje/fragmento (como href="#anchor"), y no soporta el filtrado de URLs por dominio o el filtrado de peticiones a archivos estáticos.

En la siguiente sección, veremos cómo Scrapy aborda estas cuestiones y facilita la ampliación de la funcionalidad del rastreador web para casos de uso personalizados.

Cómo hacer un rastreador web en Python usando el framework Scrapy

Scrapy es un potente framework para crear rastreadores web en Python. Proporciona una forma integrada de seguir enlaces y extraer información de páginas web. Tendrás que crear un nuevo proyecto Scrapy y una araña para definir el comportamiento de tu rastreador.

Antes de empezar a rastrear un sitio web como Amazon, es importante comprobar el archivo robots.txt del sitio web para ver qué rutas URL están permitidas. Scrapy lee automáticamente este archivo y lo sigue cuando la configuración ROBOTSTXT_OBEY está establecida en true, que es el valor predeterminado para los proyectos creados con el comando de Scrapy `startproject`.

Para crear un nuevo proyecto Scrapy es necesario ejecutar el siguiente comando:

$ scrapy startproject amazon_crawler

Este comando generará un proyecto con la siguiente estructura:

amazon_crawler/

├── scrapy.cfg

└── amazon_crawler

├── __init__.py

├── items.py

├── middlewares.py

├── pipelines.py

├── settings.py

└── spiders

├── __init__.py

Para crear una araña utiliza el comando `genspider` de la CLI de Scrapy. El comando tiene la siguiente definición:

$ scrapy genspider [options] <name> <domain>

Para generar una araña para este crawler podemos ejecutar:

$ cd amazon_crawler

$ scrapy genspider baby_products amazon.com

Debería crear un archivo llamado `baby_products.py` dentro de la carpeta llamada `spiders` y tener este código generado:

import scrapy

class BabyProductsSpider(scrapy.Spider):

name = 'wikipedia'

allowed_domains = ['es.wikipedia.com']

start_urls = ['http://en.wikipedia.com/']

def parse(self, response):

pass

Scrapy también ofrece una variedad de clases de araña pre-construidas, tales como CrawlSpider, XMLFeedSpider, CSVFeedSpider, y SitemapSpider. La clase CrawlSpider, que se construye sobre la clase Spider base, incluye un atributo "rules" adicional para definir cómo navegar por un sitio web. Cada regla utiliza un LinkExtractor para determinar qué enlaces deben extraerse de cada página.

Para nuestro caso de uso deberíamos heredar nuestra clase Spider de CrawlSpider. También necesitaremos hacer una regla LinkExtractor que le diga a la araña que extraiga enlaces sólo de la paginación de Amazon. Recuerda que nuestro objetivo era recoger datos de todos los productos para bebés de Amazon, así que en realidad no queremos seguir todos los enlaces que encontremos en la página.

Luego tenemos que crear otros dos métodos en nuestra clase, `parse_item` y `parse_product`. `parse_item` será una función de llamada a nuestra regla LinkExtractor y será llamada con cada enlace extraído. `parse_product` analizará cada producto... ¯\_(ツ)_/¯

from scrapy.spiders import CrawlSpider, Rule

from scrapy.linkextractors import LinkExtractor

from bs4 import BeautifulSoup

class BabyProductsSpider(CrawlSpider):

name = 'baby_products'

allowed_domains = ['amazon.com']

start_urls = ['https://amazon.com/s?k=baby+products']

rules = (

Rule(

LinkExtractor(

restrict_css='.s-pagination-strip'

),

callback='parse_item',

follow=True),

)

def parse_item(self, response):

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

products = soup.select('div[data-component-type="s-search-result"]')

data = []

for product in products:

parsed_product = self.parse_product(product)

if (parsed_product != 'error'):

data.append(parsed_product)

return {

'url': response.url,

'data': data

}

def parse_product(self, product):

try:

link = product.select_one('a.a-text-normal')

price = product.select_one('span.a-price > span.a-offscreen').text

return {

'product_url': link['href'],

'name': link.text,

'price': price

}

except:

return 'error'

Para iniciar el rastreador puede ejecutar:

$ scrapy crawl baby_products

Verá muchos registros en la consola (puede especificar un archivo de registro con `--logfile [log_file_name]`).

He utilizado Amazon Search como ejemplo para demostrar los fundamentos de la creación de un rastreador web en Python. Sin embargo, el rastreador no encuentra muchos enlaces que seguir y no está adaptado para un caso de uso específico de los datos. Si está buscando extraer datos específicos de Amazon Search, puede considerar utilizar nuestra API de datos de productos de Amazon. Hemos creado parsers personalizados para Amazon Search, Product y Category page y devuelve los datos en formato JSON listos para ser utilizados en su aplicación.

¿Por qué es mejor utilizar un servicio profesional de scraping que un crawler?

Aunque el rastreo web puede ser una herramienta útil para extraer datos de Internet, también puede llevar mucho tiempo y ser complejo de configurar. Además, el web scraping puede ir en contra de las condiciones de servicio de algunos sitios web y puede provocar el bloqueo de tu IP o incluso que se emprendan acciones legales contra ti.

Por otro lado, los servicios profesionales de scraping utilizan técnicas y tecnologías avanzadas para eludir las medidas anti-scraping y extraer datos sin ser detectados. También se encargan del mantenimiento y el escalado de la infraestructura de scraping, lo que le permite centrarse en analizar y utilizar los datos. Además, también proporcionan un mayor nivel de precisión e integridad de los datos, ya que son capaces de manejar casos de uso de extracción de datos más avanzados y pueden gestionar trabajos de scraping a gran escala.

Resumen

En conclusión, aunque el rastreo web puede ser una herramienta útil para extraer datos de Internet, también puede llevar mucho tiempo y ser complejo de configurar. Además, el rastreo web puede ir en contra de los términos de servicio de algunos sitios web y puede resultar en el bloqueo de su IP o incluso en acciones legales en su contra. Por lo tanto, para trabajos de scraping más avanzados y a gran escala, es mejor utilizar un servicio de scraping profesional.

Si está buscando una alternativa al rastreo por su cuenta, considere el uso de WebScrapingAPI. WebScrapingAPI es un servicio profesional de raspado web que le permite extraer fácilmente datos de sitios web sin necesidad de crear y mantener su propio raspador web.

Es una solución rápida, fiable y rentable, adecuada para empresas de todos los tamaños.

¿Por qué no lo pruebas hoy mismo? Es gratis y tenemos una prueba de 14 días sin necesidad de tarjeta.

Noticias y actualidad

Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artículos relacionados

miniatura
GuíasCómo raspar datos de productos de Amazon: Guía completa de mejores prácticas y herramientas

Explore las complejidades del scraping de datos de productos de Amazon con nuestra guía en profundidad. Desde las mejores prácticas y herramientas como Amazon Scraper API hasta las consideraciones legales, aprenda a superar los desafíos, eludir los CAPTCHA y extraer información valiosa de forma eficiente.

Suciu Dan
avatar de autor
Suciu Dan
15 minutos de lectura
miniatura
GuíasTutorial de Scrapy Splash: Dominar el arte del scraping de sitios web renderizados en JavaScript con Scrapy y Splash

Aprenda a scrapear sitios web dinámicos con JavaScript utilizando Scrapy y Splash. Desde la instalación hasta la escritura de una araña, el manejo de la paginación y la gestión de las respuestas de Splash, esta completa guía ofrece instrucciones paso a paso tanto para principiantes como para expertos.

Ștefan Răcila
avatar de autor
Ștefan Răcila
6 min leer
miniatura
GuíasScrapy vs. Beautiful Soup: Guía comparativa completa de herramientas de raspado web

Explore una comparación detallada entre Scrapy y Beautiful Soup, dos herramientas líderes de raspado web. Comprende sus características, pros y contras, y descubre cómo pueden utilizarse juntas para adaptarse a las necesidades de distintos proyectos.

WebscrapingAPI
avatar de autor
WebscrapingAPI
10 minutos de lectura