Zum Inhalt springen
Zurück zum Blog

So verwenden Sie GoSpider: Crawlen, URLs bereinigen und Daten extrahieren

Suciu DanZuletzt aktualisiert am 20 min read
So verwenden Sie GoSpider: Crawlen, URLs bereinigen und Daten extrahieren
TL;DR: GoSpider ist ein Befehlszeilen-Crawler zum Auffinden von URLs, kein vollständiger Scraper für strukturierte Daten. Diese Anleitung zur Verwendung von GoSpider zeigt einen begrenzten Crawl, die saubere Verarbeitung der Ausgabe, die Übergabe von Colly an CSV sowie einen Diagnosepfad für 403-Antworten oder Seiten, die eine JavaScript-Darstellung erfordern.

Web-Crawling ist das automatisierte Auffinden und Durchlaufen von Webseiten über deren Links. GoSpider ist ein Go-basierter Befehlszeilen-Crawler, der URLs schnell zuordnet, während ein Scraper wie Colly ausgewählte Seiten besucht und Felder in ein nutzbares Schema extrahiert.

Wenn Sie nach „How To Use GoSpider“ gesucht haben, ist der wichtigste Unterschied der Übergabepunkt: GoSpider erstellt die Menge der in Frage kommenden URLs, und anschließend entscheidet Ihr Code für die Bereinigung und Extraktion, was zu Daten wird. Diese Trennung sorgt dafür, dass die Erfassung breit genug bleibt, um nützliche Seiten zu finden, ohne sie mit Selektoren, Datensatzvalidierung oder dem Schreiben von CSV-Dateien zu vermischen.

Dieses Tutorial beginnt mit einer kleinen öffentlichen Testseite, erläutert die GoSpider-Befehle, die den Umfang und die Ladung steuern, und wandelt die Ausgabe anschließend in eine reproduzierbare Go-Pipeline um. Außerdem werden Flags und Standardwerte als versionsabhängig behandelt. Bevor Sie ein Rezept ausführen, vergleichen Sie es bitte mit gospider -h und dem offiziellen GoSpider-Repository ab, da sich Aliase und Verhalten zwischen den Releases ändern können.

So verwenden Sie GoSpider: Was es leistet und wo seine Grenzen liegen

GoSpider akzeptiert ein Ziel oder eine Liste von Zielen, fordert Seiten an, folgt zulässigen Links und meldet URLs, die in HTML, Skripten, Sitemaps, Robots-Dateien, Subdomains oder optionalen externen Quellen gefunden wurden. Dadurch eignet sich der GoSpider-Webcrawler für Bestandsaufnahmen, Sicherheitsaufklärung auf autorisierten Systemen, Migrationsprüfungen und den Aufbau einer Eingabewarteschlange für die spätere Extraktion.

Er wandelt beliebige Seiten nicht von selbst in Produkt-, Artikel- oder Tabelleneinträge um. GoSpider kann zwar /catalogue/a-light-in-the-attic_1000/index.html; der Extraktionscode muss diese Seite dennoch öffnen, Titel und Preis auswählen, diese validieren und das Ergebnis serialisieren. Ein Leitfaden zum Thema „Web-Scraping vs. Web-Crawling“ ist eine nützliche Hilfe, falls Ihr Team dazu neigt, diese Begriffe synonym zu verwenden.

Die andere Grenze betrifft das Rendering. GoSpider kann zwar JavaScript-Dateien auf URL-ähnliche Zeichenfolgen überprüfen, führt jedoch keine Single-Page-Anwendungen so aus, wie es ein Browser tun würde. Wenn die Daten erst nach einem Klick, einem Bildlauf, einem Anmeldevorgang oder einem clientseitigen API-Aufruf angezeigt werden, ist die URL-Erkennung möglicherweise unvollständig. Verwenden Sie GoSpider zunächst für öffentliche, statische oder serverseitig gerenderte Oberflächen. Eskalieren Sie erst, nachdem Sie festgestellt haben, ob der Fehler auf den Umfang, die Zugriffskontrolle oder eine fehlende Browserausführung zurückzuführen ist.

Schnellstart: GoSpider installieren und eine saubere URL-Liste erstellen

Dieser erste „So verwenden Sie GoSpider“-Workflow nutzt „Books to Scrape“, eine öffentliche Übungswebsite mit geringer Tiefe und geringem Anforderungsaufkommen. Das Ziel ist nicht maximale Abdeckung oder Geschwindigkeit. Es handelt sich um eine reproduzierbare URL-Datei, die Sie überprüfen können, bevor Sie den Umfang erweitern. Behalten Sie den ursprünglichen Befehl lange genug unverändert bei, um eine Basislinie zu ermitteln, und ändern Sie dann jeweils nur eine Kontrollvariable. Durch diesen Ansatz lassen sich Unterschiede bei der Ausgabe und der Auslastung nachvollziehbar erklären.

Installiere die CLI und überprüfe deine Umgebung

Installieren Sie eine aktuelle Go-Version anhand der offiziellen Go-Installationsanleitung und überprüfen Sie anschließend, ob die Toolchain funktioniert:

go version
go env GOBIN
go env GOPATH

Zum Zeitpunkt der Erstellung dieses Artikels lautet das erwartete Installationsmuster für Module wie folgt:

go install github.com/jaeles-project/gospider@latest
gospider -h

Der Installationsbefehl, die Version, Aliase und Standardeinstellungen erfordern vor der Veröffentlichung eine Überprüfung des aktuellen Repositorys. Betrachten Sie gospider -h aus Ihrer installierten Binärdatei als maßgeblich für die folgenden Anleitungen.

Wenn macOS oder Linux die ausführbare Datei nicht finden können und GOBIN leer ist, legt die mitgelieferte Dokumentation die von Go installierten Binärdateien im Verzeichnis „GOPATH“ bin :

export PATH="$(go env GOPATH)/bin:$PATH"
gospider -h

Speichern Sie diesen Export erst dann in der Startdatei Ihrer Shell, nachdem Sie das Verzeichnis überprüft haben. Auf jeder Plattform hat eine benutzerdefinierte GOBIN . Behalten Sie die Ausgabe von go version, go env GOBINund gospider -h in Ihren Ausführungsnotizen fest. Diese kurze Aufzeichnung erleichtert es erheblich, zu erklären, warum sich ein Befehl auf einem anderen Rechner oder nach einem Upgrade anders verhält.

