Die ultimative Anleitung, wie man mit Go Web Scraping betreibt

Sorin-Gabriel Marica am 14. Oktober 2022

Web Scraping mit Go ist eine großartige Möglichkeit, einen schnellen und leistungsstarken Scraper zu erstellen. Das liegt daran, dass GoLang eine der besten Programmiersprachen ist, die man für Gleichzeitigkeit verwenden kann. Aber bevor ich mich darauf stürze, muss ich Ihnen erst einmal erklären, was Web Scraping ist und wie es Ihnen helfen kann.

Unter Web Scraping versteht man das Extrahieren von Daten aus Websites. Dieser Prozess kann manuell durchgeführt werden, aber dieser Ansatz ist nicht empfehlenswert, wenn es um eine große Datenmenge geht. In diesem Artikel erfahren Sie, wie Sie Ihr eigenes automatisiertes Web Scraper von Grund auf mit Go erstellen können.

Wenn Sie neu auf diesem Gebiet sind, fragen Sie sich vielleicht, welche Anwendungsfälle es für Web Scraping gibt. Hier ist eine kleine Liste mit ein paar der häufigsten:

  1. Preisvergleichs-Tools - Mit einem Web Scraper können Sie viele Tools erstellen. Eines der gängigsten und nützlichsten ist ein Preisvergleichstool. Ein solches Tool würde die Preise für ein Produkt aus vielen Quellen zusammensuchen und das bestmögliche Angebot anzeigen.
  2. Maschinelles Lernen - Wenn Sie ein Modell mit Hilfe des maschinellen Lernens erstellen möchten, benötigen Sie einen Trainingsdatensatz. Manchmal finden Sie zwar vorhandene Datensätze, die Sie verwenden können, aber oft müssen Sie sich die benötigten Daten selbst beschaffen.
  3. Marktforschung - Ein dritter Anwendungsfall ist das Auslesen von Informationen aus dem Internet, um herauszufinden, wer Ihre Konkurrenten sind und was sie tun. Auf diese Weise können Sie mit der Konkurrenz mithalten oder ihr einen Schritt voraus sein, da Sie über jede neue Funktion informiert sind, die sie möglicherweise hinzugefügt haben.

Was benötigen Sie zum Scrapen von Daten mit go

Bevor wir beginnen, müssen Sie in der Lage sein, GoLang-Code auf Ihrem Rechner auszuführen. Dazu müssen Sie nur Go installieren, falls Sie das noch nicht getan haben. Weitere Details zur Installation von Go und wie Sie überprüfen können, ob Sie es installiert haben, finden Sie hier.

Außerdem benötigen Sie eine IDE oder einen Texteditor Ihrer Wahl, mit dem wir den Code schreiben werden. Ich bevorzuge Visual Studio Code, aber Sie können natürlich auch ein anderes Programm verwenden, das Sie für geeignet halten.

Und das war's. Ziemlich einfach, oder? Kommen wir nun zum Hauptthema dieses Artikels: Web Scraping mit Go.

Einen Web Scraper mit Go erstellen

Um unseren Scraper zu erstellen, brauchen wir zunächst einen Zweck, eine Reihe von Daten, die wir aus einer bestimmten Quelle sammeln wollen. Daher habe ich als Thema für unseren Scraper das Scrapen der wöchentlichen Downloads der ersten Pakete von npmjs.com gewählt, die das Schlüsselwort "framework" verwenden. Sie sind auf dieser Seite zu finden: https://www.npmjs.com/search?q=keywords:framework&page=0&ranking=optimal)

Überprüfen Sie den Inhalt der Seite, die Sie auslesen möchten

Um Scraping richtig durchzuführen, müssen Sie, bevor Sie mit der eigentlichen Extraktion der Daten beginnen, sehen, wo sich die Daten befinden. Damit meine ich, dass Sie die HTML-Selektoren zur Abfrage der Daten auf der Grundlage der HTML-Struktur der Seite erstellen müssen.

Um die HTML-Struktur der Seite zu sehen, können Sie die in den meisten modernen Browsern verfügbaren Entwickler-Tools verwenden. In Chrome können Sie dies auf der Seite tun, indem Sie mit der rechten Maustaste auf das Element klicken, das Sie extrahieren möchten, und dann auf "Seite inspizieren". Daraufhin sehen Sie etwa so aus:

