Come risolvere gli errori di scansione Google … con Python!

Immagina di svegliarti una mattina e di trovare una brutta sorpresa nella Search Console: centinaia di errori di scansione Google sul tuo sito web (URL non trovati).

Come risolvere gli errori 404 su Google... con Python!

Per qualche motivo hai eliminato diverse pagine senza sostituirle con il corrispondente Redirect 301. Oppure ti sei fatto migrare l’e-commerce ma nessuno ti aveva avvisato che bisognava impostare una strategia per redirezionare i link dei prodotti dal vecchio al nuovo sito.

Immagina anche che tu debba sistemare velocemente questi errori in modo che Google possa assorbire i 404 più in fretta possibile.

Come fare?

Scrivere a mano i redirect? Può funzionare se sono 15, 20, 25. Ma se sono 300? O 1000?

Bisogna inventarsi qualche riga di codice che legga un file CSV e fornisca un risultato in uscita. E Python ha gli strumenti giusti per manipolare qualsiasi tipo di file senza grossi sforzi.

Python ha gli strumenti giusti per manipolare file CSV

L’obiettivo è quello di convertire una serie di URL come:

https://www.my-fancy-website.com/this-does-not-exists-anymore.jpeg

in un Redirect 301 da utilizzare nell’htaccess per Apache:

Redirect 301 /this-does-not-exists-anymore.jpeg /shop

In buona sostanza di tratta di processare l’URL di origine, dividerlo nelle varie componenti e creare qualcosa di completamente diverso.

Configurare il progetto

Da qui in avanti ci sporchiamo le mani con un pò di codice, con Python 3.6.

Ultimamente sto usando Pipenv per gestire gli ambienti virtuali Python. Per installarlo è sufficiente lanciare:

pip install pipenv --user

Poi per iniziare crea una directory per il progetto:

mkdir py-csv-to-301

e sempre all’interno della stessa, crea un file, main.pycon:

touch main.py

Abbiamo bisogno anche di un paio di directory che ospiteranno i file di input e di output:

mkdir -p {input,output}

ed infine di un ambiente virtuale per Python3.6. Per crearlo con Pipenv basta lanciare all’interno della directory del progetto:

pipenv --three

Ed ora un piccolo passo indietro.

Nella Search Console di Google, all’interno della sezione Stato attuale, cliccando sulla barra Errori di scansione troverai un elenco di URL.

Errori di scansione Google nella Search Console
Cliccando sulla barra “Errori di scansione” puoi avere accesso al download della lista

Questo elenco contiene gli errori di scansione Google che il motore di ricerca ha rilevato durante il passaggio sul tuo sito web/blog.

Gli errori possono dipendere dalle più svariate cause ma nella maggior parte dei casi si tratta di link e risorse che sono state eliminate o spostate.

Uso il codice per aiutare professionisti ed imprese a risolvere piccoli e grandi problemi. Se vuoi scoprire come posso aiutarti sentiamoci, senza nessun impegno da parte tua.

L’elenco degli errori di scansione può essere scaricato in formato CSV cliccando sul pulsante Download. Se apri il file vedrai qualcosa di simile a questo:

URL,Codice di risposta,Errore di News,Rilevato,Categoria,Piattaforma,Ultima scansione
https://www.valentinog.com/red-bike/index.html,404,,16/10/17,Non trovato,Desktop,16/10/17
https://www.valentinog.com/demo_replica/index.html,404,,17/10/17,Non trovato,Desktop,17/10/17
https://www.valentinog.com/laCompagnia/index.html,404,,16/10/17,Non trovato,Smartphone,16/10/17

Guardando il file è chiaro che hai bisogno di processare il CSV per estrarre la prima colonna, quella che contiene l’url.

Ora, ci sono decine di modi per lavorare con i file CSV. Basti pensare ad awk, a Node.js con il modulo csv-parse o a qualsiasi altro linguaggio di programmazione .

Python: leggere e manipolare un file CSV

Fortunatamente Python nasce con una libreria standard per l’interazione con i file CSV: il modulo csv