<!-- Weitere Recherche erforderlich: Überprüfen Sie die aktuellen Anweisungen zu GOBIN und PATH unter Windows in der aktuellen Go-Dokumentation, bevor Sie betriebssystemspezifische Befehle hinzufügen. -->

Führen Sie einen begrenzten ersten Crawl durch

Erstellen Sie ein Arbeitsverzeichnis und crawlen Sie dann nur eine Verlinkungsebene von der Startseite aus:

mkdir gospider-project
cd gospider-project

gospider   -s https://books.toscrape.com/   -d 1   -c 2   -k 1   -m 20   -o output   -q

In den im mitgelieferten Brief beschriebenen Versionen -s wird eine Website festgelegt, -d 1 hält die Rekursion flach -c 2 begrenzt die Anzahl gleichzeitiger Anfragen für eine übereinstimmende Domain, -k 1 fügt eine Verzögerung hinzu, -m 20 legt ein Timeout fest, -o speichert Ergebnisse und -q reduziert Terminal-Rauschen. Überprüfen Sie jedes Flag anhand Ihrer aktuellen Hilfeausgabe, bevor Sie den Befehl unverändert verwenden.

Fangen Sie auch auf einer Testseite zunächst konservativ an. Die Tiefe vervielfacht die Pfade, die Parallelität vervielfacht die laufenden Aufgaben, und ein Crawl ohne Verzögerung kann vermeidbare Auslastung verursachen. Einige dokumentierte Versionen interpretieren die Tiefe 0 als unbegrenzte Rekursion; verwenden Sie sie daher erst, nachdem Sie dieses Verhalten erneut getestet und einen festen Umfang definiert haben.

Für einen schnellen, sauberen Datenstrom erfassen Sie URLs und entfernen Sie Duplikate:

gospider -s https://books.toscrape.com/ -d 1 -c 2 -k 1 -q   | grep -Eo 'https?://[^[:space:]]+'   | sort -u > urls.txt

Öffnen urls.txt und vergewissern Sie sich, dass jeder Hostname und jeder Pfad zum beabsichtigten Ziel gehört. Die Datei kann neben Produktseiten auch Kategorie-, Paginierungs- und Asset-URLs enthalten. Das ist zum Zeitpunkt der Erfassung zu erwarten. Versuchen Sie nicht, dies durch eine Erhöhung der Tiefe auszugleichen. Identifizieren Sie zunächst das Pfadmuster, das die Seiten repräsentiert, die Ihr Extraktor tatsächlich verarbeiten kann.

Interpretieren Sie „tagged“, „quiet“ und JSON-Ausgaben

Führen Sie das Crawling ohne -q , wenn Sie die Herkunft nachverfolgen müssen. Bei dokumentierten Builds unterscheiden Tags angeforderte Ressourcen ([url]), aus HTML geparsten Links ([href]), aus HTML geparsten Links ([javascript]) sowie URL-ähnliche Zeichenfolgen, die bei der Überprüfung von Skripten gefunden wurden ([linkfinder]). Testen Sie diese Bezeichnungen erneut mit Ihrer installierten Version.

Die „Quiet“-Ausgabe lässt sich leichter weiterleiten, lässt jedoch nützlichen Kontext außer Acht. JSON ist vorzuziehen, wenn ein anderes Programm Typ- oder Quellfelder benötigt:

gospider -s https://books.toscrape.com/ -d 1 --json > crawl.jsonl
head -n 3 crawl.jsonl

Binden Sie Produktionscode nicht an ein angenommenes JSON-Schema, bevor Sie ein aktuelles Beispiel überprüft und validiert haben, wie Fehler dargestellt werden. Statische Assets oder ausgeschlossene Links werden möglicherweise weiterhin als Funde ausgegeben, auch wenn GoSpider sie nicht abfragt.

Konfigurieren Sie GoSpider pro Crawling-Aufgabe

Eine praktische Anleitung zur Einrichtung von GoSpider beginnt mit vier Entscheidungen: Welche Hosts sind zugelassen, wie weit dürfen Links verfolgt werden, wie viel Last ist akzeptabel und welche Ausgabe erwartet Ihre nächste Stufe? Erstellen Sie den Befehl auf der Grundlage dieser Entscheidungen, anstatt jeden Erkennungsschalter zu aktivieren. Notieren Sie den vorgesehenen Host, die maximale Tiefe, die Anzahl der Ziel-Worker, die Parallelität pro Domain, die Verzögerung und das Ausgabeformat neben dem Befehl. Diese sechs Werte bilden einen kompakten Crawling-Vertrag, den Prüfer vor der Ausführung nachvollziehen können.

Wählen Sie Ziele, Umfang und Ausgabe

Verwenden Sie -s für eine Start-URL und -S für eine Datei mit mehreren Zielen. Halten Sie die Website-Liste explizit – eine genehmigte URL pro Zeile – und speichern Sie jeden Durchlauf in einem datierten Ausgabeverzeichnis, damit Ergebnisse aus unterschiedlichen Konfigurationen nicht vermischt werden.

printf '%s
'   'https://books.toscrape.com/'   'https://quotes.toscrape.com/' > sites.txt

gospider -S sites.txt -d 1 -c 2 -t 2 -o output-run-01

Die Erkennung von Subdomains sollte nur dann aktiviert werden, wenn die Autorisierung diese Hosts abdeckt. Entscheiden Sie, ob Weiterleitungen zu einem anderen Host zulässig sind, und halten Sie die Ausgabe jedes Ziels getrennt. Ebenso sollten Whitelist- und Blacklist-Ausdrücke die Anfragen auf nützliche Pfade und Dateitypen beschränken. Ein Muster wie /catalogue/ kann Produktseiten beibehalten, während Assets bei der Nachbearbeitung entfernt werden können.

Gehen Sie nicht davon aus, dass die Filterung die Ausgabe verändert. Bei dokumentierten Versionen kann eine auf der Blacklist stehende URL weiterhin als erkannter Link erscheinen, auch wenn sie nicht abgerufen wird. Überprüfen Sie sowohl das Anforderungsverhalten als auch die erzeugte Ausgabe anhand eines kleinen Testfalls.

Steuern Sie Tiefe, Parallelität, Threads, Verzögerungen und Timeouts

