Automatización de la Descarga de Posts de WordPress a PDF con Bash y Chrome

En esta entrada, aprenderemos cómo crear un script en Bash que automatiza la descarga de entradas de un blog de WordPress y las convierte en archivos PDF utilizando Google Chrome en modo headless. Este proceso incluye la verificación e instalación de Google Chrome si no está presente en el sistema.

¿Qué hace este script?

  1. Verifica si Google Chrome está instalado.
  2. Instala Google Chrome si no está instalado.
  3. Descarga el contenido HTML de las entradas del blog de WordPress.
  4. Convierte las páginas HTML descargadas en archivos PDF.

Paso a paso del script

A continuación, se detalla el script y su funcionamiento:

#!/bin/bash

# Comprobar si Chrome está instalado en la ruta específica
if [ ! -f /opt/google/chrome/chrome ]; then
    echo "Google Chrome no está instalado. Procediendo con la instalación."

    # Instalar wget si no está instalado
    if ! command -v wget &> /dev/null; then
        sudo apt update
        sudo apt install -y wget
    fi

    # Descargar e instalar Google Chrome
    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    sudo apt install -y ./google-chrome-stable_current_amd64.deb

    # Limpiar el archivo de instalación
    rm google-chrome-stable_current_amd64.deb
else
    echo "Google Chrome ya está instalado."
fi

# URL base del sitio de WordPress
BASE_URL="https://red-orbita.com"

# Crear un directorio para almacenar los archivos descargados
mkdir -p wordpress_posts

# Declarar arrays para almacenar los títulos y URLs
declare -a titles
declare -a urls

# Iterar sobre cada página para extraer los títulos y enlaces de las entradas
page=1
while true; do
    page_url="$BASE_URL/?paged=$page"
    html_content=$(curl -s "$page_url")

    # Verificar si la página está vacía o no existe
    if [ -z "$html_content" ]; then
        echo "No se pudo obtener el contenido de la página $page. Saliendo del bucle."
        break
    fi

    # Extraer los títulos y URLs de las entradas usando sed y awk
    page_titles=$(echo "$html_content" | sed -n 's/.*<h2 class="entry-title"><a href="[^"]*"[^>]*>\(.*\)<\/a><\/h2>.*/\1/p')
    page_urls=$(echo "$html_content" | sed -n 's/.*<h2 class="entry-title"><a href="\([^"]*\)"[^>]*>.*<\/a><\/h2>.*/\1/p')

    # Verificar si no se encontraron títulos en la página actual
    if [ -z "$page_titles" ] || [ -z "$page_urls" ]; then
        echo "No se encontraron títulos o URLs en la página $page. Saliendo del bucle."
        break
    fi

    # Almacenar los títulos y URLs en arrays
    while IFS= read -r title; do
        titles+=("$title")
    done < <(echo "$page_titles")

    while IFS= read -r url; do
        urls+=("$url")
    done < <(echo "$page_urls")

    ((page++))
done

# Usar las variables almacenadas en los arrays
for i in "${!titles[@]}"; do
    title="${titles[$i]}"
    url="${urls[$i]}"
    # Sanitizar el título para usarlo como nombre de archivo
    safe_title=$(echo "$title" | sed 's/[^a-zA-Z0-9]/_/g' | tr -s '_')
    #echo "${safe_title}.html $url" >> url.txt

    # Verificar si la URL es válida (debe comenzar con http o https)
    if [[ "$url" =~ ^https?:// ]]; then
        # Descargar la página web
        wget -O "wordpress_posts/${safe_title}.html" "$url"

        if [ $? -eq 0 ]; then
            echo "Se ha descargado $title correctamente."
            /opt/google/chrome/chrome --headless=new --disable-gpu --print-to-pdf=wordpress_posts/${safe_title}.pdf --no-margins wordpress_posts/${safe_title}.html
          rm wordpress_posts/${safe_title}.html
        else
            echo "Error al descargar $title."
        fi

        # Esperar 20 segundos antes de la próxima descarga
        sleep 20
    else
        echo "URL inválida: $title $url"
    fi
done

xplicación del script

  1. Verificación e instalación de Google Chrome:
    • El script primero comprueba si Google Chrome está instalado verificando la existencia del archivo /opt/google/chrome/chrome.
    • Si no está instalado, procede a instalar wget (si no está disponible) y luego descarga e instala Google Chrome.
  2. Configuración inicial:
    • Define la URL base del sitio de WordPress que se va a procesar.
    • Crea un directorio wordpress_posts para almacenar los archivos descargados.
  3. Extracción de títulos y URLs:
    • Utiliza un bucle while para iterar a través de las páginas del blog de WordPress.
    • Descarga el contenido HTML de cada página utilizando curl.
    • Verifica si la página tiene contenido. Si no, sale del bucle.
    • Utiliza sed para extraer los títulos y URLs de las entradas.
  4. Almacenamiento de títulos y URLs:
    • Almacena los títulos y URLs en arrays para su posterior procesamiento.
  5. Descarga y conversión de páginas:
    • Itera sobre los títulos y URLs almacenados.
    • Sanitiza los títulos para usarlos como nombres de archivo válidos.
    • Descarga cada página web y la guarda como un archivo HTML.
    • Utiliza Google Chrome en modo headless para convertir el archivo HTML a PDF.
  6. Espera entre descargas:
    • Añade una espera de 20 segundos entre descargas para evitar sobrecargar el servidor.

Conclusión

Este script en Bash es una herramienta poderosa para automatizar la descarga de los post de un blog de WordPress a archivos PDF. Utilizando herramientas como curl, wget, sed y Google Chrome en modo headless, puedes crear fácilmente copias de seguridad o preparar contenido para su lectura offline.

:wq!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *