Dies ist eine alte Version des Dokuments!


Ein Crawler ist ein Programm, das automatisiert Inhalte aus dem Internet oder aus anderen digitalen Quellen durchsucht. Ziel ist es, Informationen systematisch zu erfassen, zu analysieren und für weitere Zwecke bereitzustellen. Crawler werden häufig von Suchmaschinen, Monitoring-Systemen, Data-Mining-Anwendungen und Web-Archiven eingesetzt.

Ein Crawler beginnt meist mit einer Liste von Startadressen, den sogenannten Seeds. Von dort ruft er Dokumente ab, liest deren Inhalte und extrahiert weitere Verweise, die anschließend ebenfalls besucht werden. Auf diese Weise bewegt sich der Crawler schrittweise durch ein Netz aus verlinkten Ressourcen.

Der Ablauf besteht typischerweise aus folgenden Schritten:

  • Abruf einer Seite oder Ressource
  • Analyse des Inhalts
  • Extraktion von Links oder Metadaten
  • Speicherung der gefundenen Informationen
  • Aufnahme neuer Ziele in eine Warteschlange

Dieses Verfahren wird wiederholt, bis definierte Grenzen erreicht sind, etwa eine maximale Anzahl von Seiten, eine bestimmte Tiefe oder ein Zeitlimit.

import requests
from urllib.parse import urljoin, urlparse, urldefrag, parse_qs
from bs4 import BeautifulSoup
 
# Liste unerwünschter Query-Parameter und Dateiendungen
blocked_query_params = ['to','show','last','login','register','sort','start','by']
blocked_extensions = ['.pdf', '.jpg', '.png', '.zip', '.exe']
 
def is_blocked_url(url):
    """
    Diese Funktion prüft, ob eine URL unerwünschte Query-Parameter oder Dateiendungen enthält.
    """
    # URL parsen
    parsed_url = urlparse(url)
 
    # Prüfen auf unerwünschte Query-Parameter
    query_params = parse_qs(parsed_url.query)
    for param in query_params:
        if param in blocked_query_params:
            return True
 
    # Prüfen auf unerwünschte Dateiendungen
    if any(url.endswith(ext) for ext in blocked_extensions):
        return True
 
    return False
 
def crawl(start_url, base_url):
    """
    Diese Funktion crawlt die angegebene URL, extrahiert Links und verarbeitet sie.
    """
    visited_urls = set()
    queue = [start_url]
 
    while queue:
        current_url = queue.pop(0)
        if current_url in visited_urls:
            continue
 
        # URL parsen und fragment entfernen
        full_url, _ = urldefrag(current_url)
 
        #print(f"Testing {full_url}")
        # Filtern der unerwünschten URLs
        if is_blocked_url(full_url):
            #print(f"Skipping blocked URL: {full_url}")
            continue
 
        # Markiere die URL als besucht
        visited_urls.add(full_url)
 
        print(f"Processing URL: {full_url}")
 
        # Hole die HTML-Seite
        try:
            response = requests.get(full_url)
            if response.status_code != 200:
                print(f"Failed to fetch {full_url}: {response.status_code}")
                continue
 
            page_content = response.text
            soup = BeautifulSoup(page_content, 'html.parser')
 
            # Finde alle Links auf der Seite
            a_links = soup.find_all('a', href=True)
 
            # Verarbeite die Links
            for link in a_links:
                href = link.get('href')
                if href:
                    # Absolute URL erstellen
                    next_url = urljoin(base_url, href)
                    if next_url not in visited_urls:
                        #print(f'    Adding {next_url} to the queue')
                        queue.append(next_url)
 
        except requests.RequestException as e:
            print(f"Error fetching {full_url}: {e}")
 
    print(f"Visited {len(visited_urls)} URLs.")
 
# Start URL und Basis-URL für den Crawl-Prozess
start_url = 'https://codehelper.lima-city.at'  # Ändere dies auf die Start-URL
base_url = start_url  # Die Basis-URL für die relativen Links
 
# Crawlen der Seite
crawl(start_url, base_url)