Die Tiefe ist die Anzahl der Link-Ebenen, die von jeder Start-URL aus verfolgt werden. -d 1 ist ein sicheres Beispiel für die Erkennung. Erhöhen Sie den Wert auf -d 2 erst dann, wenn die ersten Ergebnisse zeigen, dass die gewünschten Seiten eine Ebene weiter entfernt liegen. Vermeiden Sie eine unbegrenzte Tiefe, da Kalender, facettierte Navigation, Tracking-Parameter und doppelte Routen dazu führen können, dass der Crawl unendlich lang wird.

Die Parallelitätssteuerung löst verschiedene Probleme:

Steuerung

Praktische Bedeutung

Hauptrisiko

-c

Gleichzeitige Anfragen an eine übereinstimmende Domain

Zu hohe Auslastung einer einzelnen Site

-t

Auswahl der Mitarbeiter bei der Bearbeitung einer Standortliste

Zu viele gleichzeitig aktive Standorte

Verzögerung

Pause zwischen den Anfragen

Längere Laufzeit

Zeitüberschreitung

Maximale Wartezeit für eine Anfrage

Falsche Fehlermeldungen auf langsamen Seiten

Bei drei autorisierten Websites -t 2 -c 2 können zwei Ziele aktiviert werden, wobei bis zu zwei Anfragen pro übereinstimmender Domain zulässig sind. Das bedeutet nicht, dass insgesamt nur zwei Anfragen möglich sind. Verwenden Sie eine Verzögerung und ein moderates Timeout, damit langsame Hosts keine Flut von Wiederholungsversuchen auslösen:

gospider -S sites.txt -d 1 -t 2 -c 2 -k 1 -m 20 -o output

Die genauen -c, -t, Verzögerung, Timeout und die Semantik bei Tiefe Null sind in den bereitgestellten Fakten versionsabhängig. Notieren Sie Ihre Binärversion und testen Sie mit einer lokalen oder kontrollierten Testumgebung, bevor Sie einen großen Durchlauf starten. Überwachen Sie die Anfragerate auf dem Server, wenn Sie diesen kontrollieren. Clientseitige Parallelitätseinstellungen sind nützliche Begrenzungen, doch Weiterleitungen, Wiederholungsversuche und neu entdeckte Hosts können dazu führen, dass der beobachtete Datenverkehr von einer einfachen -c × -t Schätzung.

Erweitern Sie die Erkennung mit Skripten, Bots, Sitemaps, Subdomains und externen Quellen

Jeder Erweiterungsmodus fügt eine andere Ausgangsquelle hinzu:

  • Die JavaScript-Prüfung durchsucht heruntergeladenen Skripttext nach URL-ähnlichen Zeichenfolgen. Die Anwendung wird dabei nicht ausgeführt.
  • Die Verarbeitung von Robots und Sitemaps kann deklarierte Pfade aufdecken, die bei der normalen Navigation übersehen werden.
  • Die Erkennung von Subdomains kann neue Hosts hinzufügen, was auch die Autorisierungs- und Lastprobleme erweitert.
  • Externe Quellen können historische URLs aus Archiven oder Bedrohungsinformations-Indizes zurückgeben.

Ein begrenztes Rezept kann diese Modi mit geringer Tiefe, geringer Parallelität und einer Host-Whitelist kombinieren:

gospider   -s https://example.com/   -d 1 -c 1 -k 2 -m 20   --js --robots --sitemap   --whitelist 'https://([a-z0-9-]+\.)?example\.com/'   -o discovery

Fügen Sie die dokumentierte Subdomain oder --other-source Option erst nach Überprüfung gospider -h und bestätigt wurde, dass jeder resultierende Host im Gültigkeitsbereich bleibt. Archivdaten können gelöschte, umgeleitete oder sensible Pfade aufdecken; die Erkennung ist daher keine Erlaubnis, diese abzufragen.

Legen Sie User-Agents, Header, Cookies, Proxys, Filter und die JSON-Ausgabe fest

Benutzerdefinierte Anforderungsmetadaten sind nützlich, wenn ein autorisiertes Ziel eine bestimmte Ländereinstellung, ein Testkonto oder einen anwendungsspezifischen Header erwartet. Übergeben Sie nicht vertrauliche Header separat:

gospider -s https://example.com/ -d 1   -H 'Accept-Language: en-US'   -H 'X-Test-Run: inventory-01'

Bei einem Cookie den Wert auslesen, ohne ihn auszugeben, und nach der Ausführung löschen:

read -s SESSION_COOKIE
gospider -s https://example.com/account/ -d 1 --cookie "$SESSION_COOKIE"
unset SESSION_COOKIE

Befehlszeilenargumente können für andere lokale Prozesse oder Shell-Tools sichtbar sein. Verwenden Sie kurzlebige Test-Anmeldedaten, vermeiden Sie gemeinsam genutzte Rechner, committen Sie niemals Befehle, die Tokens enthalten, und lassen Sie nicht zu, dass die Authentifizierung den genehmigten Crawling-Umfang erweitert.

Dokumentierte Versionen akzeptieren einen Proxy mit -p und strukturierte Ausgabe mit --json:

gospider -s https://example.com/ -d 1 -c 1   -p 'http://USER:PASS@proxy.example:8080'   --json > crawl.jsonl

Behandeln Sie die Proxy-Syntax, Filternamen, Aliase, die Header-Analyse, den Umgang mit Cookies und JSON-Felder als versionsabhängig. Führen Sie eine kontrollierte Anfrage durch, die zulässige Header ausgibt, bevor Sie sich auf das Authentifizierungs- oder Routing-Verhalten verlassen. Ein Proxy ändert die Netzwerkroute, nicht Ihre Autorisierung. Für eine umfassendere Projekteinrichtung kann ein Go-Leitfaden zum Web-Scraping das Geheimnis-Management und das HTTP-Client-Verhalten über diese CLI hinaus behandeln.

Kopierbare Befehlsvorlagen

Diese GoSpider-Befehle sind Vorlagen, keine Empfehlungen hinsichtlich Berechtigungen oder Auslastung. Ersetzen Sie die Ziele, überprüfen Sie die aktuellen Flags und führen Sie die „How To Use GoSpider“-Rezepte zunächst in einem kleinen, autorisierten Umfang aus, bevor Sie die Tiefe oder Parallelität erhöhen. Speichern Sie jeden Befehl in einem Runbook unter Angabe seines Zwecks und des erwarteten Hostnamens. Wenn die beobachteten Ergebnisse eines dieser beiden Werte überschreiten, brechen Sie den Vorgang ab und untersuchen Sie die Ursache, anstatt nach einem umfangreichen Crawl Filter hinzuzufügen.

Crawls für einzelne Websites, Website-Listen und parallele Crawls mit mehreren Zielen

Einzelne Website, eine Ebene, geringer Druck:

gospider -s https://books.toscrape.com/ -d 1 -c 2 -k 1 -m 20 -o one-site

Mehrere Standorte aus einer Datei:

https://docs.example.org/
https://status.example.org/
https://support.example.org/

Speichern Sie diese Zeilen als sites.txtund führen Sie anschließend Folgendes aus:

gospider -S sites.txt -d 1 -c 2 -t 2 -k 1 -m 20 -o many-sites

Hier -t 2 wird gesteuert, wie viele der aufgeführten Ziele parallel verarbeitet werden, während -c 2 die gleichzeitige Verarbeitung für jede übereinstimmende Domäne begrenzt. Werden beide Werte erhöht, vervielfacht sich die Auslastung. Wenn ein Ziel auf einen anderen Host weiterleitet, überprüfen Sie den Geltungsbereich erneut, anstatt davon auszugehen, dass derselbe Parallelitätsbereich oder dieselbe Autorisierung gilt. Führen Sie zunächst ein Beispiel mit zwei Zielen aus und prüfen Sie, ob das Ausgabeverzeichnis die Ergebnisse in Ihrer Version wie erwartet trennt. Wenn die Dateien zusammengeführt oder unerwartet benannt werden, korrigieren Sie den nachgelagerten Import, bevor Sie weitere Ziele hinzufügen.

Erkennung von Sitemaps, Subdomains und Archivquellen

In Robots-Dateien und Sitemaps deklarierte Pfade:

gospider -s https://example.com/ --robots --sitemap   -d 1 -c 1 -k 2 -o declared-paths

Autorisierte Subdomains unter Verwendung des Subdomain-Flags, das in der Hilfe Ihrer Installation angezeigt wird:

gospider -s https://example.com/ --subs   -d 1 -c 1 -k 2 -o subdomain-results

Historische Quellen:

gospider -s https://example.com/ --other-source   -d 1 -c 1 -k 2 -o archive-results

Quellen von Drittanbietern können viele veraltete oder nicht relevante URLs zurückgeben. Behandeln Sie deren Ausgabe als nicht vertrauenswürdige Ausgangspunkte und nicht als Warteschlange, die automatisch abgeholt werden soll. Filtern Sie nach zugelassenen Hosts und Pfaden, entfernen Sie URLs, die vertrauliche Informationen oder Benutzerkennungen enthalten, und prüfen Sie die Statuscodes, bevor Sie Ergebnisse anfordern. Halten Sie bei allen drei Vorgehensweisen die Tiefe begrenzt, da jeder neu hinzugefügte Pfad eine weitere Ebene von Links offenlegen kann.

Entdeckte URLs bereinigen und validieren

Die Rohdaten des Crawlers sind ein Beobachtungsprotokoll, keine vertrauenswürdige Extraktionswarteschlange. In dieser GoSpider-Pipeline ist die Bereinigung ein separater, deterministischer Schritt, der nur gültige HTTP-URLs beibehält, die mit den Seiten übereinstimmen, die Sie scrapen möchten. Halten Sie die Rohdatei unveränderlich, schreiben Sie akzeptierte URLs in eine neue Datei und versionieren Sie die Regeln, damit jede Einbeziehung reproduzierbar ist.

Ergebnisse normalisieren, deduplizieren und nach Mustern filtern

Eine kompakte Shell-Pipeline kann URL-förmige Zeichenfolgen extrahieren, Fragmente entfernen, eine Pfadfamilie beibehalten und Duplikate entfernen:

grep -Eo 'https?://[^[:space:]]+' crawl.txt \
  | sed -E 's/#.*$//' \
  | grep -E '^https://books\.toscrape\.com/catalogue/' \
  | grep -Ev '/catalogue/category/' \
  | sort -u > urls.txt

Für einen portablen Go-Filter mit expliziter Analyse speichern Sie dies als filter.go:

package main

import (
	"bufio"
	"fmt"
	"net/url"
	"os"
	"regexp"
	"sort"
	"strings"
)

var findURL = regexp.MustCompile(`https?://[^\s"'<>()]+`)

func main() {
	seen := map[string]bool{}
	var keep []string
	s := bufio.NewScanner(os.Stdin)

	for s.Scan() {
		for _, raw := range findURL.FindAllString(s.Text(), -1) {
			raw = strings.TrimRight(raw, ".,);]")
			u, err := url.Parse(raw)
			if err != nil || u.Hostname() != "books.toscrape.com" {
				continue
			}
			if !strings.HasPrefix(u.Path, "/catalogue/") ||
				strings.HasPrefix(u.Path, "/catalogue/category/") {
				continue
			}
			u.Fragment = ""
			u.Scheme = strings.ToLower(u.Scheme)
			u.Host = strings.ToLower(u.Host)
			clean := u.String()
			if !seen[clean] {
				seen[clean] = true
				keep = append(keep, clean)
			}
		}
	}
	sort.Strings(keep)
	for _, u := range keep {
		fmt.Println(u)
	}
}

Führen Sie ihn aus mit:

go run filter.go < crawl.txt > urls.txt

Die Normalisierungsrichtlinie ist anwendungsspezifisch. Das Entfernen von Fragmenten ist bei Serveranfragen in der Regel unbedenklich, doch das Weglassen von Abfrageparametern kann dazu führen, dass unterschiedliche Seiten zusammengeführt werden. Entscheiden Sie, ob abschließende Schrägstriche, Standardports, Prozent-Kodierung und Tracking-Parameter für Ihr Ziel gleichwertig sind, und kodieren Sie diese Richtlinie dann in Tests. Behalten Sie die ursprüngliche URL neben dem normalisierten Schlüssel bei, wenn Nachvollziehbarkeit wichtig ist. Denken Sie auch daran, dass GoSpider-Filter eine Anfrage verhindern können, ohne den entdeckten Link aus der Ausgabe zu unterdrücken. Eine Nachbearbeitung ist daher weiterhin erforderlich.

Prüfen Sie eine Stichprobe, bevor Sie skalieren

Überprüfen Sie die ersten Datensätze und untersuchen Sie eine kleine Stichprobe:

head -n 20 urls.txt

head -n 10 urls.txt | while read -r url; do
  curl -sS -o /dev/null \
    -w '%{http_code} %{content_type} %{url_effective}\n' "$url"
done

Achten Sie auf unerwartete Hosts, doppelte URL-Varianten, Weiterleitungen, Nicht-HTML-Inhalte, 403-Antworten und Pfadstrukturen, die nicht mit Ihren Extraktionsselektoren übereinstimmen. Öffnen Sie manuell zwei oder drei Seiten und vergewissern Sie sich, dass die gewünschten Felder im zurückgegebenen HTML vorhanden sind. Erhöhen Sie die GoSpider-Tiefe oder das Extraktionsvolumen erst, wenn diese Stichprobe fehlerfrei ist.

Wandeln Sie die URL-Liste mit Colly in strukturierte Daten um

GoSpider hat seine Aufgabe nun erfüllt. Im nächsten Schritt der GoSpider-Anleitung wird die bereinigte Zulassungsliste an Colly übergeben, das jede genehmigte Seite abruft, CSS-Selektor-Callbacks ausführt, Datensätze validiert und eine CSV-Datei erstellt. Diese Abgrenzung sorgt dafür, dass die URL-Ermittlung austauschbar und die Extraktionslogik überprüfbar bleibt. Außerdem können Sie Selektoren für denselben genehmigten URL-Satz erneut ausführen, ohne die Website neu zu erfassen – was nützlich ist, wenn sich das Seiten-Markup ändert, der Crawling-Umfang jedoch gleich bleibt.

Erstellen Sie einen kompakten URL-zu-CSV-Scraper

Initialisieren Sie ein Go-Modul und fügen Sie Colly hinzu:

go mod init gospider-pipeline
go get github.com/gocolly/colly/v2

Speichern Sie Folgendes als scrape.go. Die Selektoren zielen auf die im Schnellstart verwendete Produktseite „Books to Scrape“ ab:

package main

import (
	"bufio"
	"encoding/csv"
	"log"
	"os"
	"strings"
	"time"

	"github.com/gocolly/colly/v2"
)

func main() {
	input, err := os.Open("urls.txt")
	if err != nil { log.Fatal(err) }
	defer input.Close()

	out, err := os.Create("books.csv")
	if err != nil { log.Fatal(err) }
	defer out.Close()

	writer := csv.NewWriter(out)
	defer writer.Flush()
	_ = writer.Write([]string{"url", "title", "price", "image"})

	c := colly.NewCollector(
		colly.AllowedDomains("books.toscrape.com"),
	)
	_ = c.Limit(&colly.LimitRule{
		DomainGlob:  "*books.toscrape.com*",
		Parallelism: 2,
		Delay:       time.Second,
	})

	written := map[string]bool{}

	c.OnHTML("article.product_page", func(e *colly.HTMLElement) {
		pageURL := e.Request.URL.String()
		if written[pageURL] { return }

		title := strings.TrimSpace(e.ChildText("div.product_main h1"))
		price := strings.TrimSpace(e.ChildText("p.price_color"))
		image := e.Request.AbsoluteURL(e.ChildAttr("div.item.active img", "src"))
		if title == "" || price == "" {
			log.Printf("missing fields: %s", pageURL)
			return
		}

		_ = writer.Write([]string{pageURL, title, price, image})
		written[pageURL] = true
	})

	c.OnError(func(r *colly.Response, err error) {
		log.Printf("request failed: %s status=%d err=%v",
			r.Request.URL, r.StatusCode, err)
	})

	scanner := bufio.NewScanner(input)
	count := 0
	for scanner.Scan() && count < 20 {
		u := strings.TrimSpace(scanner.Text())
		if u == "" { continue }
		if err := c.Visit(u); err != nil {
			log.Printf("visit skipped: %s err=%v", u, err)
		}
		count++
	}
	if err := scanner.Err(); err != nil { log.Fatal(err) }
}

Führen Sie go run scrape.goaus und überprüfen Sie anschließend books.csv. In diesem kompakten Beispiel verarbeitet der Collector die Datei synchron, während die Limit-Regel eine Ratenbegrenzung einführt und Spielraum für die spätere Umstellung auf asynchrone Erfassung lässt. Wenn Sie asynchrone Aufrufe aktivieren, schützen Sie gemeinsam genutzte Maps und CSV-Schreibvorgänge oder leiten Sie Datensätze über eine einzige Writer-Goroutine weiter. Collys OnHTML Callback wird für übereinstimmende Elemente ausgelöst; eine leere Datei bedeutet daher in der Regel, dass der Selektor, der Inhalt der Antwort oder der URL-Filter falsch ist. Wenn Ihr eigentliches Ziel tabellarisch ist, ist eine Anleitung zum Scraping von HTML-Tabellen in Golang mit Colly die naheliegende nächste Referenz.

Testen, begrenzen und absichern Sie den Extraktionsschritt

Behalten Sie das anfängliche Limit bei 20 URLs bei. Überprüfen Sie Header, Zeilenanzahl, Kodierung, Pflichtfelder, das Verhalten bei Duplikaten und Bild-URLs, bevor Sie die Obergrenze aufheben. Protokollieren Sie Statuscodes und die fehlgeschlagene URL, protokollieren Sie jedoch niemals Cookies oder Autorisierungs-Header.

Verwenden Sie AllowedDomainsVerwenden Sie eine Verzögerung und geringe Parallelität, auch wenn die Eingabe bereits gefiltert wurde. Fügen Sie Wiederholungsversuche nur bei vorübergehenden Fehlern wie Timeouts oder ausgewählten 5xx-Antworten hinzu, mit einer strengen Versuchsbegrenzung und Backoff. Versuchen Sie es bei 403- oder 404-Antworten nicht blindlings erneut. Schreiben Sie im Produktivbetrieb in eine temporäre CSV-Datei und benennen Sie diese erst um, nachdem der Lauf die Validierung bestanden hat, damit eine Teilausgabe nicht mit einem vollständigen Datensatz verwechselt wird. Fügen Sie ein Laufmanifest hinzu, das den Eingabe-Hash, die Selektor-Version, die Startzeit sowie die Anzahl der Erfolge und Fehler enthält. Dadurch lässt sich eine Wiederholung messbar nachverfolgen, anstatt sich auf Terminalprotokolle zu verlassen.

Fehler beheben und das nächste Tool auswählen

Eine gute Diagnose zur Verwendung von GoSpider beginnt mit der Einordnung des Fehlers. Überprüfen Sie zunächst die Installation und den Crawling-Umfang, dann den HTTP-Zugriff und anschließend das Rendering. Ein Toolwechsel, bevor die betroffene Ebene identifiziert wurde, erhöht oft die Komplexität, ohne die Ursache zu beheben. Erfassen Sie eine fehlgeschlagene URL, den genauen Befehl, den Statuscode, den Antworttyp und ob das fehlende Element im Roh-HTML vorhanden ist. Diese Hinweise führen in der Regel innerhalb weniger Minuten zum richtigen Zweig.

Häufige GoSpider-Probleme diagnostizieren

Symptom

Zuerst prüfen

Abhilfemaßnahme

gospider: command not found

go env GOBIN, go env GOPATH, und PATH

Fügen Sie das tatsächliche Go-Binärverzeichnis hinzu und führen Sie den Befehl anschließend erneut aus gospider -h

Leere Ergebnisse

Start-URL, Weiterleitungen, Tiefe, zurückgegebenes HTML

Quiet-Modus deaktivieren, Filter schwächen und eine öffentliche Seite testen

Übermäßig unübersichtliche Ausgabe

Asset-Links, Navigation, Abfragevarianten

Nach dem Crawling normalisieren und nach Mustern filtern

Häufige Timeouts

Server-Latenz, Timeout, Anforderungsdruck

Verringern -c, Verzögerung hinzufügen, Timeout vorsichtig erhöhen

Der Crawl wächst weiter

Tiefe Null, Kalender, Facetten, Subdomains

Den Lauf stoppen, endliche Tiefe verwenden und den Host-/Pfadbereich einschränken

URLs, die wie Duplikate aussehen

Fragmente, Groß-/Kleinschreibung, Reihenfolge der Suchbegriffe, Weiterleitungen

Wenden Sie eine explizite Normalisierungsrichtlinie an

Links auf der Blacklist werden weiterhin angezeigt

Unterschied zwischen Erkennung und Abruf

Überprüfen Sie die Anforderungsprotokolle und filtern Sie die ausgegebenen Ergebnisse separat

Ergebnisse unterscheiden sich je nach Rechner

Binärversion, Flags, Netzwerkpfad

Erfassen gospider -h, Versionsinformationen und eine Testumgebung

Fehlerbehebung mit einer URL und markierter Ausgabe, bevor mehrere Flags geändert werden. Wenn eine einfache, vom Server gerenderte Seite funktioniert, ist die Installation wahrscheinlich in Ordnung. Vergleichen Sie eine bekanntermaßen funktionierende URL mit einer fehlerhaften URL unter Verwendung derselben Flags, sodass Sie jeweils nur eine Variable ändern. Wenn URLs gefunden werden, aber falsche Pfade überwiegen, korrigieren Sie den Gültigkeitsbereich oder bereinigen Sie die Struktur. Wenn Anfragen den Status 403 zurückgeben, überprüfen Sie die Zugriffsrechte. Wenn im HTML-Code Inhalte fehlen, die im Browser sichtbar sind, überprüfen Sie die Darstellung.

Behandeln Sie 403-Antworten, ohne zu raten

Eine HTTP-403-Antwort bedeutet, dass der Server die Anfrage verstanden, aber abgelehnt hat. Dies kann auf fehlende Berechtigungen, eine erforderliche authentifizierte Sitzung, eine Richtlinienregel, eine Ratenbegrenzung oder Anti-Bot-Maßnahmen hinweisen. Es ist kein Beweis dafür, dass ein Proxy die richtige Lösung ist.

Gehen Sie in dieser Reihenfolge vor:

  1. Stellen Sie sicher, dass das Crawling autorisiert ist und die URL im Gültigkeitsbereich liegt.
  2. Fordern Sie eine URL mit markierter Ausgabe an oder curl und überprüfen Sie Weiterleitungen und Antwort-Header.
  3. Prüfen Sie, ob die Website eine Anmeldung, ein Cookie, einen Referrer, eine Ländereinstellung oder einen dokumentierten User-Agent erfordert.
  4. Reduzieren Sie die Parallelität und fügen Sie eine Verzögerung hinzu. Ein Crawl mit Spitzenauslastung kann Kontrollmechanismen auslösen, die bei einer manuellen Anfrage nicht aktiv werden.
  5. Wenn die IP-Reputation oder der geografische Standort als Problem bestätigt wurden, verwenden Sie einen zugelassenen Proxy mit kurzlebigen Anmeldedaten.
  6. Wenn die Verwaltung von Wiederholungsversuchen, Proxy-Rotation und CAPTCHA-Behandlung außerhalb des Projekts liegt, ziehen Sie eine generische Scraping-API in Betracht.

Versuchen Sie nicht, Kontoberechtigungen, Paywalls oder explizite Zugriffskontrollen zu umgehen. Ein detailliertes Playbook zum Web-Scraping ohne Blockierung kann bei der Anfragehygiene helfen, doch die Autorisierung bleibt die oberste Voraussetzung.

Erkennen Sie, wann das Rendern von JavaScript einen Browser oder eine API erfordert

Das Auffinden einer URL innerhalb eines JavaScript-Bundles ist Textanalyse. Das Rendern einer Seite bedeutet, Skripte auszuführen, den Browserstatus aufrechtzuerhalten, auf Netzwerkaktivität zu warten und manchmal zu klicken oder zu scrollen. Die JavaScript-Erkennungsoption von GoSpider befasst sich mit der ersten Aufgabe, nicht mit der zweiten.

Führen Sie einen dreiteiligen Test durch:

  • Wenn der gewünschte Link und die Daten in der ursprünglichen HTTP-Antwort vorhanden sind, reichen GoSpider und Colly aus.
  • Wenn der HTML-Code größtenteils eine Anwendungshülle ist, die Daten jedoch von einem öffentlichen JSON-Endpunkt bereitgestellt werden, crawlen Sie genehmigte Endpunkte und extrahieren Sie die Daten aus deren Antworten.
  • Wenn Inhalte erst nach der Ausführung oder Interaktion im Browser erscheinen, nutzen Sie Browser-Automatisierung oder einen gehosteten Browser-Dienst.
  • Wenn die Seite statisch ist, aber auf der Anforderungs-Ebene konsequent blockiert wird, ziehen Sie eine verwaltete Anfrage-API anstelle von Browser-Automatisierung in Betracht.

