Ir al contenido

Web Scraping simplificado: microformatos de scraping

Web Scraping simplificado: microformatos de scraping

Introducción

El web scraping es el proceso de extraer datos de sitios web automáticamente. Implica escribir programas que puedan comprender las estructuras de las páginas web y extraer la información relevante. Si bien el web scraping puede ser un desafío para sitios web complejos, existen ciertas técnicas que facilitan el trabajo. Una de esas técnicas es el scraping de microformatos.

Los microformatos proporcionan metadatos semánticos integrados en el código HTML de forma estandarizada. Facilitan que los programas extraigan información significativa de las páginas web. En esta guía, aprenderemos los conceptos básicos de los microformatos, los tipos populares y cómo aprovecharlos para realizar un web scraping sin esfuerzo utilizando Python.

¿Qué son los microformatos?

Los microformatos se crearon para estandarizar la representación de importantes objetos de datos web para que puedan ser legibles por máquina. Lo más habitual es que los microformatos se utilicen para crear tarjetas de vista previa para páginas web. Se utilizan más comúnmente para proporcionar vistas de datos para motores de búsqueda, redes sociales y otros canales de comunicación.

Por ejemplo, cuando publicas un enlace en las redes sociales o en Slack, se muestra una tarjeta de vista previa con título, descripción y miniatura. Esto se genera al extraer microformatos de esa página.

El único inconveniente es que los microformatos no contienen el conjunto de datos completo de la página. Es posible que necesitemos ampliar el analizador de microformato con análisis HTML utilizando herramientas como Beautiful Soup o selector de CSS y analizadores XPath.

Tipos de microformato populares

Existen varios estándares de microformato que se utilizan en la web. Exploremos algunos tipos populares y cómo extraerlos usando la biblioteca extruct de Python.

JSON-LD

JSON-LD es el microformato moderno más popular. Utiliza documentos JSON integrados que representan directamente objetos de Schema.org.

Aquí hay un ejemplo de marcado JSON-LD y cómo analizarlo usando extruct:

import extruct

html = """<script type="application/ld+json">
{
  "@context": "http://schema.org",
  "@type": "Person",
  "name": "John Doe",
  "image": "johndoe.jpg",
  "jobTitle": "Software Engineer",
  "telephone": "(555) 555-5555",
  "email": "[email protected]",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main St",
    "addressLocality": "Anytown",
    "addressRegion": "CA", 
    "postalCode": "12345"
  }
}
</script>"""

data = extruct.JsonLdExtractor().extract(html)
print(data)

Esto genera un objeto Persona JSON-LD con campos de Schema.org como nombre, imagen, título del trabajo, etc.

JSON-LD es fácil de implementar, pero puede no coincidir con los datos de la página, ya que está separado de los datos visibles.

Microdata

Los microdatos son el segundo formato más popular que utiliza atributos HTML para marcar campos de microformato. Esto es excelente para el web scraping, ya que cubre los datos visibles de la página.

Aquí hay un ejemplo y cómo analizarlo:

html = """<div itemscope itemtype="http://schema.org/Person">
  <h1 itemprop="name">John Doe</h1>
  <img itemprop="image" src="johndoe.jpg" alt="John Doe">
  <p itemprop="jobTitle">Software Engineer</p>
  <p itemprop="telephone">(555) 555-5555</p>
  <p itemprop="email"><a href="mailto:[email protected]">[email protected]</a></p>
  <div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
    <p>
      <span itemprop="streetAddress">123 Main St</span>,
      <span itemprop="addressLocality">Anytown</span>,
      <span itemprop="addressRegion">CA</span>
      <span itemprop="postalCode">12345</span>
    </p>
  </div>
</div>"""

data = extruct.MicrodataExtractor().extract(html)
print(data)

Los microdatos coinciden más estrechamente con los datos de origen, ya que utilizan los mismos datos que se muestran en la página.

RDFa

RDFa es similar a Microdata y utiliza atributos HTML para microformatos. Comparte las mismas ventajas que Microdata.

He aquí un ejemplo:

html = """<div vocab="http://schema.org/" typeof="Person">
  <h1 property="name">John Doe</h1>
  <img property="image" src="johndoe.jpg" alt="John Doe"/>
  <p property="jobTitle">Software Engineer</p>
  <p property="telephone">(555) 555-5555</p>
  <p property="email"><a href="mailto:[email protected]">[email protected]</a></p>
  <div property="address" typeof="PostalAddress">
    <p>
      <span property="streetAddress">123 Main St</span>,
      <span property="addressLocality">Anytown</span>,
      <span property="addressRegion">CA</span>
      <span property="postalCode">12345</span>
    </p>
  </div>
</div>"""

data = extruct.RDFaExtractor().extract(html)
print(data)

Los datos RDFa coinciden con la fuente real, pero la salida es un poco complicada.

OpenGraph

OpenGraph de Facebook se utiliza para generar tarjetas de vista previa en publicaciones sociales. Admite objetos de Schema.org, pero rara vez se utiliza más allá de las vistas previas de sitios web.

He aquí un ejemplo:

