Qu’est-ce qu’un sitemap XML ?

Un sitemap XML est un fichier qui vise à lister l’ensemble de vos urls importantes pour le SEO. Vous pouvez en créer plusieurs par thématique ou type de pages. Il existe certaines limitations concernant les sitemaps XML. Pour rappel, les voici :

  • un fichier peut lister jusqu’à 50.000 URL
  • un index de sitemaps peut lister jusqu’à 50.000 fichiers sitemaps (mais pas de fichier index de sitemaps)
  • vous pouvez envoyer jusqu’à 500 fichiers d’index de sitemaps pour chaque site
  • une fois décompressé (car vous pouvez l’envoyer compressé), le fichier ne doit pas dépasser 50 Mo (52 428 800 octets). Pour information, cette limite de 50 Mo date de novembre 2016, avant c’était 10 Mo

source : Webrankinfo

De nombreux outils permettent de générer des sitemaps XML mais ils souvent souvent limités ou peu flexibles. Je vous propose aujourd’hui de voir comment il est possible de créer un sitemap XML via Python.

Découvrez aussi notre article pour crawler des sitemaps avec R

Script Python pour créer un sitemap XML

Avant de mettre les main dans le code, assurez-vous d’avoir la liste de vos urls. Comment faire ? Pour récupérer la liste de vos urls, utilisez un crawler. Il en existe plusieurs sur le marché : screaming frog (gratuit jusqu’à 500 urls) ou encore seolyzer (gratuit jusqu’à 10 000 urls). Sinon si vous souhaitez le faire vous même voici un tuto pour crawler son votre site avec R et RCrawler.

Quian

Etapes n°1 : Chargez les librairies

import pandas as pd
import os
import datetime 
from jinja2 import Template
import gzip

Etapes n°2: Charger votre liste d’urls

list_of_urls = pd.read_csv('list_of_urls.csv', sep=";")
list_of_urls

Etapes n°3: Préparer le(s) fichier(s)

# Set-Up Maximum Number of URLs (recommended max 50,000)
n = 50000
 
# Create New Empty Row to Store the Splitted File Number
list_of_urls.loc[:,'name'] = ''
 
# Split the file with the maximum number of rows specified
new_df = [list_of_urls[i:i+n] for i in range(0,list_of_urls.shape[0],n)]
 
# For Each File Created, add a file number to a new column of the dataframe
for i,v in enumerate(new_df):
    v.loc[:,'name'] = str(v.iloc[0,1])+'_'+str(i)
    print(v)

Etapes n°4: Créer le template du / des fichier(s)

           
# Create a Sitemap Template to Populate
 
sitemap_template='''<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    {% for page in pages %}
    <url>
        <loc>{{page[1]|safe}}</loc>
        <lastmod>{{page[3]}}</lastmod>
        <changefreq>{{page[4]}}</changefreq>
        <priority>{{page[5]}}</priority>        
    </url>
    {% endfor %}
</urlset>'''
 
template = Template(sitemap_template)
 
# Get Today's Date to add as Lastmod
lastmod_date = datetime.datetime.now().strftime('%Y-%m-%d')

Etapes n°5: Lancer la création de vos sitemaps

# Fill the Sitemap Template and Write File
for i in new_df:                           # For each URL in the list of URLs ...                                                          
    i.loc[:,'lastmod'] = lastmod_date      # ... add Lastmod date
    i.loc[:,'changefreq'] = 'daily'        # ... add changefreq
    i.loc[:,'priority'] = '1.0'            # ... add priority 
 
    # Render each row / column in the sitemap
    sitemap_output = template.render(pages = i.itertuples()) 
     
    # Create a filename for each sitemap like: sitemap_0.xml.gz, sitemap_1.xml.gz, etc.
    filename = 'sitemap' + str(i.iloc[0,1]) + '.xml.gz'
 
    # Write the File to Your Working Folder
    with gzip.open(filename, 'wt') as f:   
        f.write(sitemap_output)

Code complet  🤙

import pandas as pd
import os
import datetime 
from jinja2 import Template
import gzip
 
# Import List of URLs
list_of_urls = pd.read_csv('list_of_urls.csv')
list_of_urls
 
 
# Set-Up Maximum Number of URLs (recommended max 50,000)
n = 50000
 
# Create New Empty Row to Store the Splitted File Number
list_of_urls.loc[:,'name'] = ''
 
# Split the file with the maximum number of rows specified
new_df = [list_of_urls[i:i+n] for i in range(0,list_of_urls.shape[0],n)]
 
# For Each File Created, add a file number to a new column of the dataframe
for i,v in enumerate(new_df):
    v.loc[:,'name'] = str(v.iloc[0,1])+'_'+str(i)
    print(v)
             
# Create a Sitemap Template to Populate
 
sitemap_template='''<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    {% for page in pages %}
    <url>
        <loc>{{page[1]|safe}}</loc>
        <lastmod>{{page[3]}}</lastmod>
        <changefreq>{{page[4]}}</changefreq>
        <priority>{{page[5]}}</priority>        
    </url>
    {% endfor %}
</urlset>'''
 
template = Template(sitemap_template)
 
# Get Today's Date to add as Lastmod
lastmod_date = datetime.datetime.now().strftime('%Y-%m-%d')
 
# Fill the Sitemap Template and Write File
for i in new_df:                           # For each URL in the list of URLs ...                                                          
    i.loc[:,'lastmod'] = lastmod_date      # ... add Lastmod date
    i.loc[:,'changefreq'] = 'daily'        # ... add changefreq
    i.loc[:,'priority'] = '1.0'            # ... add priority 
 
    # Render each row / column in the sitemap
    sitemap_output = template.render(pages = i.itertuples()) 
     
    # Create a filename for each sitemap like: sitemap_0.xml.gz, sitemap_1.xml.gz, etc.
    filename = 'sitemap' + str(i.iloc[0,1]) + '.xml.gz'
 
    # Write the File to Your Working Folder
    with gzip.open(filename, 'wt') as f:   
        f.write(sitemap_output)