🢂Budowa SEO przekierowań w Pythonie

Skrypt analizuje i grupuje adresy URL na podstawie ich ścieżek, następnie generuje i zapisuje do pliku CSV podsumowanie zawierające wzorce przekierowań oraz liczbę unikalnych ścieżek dla każdej grupy

Skrypt ten analizuje adresy URL pod kątem ich struktury, grupuje je na podstawie określonych segmentów ścieżek, a następnie generuje podsumowanie tych grup wraz z liczbą unikalnych ścieżek podsumowanie_przekierowan_{segment}.csv, które zostają zapisane do pliku CSV z użyciem średnika jako separatora.

#!/usr/bin/env python3

import csv
from collections import defaultdict
from urllib.parse import urlparse, unquote

# Tworzenie klucza grupy na podstawie wybranych segmentów ścieżki
segment = 5
# Plik wejściowy zawierający listę unikalnych adresów URL do analizy
plik_wejsciowy = 'adresy_url2.csv' 

# Plik docelowy, do którego zapisane zostaną wyniki analizy przekierowań
plik_wyjsciowy = f'podsumowanie_przekierowan_{segment}.csv'

# Użycie defaultdict do automatycznego tworzenia list dla nowych kluczy
grupy_url = defaultdict(list)

# Otwarcie pliku wejściowego i odczytanie każdego wiersza
with open(plik_wejsciowy, mode='r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        if row:  # Sprawdzenie, czy wiersz nie jest pusty
            # Dekodowanie URL, aby przekształcić znaki zakodowane procentowo na czytelny format
            url = unquote(row[0])
            # Analiza struktury URL, aby wyodrębnić ścieżkę
            parsed_url = urlparse(url)
            # Pobranie ścieżki z analizowanego URL
            sciezka = parsed_url.path

            klucz_grupy = '/'.join(sciezka.split('/')[:segment])  # [:segment] oznacza pobranie segmentu ścieżki
            # Dodawanie ścieżki do odpowiedniej grupy w słowniku
            grupy_url[klucz_grupy].append(sciezka)

# Sortowanie grup według liczby unikalnych wystąpień ścieżek w każdej z nich
posortowane_grupy = sorted(grupy_url.items(), key=lambda x: len(set(x[1])), reverse=True)


# Otwarcie pliku docelowego do zapisu i ustawienie średnika jako separatora pól
with open(plik_wyjsciowy, mode='w', encoding='utf-8', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=';')  # Ustawienie średnika jako separatora pól
    # Zapisanie nagłówka pliku CSV
    writer.writerow(["Wzorzec przekierowania", "Liczba unikalnych ścieżek w grupie", "Docelowy adres", "Reguła"])
    # Dla każdej grupy zapisanie informacji do pliku CSV
    for klucz_grupy, sciezki in posortowane_grupy:
        liczba_unikalnych_sciezek = len(set(sciezki))  # Obliczenie liczby unikalnych ścieżek
        # Zapisanie wiersza do pliku CSV z informacjami o grupie
        writer.writerow([f"^{klucz_grupy}/(.*)$", liczba_unikalnych_sciezek])

# Informacja o zakończeniu zapisu i nazwie pliku docelowego
print(f"Zapisano podsumowanie do pliku '{plik_wyjsciowy}'.")

Reguły dla .htaccess

Skrypt poniżej analizuje adresy URL z pliku wejściowego adresy_url2.csv, grupuje je według określonego segmentu ścieżki segment = 5, a następnie generuje reguły przekierowań dla serwera Apache, zapisując je do pliku o nazwie htaccess_rules.txt. Każda reguła przekierowania jest dopasowana do grupy adresów URL i wskazuje na nową ścieżkę, gdzie $1 oznacza dowolny ciąg pasujący do wzorca (.*?) pochodzący z oryginalnej ścieżki. W rzeczywistości, musisz dostosować docelowy_adres do swoich potrzeb, aby reguły przekierowań były poprawne i odzwierciedlały strukturę Twojej strony.

#!/usr/bin/env python3

import csv
from collections import defaultdict
from urllib.parse import urlparse, unquote

segment = 5
plik_wejsciowy = 'adresy_url2.csv'  # Plik wejściowy zawierający listę unikalnych adresów URL do analizy
plik_htaccess = f'htaccess_rules_{segment}.csv'  # Plik wyjściowy z regułami .htaccess

grupy_url = defaultdict(list)

with open(plik_wejsciowy, mode='r', encoding='utf-8') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        if row:
            url = unquote(row[0])
            parsed_url = urlparse(url)
            sciezka = parsed_url.path
            klucz_grupy = '/'.join(sciezka.split('/')[:segment])
            grupy_url[klucz_grupy].append(sciezka)

posortowane_grupy = sorted(grupy_url.items(), key=lambda x: len(set(x[1])), reverse=True)

# Tworzenie pliku .htaccess z regułami przekierowań
with open(plik_htaccess, mode='w', encoding='utf-8') as htaccess_file:
    htaccess_file.write("RewriteEngine On\n\n")  # Włączenie mechanizmu przekierowań
    id_counter = 1  # Inicjalizacja licznika do generowania unikalnych ID
    for klucz_grupy, _ in posortowane_grupy:
        # Dostosowanie docelowego adresu URL o unikalne ID
        docelowy_adres = f"/nowa/sciezka{id_counter}"  # Dostosuj bazowy adres URL, {id_counter} dodaje unikalne ID
        regula = f"RewriteRule ^{klucz_grupy}/(.*)$ {docelowy_adres}/$1 [R=301,L]\n"
        htaccess_file.write(regula)
        id_counter += 1  # Inkrementacja licznika po każdej regule

print(f"Zapisano reguły przekierowań do pliku '{plik_htaccess}' z unikalnymi ID.")

Filtrowanie wybranych adresów URL

Kod ten wczytuje dane z pliku CSV, przepuszcza je przez filtry wyrażeń regularnych, a następnie zapisuje wyniki do nowego pliku CSV. Oczywiście z wybranych adresów możesz zbudować przekierowania :)