Non è necessario installare nulla, il modulo è già incluso ed è sufficiente importarlo all’interno dello script.

Apri il file che hai creato prima, main.pyed aggiungi l’istruzione di import:

import csv

A questo proposito ricordati di copiare all’interno di ./input/urlListRaw.csv la lista degli URL che hai scaricato da Google (meno la prima riga che contiene il titolo delle colonne).

Nell’esempio che segue, il file conterrà:

https://www.valentinog.com/red-bike/index.html,404,,16/10/17,Non trovato,Desktop,16/10/17
https://www.valentinog.com/demo_replica/index.html,404,,17/10/17,Non trovato,Desktop,17/10/17
https://www.valentinog.com/laCompagnia/index.html,404,,16/10/17,Non trovato,Smartphone,16/10/17

Probabilmente una lista così piccola non rende l’idea di quanto possa essere utile trasformare centinaia di righe in un colpo solo. Alzi la mano chi non ha iniziato la propria carriera di specialista SEO copia-incollando i link in Excel.

L’esempio che sto illustrando parte da 3 semplici link ma nella realtà lo script mi ha aiutato a convertire un file CSV che ne conteneva 40.

Venendo al codice, ora abbiamo bisogno di una funzione che legga ./input/urlListRaw.csv e lo trasformi in qualcosa che può essere processato in seguito.

All’interno di main.pyaggiungi:

csv_file_to_read = './input/urlListRaw.csv'
csv_delimiter = ','


def parseCsv(file_to_read, csv_delimiter):
    with open(file_to_read) as csvfile:
        rows = csv.reader(csvfile, delimiter=csv_delimiter)
        for row in rows:
            print(row)


parseCsv(csv_file_to_read, csv_delimiter)

La funzione parseCsvutilizza il modulo csv per analizzare il nostro file:  come risultato, ogni riga del file verrà trasformata in una lista Python.

Lanciando infatti lo script con:

python main.py

dovresti vedere il risultato della trasformazione:

['https://www.valentinog.com/red-bike/index.html', '404', '', '16/10/17', 'Non trovato', 'Desktop', '16/10/17']
['https://www.valentinog.com/demo_replica/index.html', '404', '', '17/10/17', 'Non trovato', 'Desktop', '17/10/17']
['https://www.valentinog.com/laCompagnia/index.html', '404', '', '16/10/17', 'Non trovato', 'Smartphone', '16/10/17']

Curiosità: in Python, una lista è l’equivalente di un array Javascript

Ora a partire da ogni lista possiamo estrarre l’url. Sappiamo che è possibile accedere agli elementi di una lista Python attraverso un indice, che inizia da zero.

Python: scomporre un URL ed estrarre il path

La funzione parseCsvha bisogno di un refactoring: al momento stampa semplicemente sulla console ma questo non è di grande utilità. La funzione dovrebbe infatti costruire un Redirect 301 per ogni URL.

Ma come facciamo ad estrarre il percorso (path) da un URL completo?

Anche qui Python mette a disposizione un modulo indispensabile per manipolare gli URL: urllib.parse

A partire da un URL, urllib.parse ritorna una tupla che contiene 6 elementi.

Quello che ci interessa ora è .path: l’attributo della tupla che contiene il percorso dell’URL.

Nel caso di:

https://www.valentinog.com/red-bike/index.html

il percorso dell’URL sarà:

/red-bike/index.html

esattamente quello che serve per costruire il Redirect 301.

Il nostro script può essere quindi esteso, prima importando il nuovo modulo in testa al file:

from urllib.parse import urlparse

e poi facendo un piccolo refactoring. Alla fine avremo:

import csv
from urllib.parse import urlparse

csv_file_to_read = './input/urlListRaw.csv'
csv_delimiter = ','


def parseCsv(file_to_read, csv_delimiter):
    with open(file_to_read) as csvfile:
        rows = csv.reader(csvfile, delimiter=csv_delimiter)
        for row in rows:
            url = urlparse(row[0])
            redirect = '{} {} {}{}'.format('Redirect 301', url.path, 'index.html', '\n')
            print(redirect)