blog-image

Auf der Grundlage des HTML, das Sie rechts sehen können (das Inspektionsfenster), können wir nun die Selektoren erstellen, die wir verwenden werden. Von dieser Seite benötigen wir nur die URLs der einzelnen Pakete.

By looking over the HTML, we can see that the css classes used by the website are code generated. This makes them not reliable for scraping so we will use the html tags instead. On the page we can see that the packages are  in <section> tags and that the link to the package is in the first div from the first div of the section.

Knowing this we can build the following selector to extract the links of all the packages: section > div:first-child > div:first-child a. Before trying it in code, we can test the selector from the developer tools of the browser. To do this go to the console tab and run document.querySelectorAll("{{ SELECTOR }}"):

blog-image

Wenn wir mit dem Mauszeiger über jedes der zurückgegebenen Nodelist-Elemente fahren, können wir feststellen, dass es sich um genau die Elemente handelt, nach denen wir gesucht haben, so dass wir diesen Selektor verwenden können.

Scraping einer Seite mit Go

Wir beginnen nun endlich mit der Erstellung des Scrapers! Dazu sollten Sie zunächst einen Ordner erstellen, in dem wir unseren gesamten Code ablegen werden. Als Nächstes müssen Sie ein Terminalfenster öffnen, entweder von Ihrer IDE oder von Ihrem Betriebssystem aus, und zu unserem Ordner gehen.

Um ein Terminal im Ordner zu öffnen, können Sie mit Visual Studio Code auf Terminal -> Neues Terminal (in der oberen Leiste) klicken.

blog-image

Nun, da wir unser Terminal geöffnet haben, ist es an der Zeit, das Projekt zu initialisieren. Sie können dies tun, indem Sie den Befehl ausführen:

go mod init webscrapingapi.com/my-go-scraper

Dadurch wird in Ihrem Ordner eine Datei namens go.mod mit folgendem Inhalt erstellt:

Modul webscrapingapi.com/my-go-scraper
go 1.19

Um die Anfrage an die Seite zu stellen und die Selektoren aus dem HTML zu extrahieren, werden wir Colly verwenden, ein GoLang-Paket( weitere Informationenfinden Sie in der Colly-Dokumentation ). Um dieses Paket zu installieren, müssen Sie Folgendes ausführen

go get github.com/gocolly/colly

Nun, da wir alles vorbereitet haben, müssen wir nur noch unsere Datei main.go erstellen und etwas Code aufschreiben. Der Code zum Extrahieren aller Links von der ersten Seite der npmjs-Frameworks lautet wie folgt:

package main

import (
"fmt"
"github.com/gocolly/colly"
)

func scrape() {
c := colly.NewCollector()

// Find and print all links
c.OnHTML("section > div:first-child > div:first-child a", func(e *colly.HTMLElement) {
fmt.Println(e.Attr("href"))
})
c.Visit("https://www.npmjs.com/search?q=keywords:framework&page=0&ranking=optimal")
}

func main() {
scrape()
}

Wenn dies auf den ersten Blick schwer zu lesen ist, machen Sie sich keine Sorgen, wir werden es in den folgenden Abschnitten aufschlüsseln und erklären. 

Jede Golang-Datei sollte mit dem Paketnamen und den Importen beginnen, die Go verwenden wird. In diesem Fall sind die beiden Pakete, die wir verwenden, "fmt", um die Links zu drucken, die wir scrapen, und "Colly" (für das eigentliche Scraping).

Im nächsten Teil haben wir die Funktion scrape() erstellt, die sich um das Scrapen der benötigten Links kümmert. Dazu besucht die Funktion die erste Seite und wartet darauf, dass der von uns gewählte Selektor gefunden wird. Wenn ein Element aus diesem Selektor auftaucht, gibt sie das href-Attribut dieses Elements aus.

Der letzte Teil ist die main-Funktion, die jedes Mal aufgerufen wird, wenn wir ein Golang-Skript ausführen. Um den vorherigen Code auszuführen, starten Sie main.go von Ihrem Terminal aus und Sie sollten die folgende Ausgabe erhalten:

blog-image

Wie Sie sehen können, hat das href-Attribut relative Pfade zu den Links, also müssen wir ihm die npmjs-Url voranstellen.