#!/usr/bin/env python3

import pandas as pd
import re

# Ładujemy dane z pliku CSV do pandasa
def load_data(file_path):
    """Wczytuje dane z pliku CSV do pandasa"""
    return pd.read_csv(file_path)

# Filtrujemy adresy URL na podstawie zestawu regex
def filter_urls(df):
    """Filtruje adresy URL na podstawie zestawu regex"""
    # Zestaw regex dopasowujący kluczowe słowa związane z newsami i blogami
    blog_news_keywords = re.compile(r'\b(blog|news|post|article|event|update|story|wydarzenie)\b', re.IGNORECASE)
    # Zestaw regex dopasowujący słowa, które nie są związane z produktami lub PDFami
    exclude_keywords = re.compile(r'\b(product|pdf)\b', re.IGNORECASE)

    filtered_urls = []  # Lista z filtrowanymi adresami URL
    for url in df.iloc[:, 0]:  # Wykonujemy iterację po wszystkich URLach w pliku
        if blog_news_keywords.search(url) and not exclude_keywords.search(url):
            # Jeżeli URL pasuje do obu regex, to dodajemy go do listy filtrowanych adresów
            filtered_urls.append(url)

    return filtered_urls


# Zapisujemy dane do nowego pliku CSV
def save_to_csv(filtered_urls, output_file_path):
    """Zapisuje dane do nowego pliku CSV"""
    filtered_urls_df = pd.DataFrame(filtered_urls, columns=['URL'])  # Tworzymy DataFrame z filtrowanymi adresami URL
    filtered_urls_df.to_csv(output_file_path, index=False)  # Zapisujemy dane do pliku CSV


if __name__ == "__main__":
    file_path = 'adresy_url2.csv'  # Scieżka do pliku CSV z adresami URL
    output_file_path = 'news.csv'  # Scieżka do pliku CSV, do którego zapiszemy filtrowane adresy URL

    urls_data = load_data(file_path)  # Wczytujemy dane z pliku
    filtered_urls = filter_urls(urls_data)  # Filtrujemy adresy URL
    save_to_csv(filtered_urls, output_file_path)  # Zapisujemy dane do nowego pliku CSV

Skrypt do oczyszczania i zapisywania adresów URL z pliku CSV

Usuwamy niechciane adresy URL i zapisujemy oczyszczone dane do pliku CSV.

#!/usr/bin/env python3

import pandas as pd
import re

# Funkcja do wczytywania danych z pliku CSV
def load_data(file_path):
    # Wczytanie pliku CSV do DataFrame
    return pd.read_csv(file_path)

# Funkcja do usuwania adresów URL zawierających niedozwolone ciągi znaków
def remove_unwanted_urls(df):
    # Kompilacja wyrażenia regularnego do wyszukiwania niedozwolonych słów
    unwanted_keywords = re.compile(r'\b(product|produkty|produkt|products|uploads|pdf|svg|jpg)\b', re.IGNORECASE)

    cleaned_urls = []
    # Przejście przez wszystkie URL-e w DataFrame
    for url in df.iloc[:, 0]:
        # Dodanie URL-a do listy tylko jeśli nie zawiera niedozwolonych słów
        if not unwanted_keywords.search(url):
            cleaned_urls.append(url)

    return cleaned_urls

# Funkcja do zapisu oczyszczonych URL-i do nowego pliku CSV
def save_to_csv(cleaned_urls, output_file_path):
    # Utworzenie DataFrame z oczyszczonymi URL-ami
    cleaned_urls_df = pd.DataFrame(cleaned_urls, columns=['URL'])
    # Zapis DataFrame do pliku CSV
    cleaned_urls_df.to_csv(output_file_path, index=False)

# Główny przepływ wykonania skryptu
if __name__ == "__main__":
    file_path = 'adresy_url2.csv'
    output_file_path = 'cleaned_urls.csv'

    urls_data = load_data(file_path)  # Wczytanie danych
    cleaned_urls = remove_unwanted_urls(urls_data)  # Usuwanie niechcianych URL-i
    save_to_csv(cleaned_urls, output_file_path)  # Zapis do pliku CSV