parseCsv(csv_file_to_read, csv_delimiter)

Ora, la funzione qui sopra è molto generica, ovvero ogni url in entrata viene associato ad un redirect su index.html. La realtà è molto più complessa: molto spesso ogni risorsa deve essere redirezionata verso una pagina che non è la stessa per tutti i link.

In ogni caso si tratta di un buon punto di partenza.

Errori di scansione Google: generare i redirect

Al momento il nostro piccolo script Python stampa banalmente il risultato sulla console.

Lanciando infatti lo script con:

python main.py

dovresti vedere la lista dei redirect sulla console:

Redirect 301 /red-bike/index.html /index.html
Redirect 301 /demo_replica/index.html /index.html
Redirect 301 /laCompagnia/index.html /index.html

A questo punto potresti anche fare semplicemente un copia/incolla dei redirect, ma per rendere il nostro codice ancora più utile possiamo pensare di scrivere la lista su un file.

Niente di più semplice. Sempre all’interno di main.pyapriamo un file in scrittura:

file = open('./output/output.txt', 'w')

ed aggiungiamo alcune istruzioni all’interno del ciclo for, per scrivere ogni redirect all’interno del file. Alla fine il file deve inoltre essere chiuso con file.close().

Il codice completo:

import csv
from urllib.parse import urlparse

csv_file_to_read = './input/urlListRaw.csv'
csv_delimiter = ','
file = open('./output/output.txt', 'w')


def parseCsv(file_to_read, csv_delimiter):
    with open(file_to_read) as csvfile:
        rows = csv.reader(csvfile, delimiter=csv_delimiter)
        for row in rows:
            url = urlparse(row[0])
            redirect = '{} {} {}{}'.format('Redirect 301', url.path, '/index.html', '\n')
            file.write(redirect)
        file.close()


parseCsv(csv_file_to_read, csv_delimiter)

Ora basta lanciare ancora una volta lo script:

python main.py

e dare un occhio all’interno di ./output/output.txt:

Redirect 301 /red-bike/index.html /index.html
Redirect 301 /demo_replica/index.html /index.html
Redirect 301 /laCompagnia/index.html /index.html

Ora gli errori di scansione Google possono essere finalmente corretti aggiungendo all’interno dell’htaccess i Redirect 301 che hai appena ottenuto.

L’htaccess è un particolare file che contiene una serie di direttive per il web server Apache.

Quasi tutti i CMS utilizzano un file htaccess per istruire il web server su eventuali redirect o rewrite da eseguire.

Per esempio:

<IfModule mod_rewrite.c>
Redirect 301 /red-bike/index.html /index.html
Redirect 301 /demo_replica/index.html /index.html
Redirect 301 /laCompagnia/index.html /index.html
<IfModule>

NOTA: le direttive qui sopra sono riportate solo a titolo di esempio e fanno capo al mio sito web, non utilizzarle altrove

A questo punto ti starai chiedendo: qual’è il risultato del lavoro?

La risposta è zero errori di scansione Google, che significa anche link recuperati a tutto vantaggio per il tuo sito web:

Errori di scansione Google risolti
Fare in modo che non ci siano errori di scansione Google è fondamentale per il posizionamento del tuo sito web

Ora che abbiamo la nostra lista di redirect ed un cliente contento per il risultato potremmo anche fermarci qui.

Ma se ci pensi, lo script può essere esteso con alcune utili funzionalità aggiuntive. Oppure, una buona idea potrebbe essere quella di testare che i redirect funzionino: scivendo un piccolo test E2E con Axios e Jest ad esempio.

Grazie per aver letto fin qui!

Alla prossima!

Photo Credit: https://unsplash.com/@ikukevk

Valentino Gagliardi

Valentino Gagliardi

Web Developer & IT Consultant, with over 10 year of experience, I'm here to help you developing your next idea.
Valentino Gagliardi

One Reply to “Come risolvere gli errori di scansione Google … con Python!”

Leave a Reply

Your email address will not be published. Required fields are marked *