GoLang's Gleichzeitigkeit für Effizienz nutzen

Eine der coolsten Funktionen von GoLang sind die GoRoutinen. GoRoutinen sind einfache, leichtgewichtige Threads, die von der Go-Laufzeit verwaltet werden. Das Tolle daran ist, dass Go uns dabei helfen kann, viele URLs gleichzeitig und blitzschnell zu scrapen.

Bisher haben wir die Links für die ersten 20 Pakete unter dem Stichwort "framework" auf npmjs.com extrahiert. Jetzt werden wir versuchen, alle diese Links gleichzeitig zu scrapen und die wöchentlichen Downloads für jedes dieser Pakete zu extrahieren. Zu diesem Zweck werden wir GoRoutines und WaitGroups verwenden.

Hier ist der endgültige Code zum Extrahieren der wöchentlichen Downloads unter Verwendung der Goroutinen:

package main

import (
"fmt"
"github.com/gocolly/colly"
"sync"
)

func scrapeWeeklyDownloads(url string, wg *sync.WaitGroup) {
defer wg.Done()

c := colly.NewCollector()

// Find and print the weekly downloads value
c.OnHTML("main > div > div:last-child > div:not([class]) p", func(e *colly.HTMLElement) {
fmt.Println(fmt.Sprintf("%s - %s", url, e.Text))
})
c.Visit(url)
}

func scrape() {
c := colly.NewCollector()

var wg sync.WaitGroup

// Find and print all links
c.OnHTML("section > div:first-child > div:first-child a", func(e *colly.HTMLElement) {
wg.Add(1)
go scrapeWeeklyDownloads(fmt.Sprintf("%s%s", "https://www.npmjs.com", e.Attr("href")), &wg)
})
c.Visit("https://www.npmjs.com/search?q=keywords:framework&page=0&ranking=optimal")

wg.Wait()
}

func main() {
scrape()
}

Lassen Sie uns nun besprechen, was zu unserem vorherigen Code hinzugefügt wurde. Zunächst werden Sie feststellen, dass wir ein neues Paket namens "sync" importiert haben. Damit können wir Golang-Routinen verwenden und warten, bis die Threads beendet sind, bevor die Ausführung des Programms gestoppt wird.

Als nächstes wurde eine neue Funktion namens "scrapeWeeklyDownloads" hinzugefügt. Diese Funktion akzeptiert zwei Parameter: die URL des Links, den wir scrapen wollen, und einen WaitGroup-Zeiger. Diese Funktion besucht die angegebene URL und extrahiert die wöchentlichen Downloads (unter Verwendung des Selektors main > div > div:last-child > div:not([class]) p).

Die letzte Änderung, die Sie bemerken werden, war in der Scrape-Funktion, wo wir eine WaitGroup mit var wg sync.WaitGroup erstellt haben. Hier haben wir für jeden Link auf der Paketseite wg.Add(1) verwendet und dann eine GoRoutine erstellt, die die Funktion scrapeWeeklyDownloads aufruft. Am Ende der Funktion sorgt die Anweisung wg.Wait() dafür, dass der Code wartet, bis alle GoRoutines ihre Ausführung beendet haben. 

Weitere Informationen zu WaitGroups finden Sie in diesem Beispiel von golang

Warum GoRoutines und WaitGroups?

Durch die Verwendung von Gleichzeitigkeit in Golang mit GoRoutines und WaitGroups können wir einen sehr schnellen Scraper erstellen. Die Ausführung des vorherigen Codebeispiels liefert die Seite und die wöchentlichen Downloads jedes Pakets. Da wir jedoch Multi-Threading verwenden, ist die Reihenfolge, in der diese Informationen angezeigt werden, unbekannt (da Threads mit unterschiedlichen Geschwindigkeiten ausgeführt werden)

Wenn Sie den Code unter Linux oder dem Windows Subsystem Linux (wsl) ausführen, können Sie time go run main.go verwenden, um die Ausführungszeit des gesamten Skripts zu sehen. Bei mir liegt die Ausführungszeit bei etwa 5 bis 6 Sekunden. Das ist sehr schnell, wenn man bedenkt, dass wir 21 Seiten durchforsten (zuerst die Seite mit den Paketen und dann die Seiten der einzelnen Pakete).