html = """<head>
  <meta property="og:type" content="profile"/> 
  <meta property="og:title" content="John Doe"/>
  <meta property="og:image" content="johndoe.jpg"/>
  <meta property="og:description" content="Software Engineer"/>
  <meta property="og:phone_number" content="(555) 555-5555"/>
  <meta property="og:email" content="[email protected]"/>
  <meta property="og:street-address" content="123 Main St"/>
  <meta property="og:locality" content="Anytown"/>
  <meta property="og:region" content="CA"/>
  <meta property="og:postal-code" content="12345"/>
</head>"""

data = extruct.OpenGraphExtractor().extract(html)
print(data) 

Opengraph puede diferir de los datos de la página ya que no forma parte de la página natural.

Microformato

El microformato es uno de los formatos más antiguos anterior a Schema.org con sus propios esquemas para personas, organizaciones, eventos, productos, etc.

He aquí un ejemplo:

html = """<div class="h-card">
  <h1 class="fn">John Doe</h1> 
  <img class="photo" src="johndoe.jpg" alt="John Doe">
  <p class="title">Software Engineer</p>
  <p class="tel">(555) 555-5555</p>
  <a class="email" href="mailto:[email protected]">[email protected]</a>
  <div class="adr">
    <span class="street-address">123 Main St</span>,
    <span class="locality">Anytown</span>,
    <span class="region">CA</span>
    <span class="postal-code">12345</span>
  </div>
</div>"""

data = extruct.MicroformatExtractor().extract(html)
print(data)

Raspado de microformatos en Python

Veamos cómo aprovechar los microformatos para el web scraping utilizando la biblioteca extruct de Python. Eliminaremos sitios de muestra utilizando las técnicas cubiertas.

Instale extruct usando:

pip install extruct

Raspado de JSON-LD:

import extruct
import requests

url = "https://example.com" 

# Fetch HTML 
response = requests.get(url)
html = response.text

# Extract JSON-LD
data = extruct.JsonLdExtractor().extract(html)
print(data)

Esto imprimirá todos los objetos JSON-LD incrustados en la página.

De manera similar, podemos raspar otros formatos:

# Microdata
data = extruct.MicrodataExtractor().extract(html)

# RDFa
data = extruct.RDFaExtractor().extract(html)  

# OpenGraph
data = extruct.OpenGraphExtractor().extract(html)

# Microformat
data = extruct.MicroformatExtractor().extract(html)

extruct también tiene un método de extracción unificado que extrae todos los formatos a la vez:

import extruct

data = extruct.extract(html)
print(data.keys()) # ‘microdata‘, ‘json-ld‘, ‘opengraph‘, etc.

Esto facilita la extracción eficiente de múltiples microformatos.

Ejemplo de página de producto de Scraping de Etsy

Veamos un ejemplo real de raspado de una página de producto de Etsy utilizando microformatos.

Usaremos la API del producto de Etsy para recuperar el HTML del producto y extraerlo para extraer microformatos.

import requests
import extruct

product_id = "1214112656"

# Fetch product HTML
url = f"https://www.etsy.com/listing/{product_id}"
response = requests.get(url)
html = response.text

# Extract all microformats
data = extruct.extract(html)
print(data.keys())

# Get JSON-LD product 
product = next(obj for obj in data["json-ld"] if obj["@type"] == "Product")

# Print selected fields:
print(product["name"])
print(product["price"])
print(product["reviewCount"])

Esto imprime el nombre del producto, el precio, el recuento de reseñas y otros campos extraídos de JSON-LD.

Podemos integrar estas técnicas en un raspador web completo para cualquier sitio que utilice microformatos.

Consejos para raspar

A continuación se ofrecen algunos consejos para un scraping de microformato eficaz:

  • Inspeccione la fuente de la página para ver si hay microformatos presentes. Concéntrese en los más poblados.

  • Para sitios como Etsy, Product JSON-LD contiene los mejores datos. OpenGraph es útil para sitios sociales.

  • Normalice los datos extraídos en JSON/dicts normales para que sean más fáciles de procesar.

  • Amplíe el análisis con BeautifulSoup o bibliotecas similares si se necesitan más datos.

  • Utilice servidores proxy o herramientas como Scrapfly si el sitio bloquea el scraping.

Los microformatos facilitan la obtención de datos estructurados de páginas web. Integrarlos en sus scrapers puede ahorrarle mucho esfuerzo al analizar HTML.

Resumen

Los microformatos como JSON-LD, Microdata y RDFa proporcionan datos semánticos estructurados en páginas web para una fácil extracción.

Permiten extraer información clave como productos, artículos, reseñas, perfiles de personas, etc. sin un análisis HTML complejo.

Al identificar y extraer estos formatos utilizando la biblioteca extruct, podemos crear raspadores web escalables más rápido con Python.

Los microformatos no cubrirán todos los datos, por lo que se necesita un análisis adicional. Pero suponen una gran ventaja para los raspadores robustos.

¡Espero que esta publicación haya ayudado a explicar el valor de raspar microformatos para facilitar la extracción de datos web! Déjame saber si tienes alguna otra pregunta.

Tags:

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *