Analyse von Webserver-Protokollen auf Bot-Verkehr mit Python

Einführung

Das Verständnis des Bot-Verkehrs ist wichtig für die Optimierung der Website-Leistung, die Verbesserung der Sicherheit und die Verbesserung der SEO-Strategie. Dieses Projekt bietet ein Python-Skript zur Analyse von Webserver-Protokollen und zur Kategorisierung des Bot-Traffics, wobei der Schwerpunkt auf Suchmaschinen-Crawlern liegt. Es nutzt die Pandas-Bibliothek für die Datenmanipulation und -analyse.

Warum den Bot-Verkehr analysieren?

Bot-Traffic spielt eine wichtige Rolle bei der Indizierung Ihrer Website, aber übermäßige oder böswillige Bot-Aktivitäten können die Leistung negativ beeinflussen. Dieses Skript hilft Ihnen:

  • Identifizieren Sie verschiedene Arten von Bots, die auf Ihre Website zugreifen.
  • Analysieren Sie ihr Verhalten.
  • Ergreifen Sie geeignete Maßnahmen auf der Grundlage Ihrer Erkenntnisse

Erste Schritte

Voraussetzungen

  • Python 3.7 oder höher.
  • Webserver-Protokolldateien, die in einem Logs-Verzeichnis im Stammverzeichnis des Projekts gespeichert werden.
  • Die Protokolldateien müssen einem Standardformat folgen (z. B. Combined Log Format)..

Konfigurieren des Skripts

Ändern Sie die log_files-Liste im if name == „main“: Block, um Ihre Protokolldateien anzugeben:

if __name__ == "__main__":
    log_files = ["logs/your_log_file.log", "logs/another_log_file.log"]  # Add your log file paths
    df = analyze_logs(log_files)
    summarize_analysis(df)

Code-Struktur und Erläuterung

Das Skript ist in Schlüsselfunktionen unterteilt:

Hilfsfunktionen

is_google_ip(ip)

  • Zweck: Überprüft, ob eine IP zum Crawler-Netzwerk von Google gehört.
  • Implementierung: Verwendet ipaddress, um zu überprüfen, ob die IP in die dem Googlebot bekannten Bereiche fällt.
import ipaddress

def is_google_ip(ip):
    try:
        google_ranges = [
            "66.249.64.0/19", "66.249.80.0/20", "64.233.160.0/19", "216.239.32.0/19",
            "2001:4860:4801::/48", "2404:6800:4003::/48", "2607:f8b0:4003::/48", "2800:3f0:4003::/48"
        ]
        ip_obj = ipaddress.ip_address(ip)
        return any(ip_obj in ipaddress.ip_network(net) for net in google_ranges)
    except:
        return False

Kennung der Suchmaschine

  • Zweck: Identifiziert die Suchmaschine auf der Grundlage der User-Agent-Zeichenfolge.
  • Implementierung: Verwendet reguläre Ausdrücke, um bekannte Bot-Muster abzugleichen.
import re

def identify_search_engine(user_agent):
    search_engines = {
        'Google': ['Googlebot', 'AdsBot-Google'],
        'Bing': ['bingbot'],
        'DuckDuckGo': ['DuckDuckBot'],
        'Yandex': ['YandexBot']
    }
    for engine, patterns in search_engines.items():
        if any(re.search(pattern, user_agent, re.IGNORECASE) for pattern in patterns):
            return engine
    return 'Other'

2. Hauptanalyse-Funktion

analyze_logs(log_files)

  • Zweck: Parst Webserver-Protokolle, um wichtige Informationen wie IP-Adressen, Zeitstempel, URLs, Benutzeragenten zu extrahieren und Suchmaschinen-Bots zu identifizieren.
  • Implementierung: Die Funktion liest die Protokolle Zeile für Zeile, extrahiert relevante Daten mithilfe von regulären Ausdrücken und klassifiziert Suchmaschinen-Bots basierend auf Benutzeragenten.
import pandas as pd

def analyze_logs(log_files):
    records = []
    for log_file in log_files:
        with open(log_file, 'r') as f:
            for line in f:
                pattern = r'(d+.d+.d+.d+).*?[(.*?)].*?"(w+) (.*?) HTTP.*?" (d+) .*?"(.*?)" "(.*?)"'
                match = re.search(pattern, line)
                if match:
                    ip, datetime, method, url, status, referer, user_agent = match.groups()
                    search_engine = identify_search_engine(user_agent)
                    records.append({
                        'ip': ip, 'datetime': datetime, 'method': method,
                        'url': url, 'status': int(status), 'referer': referer,
                        'user_agent': user_agent, 'search_engine': search_engine
                    })
    df = pd.DataFrame(records)
    if not df.empty:
        df['datetime'] = pd.to_datetime(df['datetime'], format="%d/%b/%Y:%H:%M:%S", errors='coerce')
    return df

3. Zusammenfassung und Ausgabetion and Output

summarize_analysis(df)

  • Zweck: Gibt eine hochrangige Zusammenfassung der Suchmaschinen-Bot-Aktivitäten aus.
    python
def summarize_analysis(df):
    if df.empty:
        print("No data to summarize.")
        return
    print("n--- Summary of Log Analysis ---")
    print("nTop Search Engines:")
    print(df['search_engine'].value_counts())

4. Hauptausführung

  • Purpose: Runs the analysis workflow.
if __name__ == "__main__":
    log_files = ["logs/your_log_file.log"]
    df = analyze_logs(log_files)
    summarize_analysis(df)

Skript ausführen

  1. Öffne ein Terminal.
  2. Navigiere zum Projektverzeichnis.
  3. Führe den Befehl aus: python analyze_logs.py

Erweiterung des Skripts

Hier sind einige Möglichkeiten, das Skript zu verbessern:

  • Detailliertere Analyse: Berechne Statuscode-Verteilungen pro Suchmaschine und identifiziere die am häufigsten gecrawlten Seiten von verschiedenen Bots.
  • Datenvisualisierung: Verwende matplotlib und seaborn, um Erkenntnisse durch Diagramme zu generieren.
  • GeoIP-Analyse: Integriere eine GeoIP-Bibliothek, um die Standorte von Bots zu verfolgen.
  • Erweiterte Bot-Erkennung: Analysiere Anfrage-Muster und erkenne Anomalien in Benutzeragenten.
  • Datenbank-Integration: Speichere die geparsten Logdaten in einer SQLite- oder PostgreSQL-Datenbank für effiziente Abfragen.

Fazit

Dieses Python-Skript bietet eine leistungsstarke Möglichkeit, Bot-Traffic aus Webserver-Protokollen zu analysieren. Durch die Identifizierung und Kategorisierung von Suchmaschinen-Bots hilft es Webmastern, SEO-Strategien und die Website-Leistung zu optimieren. Mit weiteren Erweiterungen kann es als robustes Werkzeug für tiefere Traffic-Analysen dienen.

Sie können den vollständigen Code  hier finden.