Andere Hindernisse

Die meisten Scraper verlassen sich darauf, eine einfache HTTP-Anfrage an die Seite zu stellen, um den benötigten Inhalt zu erhalten. Diese Lösung ist gut, aber manchmal zeigen Websites ihre Informationen durch Javascript-Rendering an. Das bedeutet, dass die Website Ihnen zunächst nur einen Teil ihres Inhalts zeigt und den Rest dynamisch über Javascript lädt.

Um solche Seiten zu scrapen, müssen Sie Chromedriver verwenden und einen echten Chrome-Browser steuern. Es gibt zwar einige Optionen, um dies in Golang zu tun, aber Sie müssen für dieses Thema einige zusätzliche Recherchen anstellen.

Auch wenn die Javascript-Wiedergabe abgedeckt ist, gibt es noch einige zusätzliche Hindernisse beim Scraping einer Website. Einige Websites verwenden Antibot-Erkennungen, IP-Sperren oder Captchas, um Bots am Scrapen ihrer Inhalte zu hindern. Um diese Websites dennoch zu scrapen, können Sie versuchen, einige Tipps und Tricks für das Web-Scraping anzuwenden, z. B. indem Sie Ihren Scraper langsamer machen und sich menschenähnlicher verhalten.

Aber wenn Sie Ihren Scraper schnell halten und diese Hindernisse auf einfache Weise überwinden wollen, können Sie WebScrapingAPI verwenden. WebScrapingAPI ist eine API, die Ihnen beim Scrapen hilft, indem sie Ihre IP rotiert und Antibot-Erkennungen vermeidet. Auf diese Weise können Sie weiterhin die blitzschnelle Geschwindigkeit von GoLang nutzen und Ihre Daten in kürzester Zeit scrapen.

Fazit zu Web Scraping mit Go

Web Scraping ist eine gute und schnelle Methode, um Daten aus dem Internet zu extrahieren, und sie kann für viele verschiedene Anwendungsfälle genutzt werden. Sie können Daten für Ihr maschinelles Lernmodell extrahieren oder eine Anwendung von Grund auf mit den gescrapten Daten erstellen.

GoLang ist eine der besten Lösungen, die es gibt, wenn es um Gleichzeitigkeit geht. Mit GoLang und Colly können Sie einen schnellen Scraper bauen, der Ihre Daten in kürzester Zeit liefert. Das macht Web-Scraping mit Go sehr einfach und effizient, sobald man sich an die Syntax von Go gewöhnt hat

Nachrichten und Aktualisierungen

Bleiben Sie auf dem Laufenden mit den neuesten Web Scraping-Anleitungen und Nachrichten, indem Sie unseren Newsletter abonnieren.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Ähnliche Artikel

Vorschaubild
AnwendungsfälleXPath vs. CSS-Selektoren

Sind XPath-Selektoren besser als CSS-Selektoren für Web Scraping? Erfahren Sie mehr über die Stärken und Grenzen der einzelnen Methoden und treffen Sie die richtige Wahl für Ihr Projekt!

Mihai Maxim
Autorenavatar
Mihai Maxim
8 Minuten lesen
Vorschaubild
LeitfädenFinden Sie heraus, wie man HTML-Tabellen mit Golang scrapen kann

Lernen Sie, wie man HTML-Tabellen mit Golang für eine leistungsstarke Datenextraktion scrapen kann. Erforschen Sie die Struktur von HTML-Tabellen und erstellen Sie einen Web-Scraper mit der Einfachheit, Gleichzeitigkeit und der robusten Standardbibliothek von Golang.

Andrej Ogiolan
Autorenavatar
Andrej Ogiolan
8 Minuten lesen
Vorschaubild
LeitfädenWie man einen Proxy mit Node Fetch verwendet und einen Web Scraper erstellt

Lernen Sie, wie man Proxys mit node-fetch, einem beliebten JavaScript-HTTP-Client, verwendet, um Web-Scraper zu erstellen. Verstehen Sie, wie Proxys im Web Scraping funktionieren, integrieren Sie Proxys mit Node-Fetch und erstellen Sie einen Web Scraper mit Proxy-Unterstützung.

Mihnea-Octavian Manolache
Autorenavatar
Mihnea-Octavian Manolache
8 Minuten lesen