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?
- Verifica si Google Chrome está instalado.
- Instala Google Chrome si no está instalado.
- Descarga el contenido HTML de las entradas del blog de WordPress.
- 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
- 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.
- El script primero comprueba si Google Chrome está instalado verificando la existencia del archivo
- 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.
- 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.
- Utiliza un bucle
- Almacenamiento de títulos y URLs:
- Almacena los títulos y URLs en arrays para su posterior procesamiento.
- 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.
- 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!