Script para generar el fichero sitemap.xml de una web estática

Hace unos años hice el crawling de la web antigua de kaosenlared. Ahora tiempo mas tarde el analytics de google les estaba dando muchos errores de páginas no encontradas, así que he tenido que generar los ficheros sitemap.xml para que google indexe el sitio.

He hecho un primer script para listar todas las páginas index.html del directorio y generar el fichero sitemap.xml que ocupaba la friolera de 150Mb pero al metérselo a google analytics daba errores de tamaño de archivo. Buscando los límites, nos encontramos que el sitemap.xml no puede ser más grande de 50Mb ni contener más de 50.000 entradas. Así que ha sido necesario crear un índice y separar los sitemap.xml en ficheros más pequeños.

A continuación el script de como lo he hecho

#!/bin/bash

# Directori on es troben les pàgines html
DIRECTORI=/home/virtualmin/archivo.kaosenlared.net/public_html

# URL base del lloc web
URL_BASE=https://archivo.kaosenlared.net

current_date=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

# Funció per generar el sitemap.xml
generar_sitemap() {
  # Initialize the URL count and the file number
  url_count=0
  file_number=1

  # Initialize the sitemap file name
  sitemap_file="sitemap_${file_number}.xml"
  sitemap_index="sitemap.xml"

  # Inicialitza el fitxer sitemap.xml
  echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' > $sitemap_index

  echo '<?xml version="1.0" encoding="UTF-8"?>' > $sitemap_file
  echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">' >> $sitemap_file


  echo "  <sitemap>" >> $sitemap_index
  echo "    <loc>$URL_BASE/$sitemap_file</loc>" >> $sitemap_index
  echo "    <lastmod>$current_date</lastmod>" >> $sitemap_index
  #echo "    <changefreq>monthly</changefreq>" >> $sitemap_index
  echo "  </sitemap>" >> $sitemap_index


  # Recorre els fitxers html del directori i subdirectoris
  find $DIRECTORI -type f -name "*.html" -not -path "*mailto*" -not -path "* *" -not -path "*&*" | while read fitxer; do
     # Obtenir la URL relativa del fitxer
     url_relativa=${fitxer#$DIRECTORI/}
     # Afegir la URL al sitemap.xml
     echo "  <url>" >> $sitemap_file
     echo "    <loc>$URL_BASE/$url_relativa</loc>" >> $sitemap_file
     echo "    <lastmod>$current_date</lastmod>" >> $sitemap_file
     #echo "    <changefreq>monthly</changefreq>" >> $sitemap_file
     #echo "    <priority>0.5</priority>" >> $sitemap_file
     echo "  </url>" >> $sitemap_file

     # Increment the URL count
     ((url_count++))

     # If the URL count reaches the limit, create a new file
     if [ $url_count -ge 40000 ]; then
       # Close the current sitemap file
       echo '</urlset>' >> $sitemap_file

       # Next sitemap file	
       ((file_number++))
       echo ${file_number} > last_file_number
       url_count=0

       # Initialize the new sitemap file
       sitemap_file="sitemap_${file_number}.xml"
       echo '<?xml version="1.0" encoding="UTF-8"?>' > $sitemap_file
       echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">' >> $sitemap_file

       echo "  <sitemap>" >> $sitemap_index
       echo "    <loc>$URL_BASE/$sitemap_file</loc>" >> $sitemap_index
       echo "    <lastmod>$current_date</lastmod>" >> $sitemap_index
       #echo "    <changefreq>monthly</changefreq>" >> $sitemap_index
       echo "  </sitemap>" >> $sitemap_index
     fi
  done

  # Close the last sitemap file
  echo '</sitemapindex>' >> $sitemap_index
  echo '</urlset>' >> sitemap_`cat last_file_number`.xml
  rm -f last_file_number

  cp $sitemap_index sitemap_index.xml

}

# Generar el sitemap.xml
generar_sitemap<
chown archivo.kaosenlared.net:archivo.kaosenlared.net *.xml

A ejecutarlo y mover los ficheros en el directorio donde se encuentra el sitio! :)

2 Comments

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.