92 lines
3.6 KiB
Python
92 lines
3.6 KiB
Python
import requests
|
|
from bs4 import BeautifulSoup
|
|
import json
|
|
from urllib.parse import urlparse, urljoin
|
|
|
|
|
|
def get_internal_links_pointing_to_pages(sitemap_url):
|
|
"""
|
|
Analizza una sitemap e restituisce un JSON con i link interni che
|
|
puntano a ciascuna pagina web del sito.
|
|
|
|
Args:
|
|
sitemap_url (str): L'URL della sitemap del sito (es. "https://example.com/sitemap.xml").
|
|
|
|
Returns:
|
|
str: Una stringa JSON con il formato:
|
|
{
|
|
"pagina_url_1": ["link_referrer_1", "link_referrer_2", ...],
|
|
"pagina_url_2": ["link_referrer_3", ...],
|
|
...
|
|
}
|
|
Restituisce una stringa JSON vuota ({}) in caso di errori critici o assenza di dati.
|
|
"""
|
|
site_pages = []
|
|
try:
|
|
response = requests.get(sitemap_url)
|
|
response.raise_for_status() # Solleva un'eccezione per risposte HTTP errate (4xx o 5xx)
|
|
soup = BeautifulSoup(response.content, "xml")
|
|
for loc in soup.find_all("loc"):
|
|
if "post/2" in loc.text:
|
|
site_pages.append(loc.text)
|
|
except requests.exceptions.RequestException as e:
|
|
print(f"Errore nello scaricare o analizzare la sitemap: {e}")
|
|
return json.dumps({}) # Ritorna un JSON vuoto in caso di errore sitemap
|
|
|
|
if not site_pages:
|
|
print("Nessuna URL trovata nella sitemap.")
|
|
return json.dumps({}) # Ritorna un JSON vuoto se la sitemap è vuota
|
|
|
|
base_url = urlparse(sitemap_url).scheme + "://" + urlparse(sitemap_url).netloc
|
|
|
|
# Inizializza il dizionario per memorizzare i link che puntano a ciascuna pagina
|
|
page_referrers = {page: [] for page in site_pages}
|
|
|
|
for page_url in site_pages:
|
|
print(f"Analizzando: {page_url}")
|
|
try:
|
|
page_response = requests.get(page_url)
|
|
page_response.raise_for_status()
|
|
page_soup = BeautifulSoup(page_response.content, "html.parser")
|
|
|
|
for link in page_soup.find_all(
|
|
"a", {"class": "interlink-script"}, href=True
|
|
):
|
|
href = link.get("href")
|
|
absolute_href = urljoin(page_url, href)
|
|
parsed_absolute_href = urlparse(absolute_href)
|
|
|
|
# Controlla se il link è interno al dominio e se è una delle pagine del sito
|
|
if (
|
|
parsed_absolute_href.netloc == urlparse(base_url).netloc
|
|
and absolute_href in site_pages
|
|
):
|
|
# Aggiunge il page_url (la pagina che contiene il link) all'elenco dei referrer
|
|
if page_url not in page_referrers[absolute_href]:
|
|
page_referrers[absolute_href].append(page_url)
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
print(f"Errore nello scaricare o analizzare la pagina {page_url}: {e}")
|
|
continue
|
|
except Exception as e:
|
|
print(f"Errore generico durante l'analisi di {page_url}: {e}")
|
|
continue
|
|
|
|
return json.dumps(page_referrers, indent=4)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Sostituisci con l'URL della sitemap del sito che vuoi analizzare
|
|
sitemap_url_to_analyze = "https://fundor333.com/sitemap.xml" # Esempio
|
|
|
|
print(f"Inizio dell'analisi della sitemap: {sitemap_url_to_analyze}")
|
|
result_json = get_internal_links_pointing_to_pages(sitemap_url_to_analyze)
|
|
|
|
print("\n--- Risultato JSON ---")
|
|
print(result_json)
|
|
|
|
# Puoi anche salvare il risultato in un file per un uso successivo
|
|
# with open("internal_links.json", "w") as f:
|
|
# f.write(result_json)
|
|
# print("\nRisultato salvato in internal_links.json")
|