Vergleichen Sie „Quelltext anzeigen“ mit dem Browser-DOM und überprüfen Sie das Netzwerkfenster bei einem zulässigen Test. Wählen Sie das am wenigsten komplexe Tool, das die erforderliche Antwort reproduziert. Browser lösen Probleme bei der Darstellung und Interaktion, verbrauchen jedoch mehr Speicher und erfordern Lebenszyklus-, Timeout- und Sitzungsverwaltung.

GoSpider vs. hakrawler, Colly und browserbasierte Crawler

Auf Kategorieebene sind GoSpider und hakrawler CLI-orientierte Tools zur URL-Erkennung, Colly ist ein programmierbares Go-Framework für das Crawling und die Extraktion, und browserbasierte Crawler führen clientseitigen Code aus. Die richtige Wahl hängt davon ab, welche Art der Übergabe Sie benötigen:

Tool-Kategorie

URL-Ermittlung

Strukturierte Extraktion

JavaScript-Rendering

Eignung für den Einsatz

GoSpider

Umfassende, flag-gesteuerte Erkennung

Separater Schritt erforderlich

Keine Ausführung im Browser

Schnelle Bestandsaufnahme vor der Extraktion

hakrawler

Erkennung von CLI-Verbindungen

Separater Schritt erforderlich

Keine Ausführung im Browser

Schlanke Erkennungs-Workflows

Colly

Code-definierte Durchquerung

CSS-Callbacks und Go-Logik

Keine eigenständige Ausführung im Browser

Benutzerdefinierte, testbare Go-Scraper

Browser-Crawler

DOM- und interaktionsgesteuert

DOM-Selektoren oder Seitenskripte

Ja

SPAs, Formulare, Scrollen und Sitzungen

Bei der Entscheidung, wie GoSpider eingesetzt werden soll, sollten Sie es bevorzugen, wenn die Erfassungsbreite und die Zusammensetzung über die Befehlszeile entscheidend sind. Bevorzugen Sie Colly, wenn Extraktionsregeln und die Validierung von Datensätzen im Vordergrund stehen. Verwenden Sie einen Browser nur, wenn das Ziel tatsächlich eine Ausführung oder Interaktion erfordert.

Checkliste für verantwortungsbewusstes Crawling

Vor jedem Durchlauf:

  • Holen Sie die Berechtigung ein und legen Sie zulässige Hosts, Pfade, Konten und Felder fest.
  • Verwenden Sie eine begrenzte Crawling-Tiefe, geringe Parallelität, Verzögerungen, Timeouts und eine geringe URL-Obergrenze.
  • Prüfen Sie die Nutzungsbedingungen und das Robots Exclusion Protocol. Robots-Regeln dienen als Leitfaden für Crawler, gewähren jedoch keine rechtliche Erlaubnis.
  • Brechen Sie den Crawling-Vorgang ab, wenn Fehler, Latenzzeiten oder die Serverauslastung unerwartet ansteigen.
  • Halten Sie Cookies, Tokens und Proxy-Anmeldedaten aus dem Code und den Protokollen fern.
  • Sammeln Sie keine sensiblen Daten, nur weil eine URL auffindbar ist.
  • Protokollieren Sie die Version, den Befehl, den Zeitpunkt und die Ausgaberichtlinie zur Nachvollziehbarkeit.

Ein rechtliches und Compliance-Rahmenwerk für Web-Scraping kann diese Überprüfungen in einen wiederholbaren Prozess verwandeln.

Häufig gestellte Fragen

Das Verhalten von GoSpider hängt von der installierten Version, dem Ziel und den aktivierten Erkennungsmodi ab. Speichern Sie vor dem Produktivbetrieb gospider -hdie Modulversion oder den Commit und bewahren Sie einen kleinen Test-Crawl mit der erwarteten Ausgabe auf. Die abschließenden FAQ konzentrieren sich auf konzeptionelle Grenzen, die auch dann noch nützlich sind, wenn sich einzelne Aliase, Standardwerte, Tags oder JSON-Felder ändern. Außerdem wird vermieden, versionsspezifische Standardwerte als zeitlose Leitlinien darzustellen.

Wichtige Erkenntnisse

  • Verwenden Sie GoSpider zur Erkennung von URLs und führen Sie anschließend Normalisierung, Validierung und strukturierte Extraktion als separate Schritte durch.
  • Beginnen Sie mit begrenzter Tiefe, geringer Parallelität pro Domain, einer Verzögerung und einer kleinen Menge autorisierter Ziele.
  • -c steuert die Parallelität der Anfragen auf Domain-Ebene, während -t die parallele Verarbeitung über Ziele in einer Website-Liste steuert, vorbehaltlich einer Versionsüberprüfung.
  • Behandeln Sie „quiet“, JSON, Filter, Erkennungsmodi und Proxy-Flags als versionsabhängig. Testen Sie diese anhand einer kontrollierten Testumgebung.
  • Diagnostizieren Sie Umfang, HTTP-Zugriff und Browser-Rendering separat, bevor Sie die Tools wechseln.

FAQ

Ist GoSpider ein Webcrawler oder ein Webscraper?

GoSpider ist in erster Linie ein Web-Crawler. Er entdeckt und verfolgt URLs, bildet die Website-Struktur ab und kann Links aus verschiedenen Quellen aufdecken. Er wandelt beliebige Seiten im Allgemeinen nicht in validierte Produkt-, Artikel- oder Tabellendatensätze um. Dieser Schritt der strukturierten Extraktion gehört in den Parser-Code, ein Scraping-Framework oder eine andere Datenextraktionsschicht.

Was ist der Unterschied zwischen den Optionen -c und -t von GoSpider?

-c steuert die Anzahl der gleichzeitigen Anfragen für eine bestimmte Domain, während -t die Option -t steuert, wie viele Zielwebsites aus einer Liste bei dokumentierten Versionen parallel verarbeitet werden können. Durch ihre Kombination vervielfacht sich das mögliche Arbeitsvolumen. Da sich Semantik und Standardwerte ändern können, sollten Sie beide Optionen anhand der installierten Hilfe und eines kontrollierten Tests mit mehreren Websites überprüfen.

