Python è il coltellino svizzero della SEO tecnica. Cinque righe di codice possono sostituire venti minuti di lavoro manuale a settimana. Ti mostro 5 script che uso davvero, testati a maggio 2026, pensati per marketer con basi minime di Python (sai cosa è pip install e una funzione). Niente magie: codice copiabile, commentato, eseguibile.
Cosa ti serve prima di iniziare
Una versione Python 3.10+ installata (basta scrivere python3 --version nel terminale). Le librerie qui sotto si installano con un’unica riga:
pip install requests beautifulsoup4 lxml pandas scikit-learn python-dotenv tldextract
Se non hai mai usato pip o sei su Windows: ti consiglio l’installazione via uv di Astral, che gestisce ambienti virtuali in modo veloce. Comunque per i 5 script qui sotto basta anche pip standard.
Script 1: audit broken links di un sito
Scansiona tutti i link interni della homepage, segue ogni URL fino a 2 hop, segnala i 404 e 500. Utile in cantieri WordPress dopo un cambio permalink o una migrazione hosting.
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import time
START_URL = "https://rblog.it"
MAX_PAGES = 100
TIMEOUT = 10
visited = set()
to_visit = [START_URL]
broken = []
domain = urlparse(START_URL).netloc
while to_visit and len(visited) < MAX_PAGES:
url = to_visit.pop(0)
if url in visited:
continue
visited.add(url)
try:
r = requests.get(url, timeout=TIMEOUT, allow_redirects=True)
if r.status_code >= 400:
broken.append((url, r.status_code))
continue
soup = BeautifulSoup(r.text, "lxml")
for a in soup.find_all("a", href=True):
link = urljoin(url, a["href"]).split("#")[0]
if urlparse(link).netloc == domain and link not in visited:
to_visit.append(link)
time.sleep(0.3)
except Exception as e:
broken.append((url, str(e)))
print(f"Scansionate {len(visited)} URL")
for u, code in broken:
print(f" BROKEN [{code}] {u}")
Output tipico su un sito piccolo: 30-50 URL controllati in 20 secondi. Se hai 1.000 pagine, alza MAX_PAGES e aspetta. Per siti più grossi consiglio Screaming Frog (gratis fino a 500 URL) o sitebulb.
Script 2: estrazione dati da Google Search Console via API
GSC ha rate limit fastidiosi sui report grossi. Lo script qui sotto pesca tutte le query con click negli ultimi 90 giorni di un sito e le salva in CSV. Richiede credenziali OAuth (le configuri una volta nel pannello Google Cloud).
from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
import pandas as pd
from datetime import date, timedelta
# Auth: scarica client_secret.json da console.cloud.google.com
SITE = "sc-domain:rblog.it" # o "https://rblog.it/" se non sei in Domain Property
creds = Credentials.from_authorized_user_file("token.json")
service = build("searchconsole", "v1", credentials=creds)
end = date.today()
start = end - timedelta(days=90)
request = {
"startDate": start.isoformat(),
"endDate": end.isoformat(),
"dimensions": ["query"],
"rowLimit": 25000,
}
resp = service.searchanalytics().query(siteUrl=SITE, body=request).execute()
rows = resp.get("rows", [])
df = pd.DataFrame([{
"query": r["keys"][0],
"clicks": r["clicks"],
"impressions": r["impressions"],
"ctr": r["ctr"],
"position": r["position"]
} for r in rows])
df.to_csv(f"gsc_queries_{end.isoformat()}.csv", index=False)
print(f"Estratte {len(df)} query")
Lo script trasforma un report che richiede 4-5 minuti via interfaccia in 20 secondi via codice. Aggiungilo a un cron settimanale e ti costruisci una serie storica delle query in CSV senza più toccare GSC.
Script 3: keyword clustering semantico
Hai 500 keyword esportate da Ahrefs o Ubersuggest e non sai come raggrupparle? Lo script qui sotto le clusterizza con TF-IDF + k-means. Niente embedding OpenAI, niente costi: scikit-learn fa tutto in locale.
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
# CSV con colonna "keyword"
df = pd.read_csv("keywords.csv")
texts = df["keyword"].astype(str).tolist()
vectorizer = TfidfVectorizer(
ngram_range=(1, 2),
max_features=2000,
stop_words=None # per italiano lascia None o usa lista custom
)
X = vectorizer.fit_transform(texts)
N_CLUSTERS = 15 # cambia in base al volume
km = KMeans(n_clusters=N_CLUSTERS, random_state=42, n_init=10)
labels = km.fit_predict(X)
df["cluster"] = labels
# Top 5 termini per cluster (etichetta umana)
terms = vectorizer.get_feature_names_out()
for i in range(N_CLUSTERS):
centroid = km.cluster_centers_[i]
top = centroid.argsort()[-5:][::-1]
print(f"Cluster {i}: {[terms[t] for t in top]}")
df.to_csv("keywords_clustered.csv", index=False)
Tempo di esecuzione: 2-3 secondi per 500 keyword. Il cluster output non è perfetto, ma è il punto di partenza per dare etichette manuali in 10 minuti invece che ragionare a freddo. Per dataset più grandi (5.000+ keyword), prova sentence-transformers + HDBSCAN.
Script 4: generazione sitemap XML da una lista URL
Hai migrato un sito a mano e ti serve una sitemap pulita? In 15 righe la generi:
from datetime import datetime
URLS = [
{"loc": "https://rblog.it/", "priority": "1.0", "changefreq": "weekly"},
{"loc": "https://rblog.it/seo/sge/", "priority": "0.8", "changefreq": "monthly"},
# ... aggiungi le tue URL
]
today = datetime.now().strftime("%Y-%m-%d")
xml = ['<?xml version="1.0" encoding="UTF-8"?>']
xml.append('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">')
for u in URLS:
xml.append(f""" <url>
<loc>{u['loc']}</loc>
<lastmod>{today}</lastmod>
<changefreq>{u['changefreq']}</changefreq>
<priority>{u['priority']}</priority>
</url>""")
xml.append("</urlset>")
with open("sitemap.xml", "w", encoding="utf-8") as f:
f.write("\n".join(xml))
print("sitemap.xml generata")
Su WordPress di solito sitemap esistenti vanno bene (Yoast, RankMath, plugin XML Sitemap generano in automatico). Questo script serve quando lavori su siti statici, HTML puro, o quando devi forzare priorità diverse per sezione.
Script 5: monitor posizioni keyword su Google (no API a pagamento)
Lo script chiama Google Custom Search (gratis fino a 100 query al giorno) e ti dice in che posizione è il tuo dominio per 20 keyword scelte. È un sostituto del rank tracker per chi non vuole pagare 80€/mese di SEMrush.
import requests, time
from dotenv import load_dotenv
import os
load_dotenv()
API_KEY = os.getenv("GOOGLE_CSE_KEY")
CSE_ID = os.getenv("GOOGLE_CSE_ID") # configurato per cercare in tutto il web
DOMAIN = "rblog.it"
KEYWORDS = [
"ai overviews seo",
"prompt engineering marketing",
"schema markup wordpress",
# ... la tua lista
]
def position_of(query, domain, max_results=50):
for start in range(1, max_results, 10):
r = requests.get(
"https://www.googleapis.com/customsearch/v1",
params={
"key": API_KEY,
"cx": CSE_ID,
"q": query,
"start": start,
"num": 10,
"gl": "it",
"hl": "it"
}
).json()
for i, item in enumerate(r.get("items", []), start=start):
if domain in item.get("link", ""):
return i
time.sleep(1)
return None
results = []
for kw in KEYWORDS:
pos = position_of(kw, DOMAIN)
print(f"{kw:50s} pos={pos}")
results.append({"keyword": kw, "position": pos})
import pandas as pd
pd.DataFrame(results).to_csv("rankings.csv", index=False)
Avvertenza: Google Custom Search non è identico alla SERP organica reale (l’algoritmo CSE ha varianti). Ti serve come trend tracker, non come misura assoluta. Per misure precise da campagna serve un tool dedicato.
Come automatizzare l’esecuzione
Una volta che hai i 5 script che ti servono, automatizzali. Tre opzioni in ordine di semplicità:
- Cron Linux: aggiungi
0 7 * * 1 /usr/bin/python3 /opt/scripts/audit.pyincrontab -ee lo script gira ogni lunedì alle 7:00 - GitHub Actions: workflow YAML con
schedule: cron: '0 7 * * 1'. Vantaggio: gira sui server di GitHub, non sul tuo PC. Limite: 2.000 min/mese gratis - Make o Zapier con webhook: hosti lo script su Replit/Render, lo richiami via webhook da Make. Comodo se hai già Make integrato in altri flow. Vedi la guida a Zapier
Personalmente uso GitHub Actions per i job settimanali. Costo zero, log automatici, notifica via email se qualcosa rompe.
Cosa NON automatizzare
Tre cose che vedo automatizzare a torto e che ti consiglio di tenere a mano:
Scrittura articoli: AI può aiutare nella prima bozza ma il prodotto finale richiede revisione umana. Non costruire pipeline “publish automatico da prompt” su siti che ti interessa proteggere. Vedi anche cosa cita davvero AI Overviews: contenuti AI puri non finiscono mai dentro.
Outreach link building: email automatiche di mass-outreach finiscono in spam e bruciano il dominio. Meglio 5 email a mano scritte bene che 500 generate.
Risposte a recensioni: i tool AI per rispondere su Google e TripAdvisor sembrano comodi, ma se non monitori la risposta umana finale ti ritrovi con tono robotico riconoscibile. Vedi la guida recensioni TripAdvisor.
FAQ SEO con Python
Devo saper programmare per usare questi script?
Serve sapere cos’è una variabile, una funzione, un import. Niente di più. Tutti gli script qui sopra si modificano cambiando solo le costanti in cima (URL, keyword, percorsi file). Per principianti totali consiglio il corso free di Python.org o uno dei video di Corey Schafer su YouTube.
Posso eseguire questi script gratis online?
Sì. Google Colab e Replit sono ambienti gratuiti dove incolli il codice e premi run. Per script con credenziali GSC consiglio Colab perché supporta i secrets in modo pulito.
Quale IDE conviene usare?
Per chi parte da zero: VS Code (gratis) con l’estensione Python di Microsoft. Per chi vuole un ambiente più strutturato: PyCharm Community (gratis). Per esecuzione veloce one-shot: notebook Jupyter su Colab.
Quanto tempo serve per imparare Python a questo livello?
Un weekend intensivo per i fondamentali. Due settimane per essere fluido con requests, BeautifulSoup, pandas. Dopo un mese di pratica quotidiana di mezz’ora, sei autonomo nel costruirti gli script che ti servono.
Posso vendere questi script come servizio?
Sì. Audit SEO automatizzati e dashboard custom sono uno dei deliverable più richiesti per le PMI. Prezzo medio italiano 2026: 200-600€ per setup script + ore di consulenza mensile per leggere i report.
Cosa fare ora
Scegli uno dei 5 script qui sopra che risolve un problema che hai oggi. Aprilo su Google Colab, sostituisci le costanti, premi run. Tempo totale: 15 minuti. Quando vedi il primo output corretto, hai risolto il problema mentale del “Python non è per me”. Il resto è ripetere il pattern su problemi diversi.
You might also like
More from SEO
Zero click search 2026: come monetizzare quando Google risponde da solo
Zero click search significa: l’utente cerca, Google risponde direttamente in SERP, l’utente NON clicca su alcun risultato. Nel 2026 con …
Sitemap XML WordPress: configurazione 2026
La sitemap XML è la mappa che dice a Google quali pagine del tuo sito esistono. Senza sitemap, Google scopre …
Robots.txt WordPress: esempi e configurazioni 2026
Il file robots.txt dice ai crawler quali parti del sito possono o non possono scansionare. Nel 2026 con la proliferazione …
Stai cercando un Growth Hacker o un esperto di web marketing? Cerchi un professionista in grado di migliorare le conversioni ed il traffico da Google e principali social network?
Molto probabilmente ti posso aiutare. 🙂