Führt die JavaScript-Option von GoSpider clientseitigen Code aus?

Nein. Die dokumentierte JavaScript-Funktion überprüft Skripte auf URL-ähnliche Zeichenfolgen, anstatt eine Browser-Engine auszuführen. Sie kann in Bundles eingebettete Endpunkte oder Routen aufdecken, reproduziert jedoch keine DOM-Aktualisierungen, Klicks, unendliches Scrollen oder Anwendungszustände, die durch die Ausführung von JavaScript erzeugt werden.

Warum kann eine ausgeschlossene oder auf die Blacklist gesetzte URL dennoch in der Ausgabe erscheinen?

Ein Filter kann GoSpider zwar daran hindern, eine übereinstimmende URL abzufragen, ohne jedoch die Tatsache zu löschen, dass der Link im HTML-Code oder einer anderen Quelle entdeckt wurde. Infolgedessen kann die URL weiterhin als Erkennungsdatensatz ausgegeben werden. Überprüfen Sie das Verhalten in Ihrer Version und wenden Sie anschließend vor der Extraktion einen separaten Ausgabefilter an.

Wann sollte GoSpider mit Colly, einem Proxy, einer Scraping-API oder einem Browser kombiniert werden?

Kombinieren Sie es mit Colly für die strukturierte Extraktion aus erreichbarem HTML, mit einem zugelassenen Proxy, wenn der Netzwerkstandort oder die IP-Reputation das bestätigte Hindernis darstellen, mit einer Anfrage-API, wenn die Blockierung auf operativer Ebene zu aufwendig ist, und mit einem Browser, wenn Inhalte die Ausführung von JavaScript oder Interaktion erfordern. Vor jeder Option müssen Autorisierungs- und Bereichsprüfungen durchgeführt werden.

Fazit

Die zuverlässige Antwort auf die Frage, wie man GoSpider einsetzt, lautet: Betrachten Sie es als die Erkundungsphase einer Pipeline. Installieren Sie es über die Go-Toolchain, überprüfen Sie die aktuelle Hilfeausgabe und beginnen Sie mit einem oberflächlichen, schrittweisen Crawl. Verwenden Sie -S, -cund -t bedacht, wenn Sie auf weitere Ziele ausweiten, und aktivieren Sie Sitemaps, Robots-Dateien, Skripte, Subdomains oder externe Quellen nur dann, wenn diese Quellen innerhalb des genehmigten Umfangs bleiben.

Die Ausgabe des Crawlers erfordert noch weitere Bearbeitung. Normalisieren Sie URLs, entfernen Sie Duplikate, wenden Sie Host- und Pfadregeln an und prüfen Sie Statuscodes, bevor Sie die Liste an Colly senden. Verwenden Sie in der Extraktionsphase Domain-Allowlists, geringe Parallelität, Feldvalidierung und atomare Ausgabeverarbeitung. Wenn ein Durchlauf fehlschlägt, klassifizieren Sie ihn als Problem im Umfang, als HTTP-Zugriffsproblem oder als Rendering-Problem, bevor Sie auf ein anderes Tool zurückgreifen.

Wenn autorisierte, vom Server gerenderte Seiten konsequent blockiert werden und Sie die Pipeline auf rohes HTML sowie die Colly-Analyse konzentrieren möchten, kann die Scraper-API von WebScrapingAPI Proxy-Rotation, CAPTCHAs und die Blockierung von Anfragen hinter einem einzigen Endpunkt handhaben. Nutzen Sie diese Übergabe erst, nachdem Sie sich vergewissert haben, dass das Problem auf der Anfrageebene liegt und nicht auf fehlende Browserinteraktion oder unzureichende Berechtigungen zurückzuführen ist.

Über den Autor

Suciu Dan, Mitbegründer @ WebScrapingAPI

Suciu Dan

Mitbegründer

Suciu Dan ist Mitbegründer von WebScrapingAPI und verfasst praxisorientierte, auf Entwickler zugeschnittene Anleitungen zu den Themen Web-Scraping mit Python, Web-Scraping mit Ruby und Proxy-Infrastruktur.

Web-Scraping mit AWS Lambda: Leitfaden für Python und Java 2026
Anleitungen

Web-Scraping mit AWS Lambda: Leitfaden für Python und Java 2026

Kurz gesagt: Web-Scraping mit AWS Lambda funktioniert am besten, wenn jeder Aufruf kurz, begrenzt und unabhängig wiederholbar ist. Beginnen Sie mit direktem HTTP, AWS SAM und S3 und fügen Sie erst dann SQS, Container, Browser-Rendering, Proxys oder eine verwaltete Abrufebene hinzu, wenn sich im Rahmen der Arbeitslast herausstellt, dass diese erforderlich sind.

Suciu Dan26 min read
Artikel lesen
Wie man Redfin scrappt: Python-Leitfaden für Immobiliendaten
Anleitungen

Wie man Redfin scrappt: Python-Leitfaden für Immobiliendaten

TL;DR: Redfin stellt versteckte API-Endpunkte zur Verfügung, die strukturiertes JSON für Immobilienangebote zurückgeben, wodurch das fragile HTML-Parsing vollständig übersprungen werden kann. Diese Anleitung führt Sie durch den Aufbau eines Python-Scrapers, der Miet- und Verkaufsdaten extrahiert, nach Standort sucht, neue Angebote über XML-Sitemaps überwacht und saubere Ergebnisse in CSV oder JSON exportiert.

Suciu Dan11 min read
Artikel lesen
XPath Web Scraping: Ein praktischer Leitfaden mit Python-Beispielen
Anleitungen

XPath Web Scraping: Ein praktischer Leitfaden mit Python-Beispielen

TL;DR: XPath ist eine Abfragesprache zum Navigieren in HTML/XML-Bäumen nach Pfad, Attribut oder Textinhalt. Dieser Leitfaden behandelt XPath-Syntax, Achsen und Funktionen und zeigt dann funktionierende Python-Scraper mit lxml und Selenium. Sie erhalten auch einen konsolidierten Spickzettel und einen Abschnitt zur Fehlerbehebung für die häufigsten XPath-Fehler.

Suciu Dan9 min read
Artikel lesen

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.