Der ultimative Leitfaden für Web Scraping mit C++

Raluca Penciuc am 05. Juli 2021

Vor zwei Millionen Jahren dachten sich ein paar Höhlenmenschen, dass ein Stein auf einem Stock nützlich sein könnte. Von da an liefen die Dinge nur noch ein wenig aus dem Ruder. Heute geht es bei unseren Problemen weniger darum, vor Säbelzahntigern wegzulaufen, sondern eher darum, dass Teamkollegen ihre Verpflichtungen "did sutff" nennen.

Die Schwierigkeiten haben sich zwar geändert, nicht aber unsere Besessenheit, Werkzeuge zu entwickeln, um sie zu überwinden. Web Scraper sind ein Beweis dafür. Sie sind digitale Werkzeuge, die digitale Probleme lösen sollen.

Heute werden wir ein neues Tool von Grund auf bauen, aber statt Steinen und Stöcken werden wir C++ verwenden, was wohl schwieriger ist. Bleiben Sie also dran, um zu erfahren, wie man einen C++ Web Scraper erstellt und wie man ihn benutzt!

Verstehen von Web Scraping

Unabhängig davon, welche Programmiersprache Sie wählen, müssen Sie verstehen, wie Web Scraper funktionieren. Dieses Wissen ist entscheidend, um das Skript zu schreiben und am Ende des Tages ein funktionierendes Tool zu haben.

Die Vorteile von Web Scraping

Es ist nicht schwer, sich vorzustellen, dass ein Bot, der all Ihre Recherchen für Sie erledigt, viel besser ist als das Kopieren von Informationen von Hand. Die Vorteile wachsen exponentiell, wenn Sie große Mengen an Daten benötigen. Wenn Sie z. B. einen Algorithmus für maschinelles Lernen trainieren, kann Ihnen ein Web Scraper monatelange Arbeit ersparen.

blog-image

Der Klarheit halber wollen wir alle Möglichkeiten durchgehen, wie Web Scraper Ihnen helfen können:

  • Weniger Zeit mit mühsamer Arbeit verbringen - das ist der offensichtlichste Vorteil. Scraper extrahieren Daten so schnell, wie Ihr Browser zum Laden der Seite brauchen würde. Geben Sie dem Bot eine Liste von URLs, und Sie erhalten sofort deren Inhalt.
  • Höhere Datengenauigkeit - menschliche Hände führen unweigerlich zu menschlichen Fehlern. Im Vergleich dazu wird der Bot immer alle Informationen abrufen, und zwar genau so, wie sie präsentiert werden, und sie gemäß Ihren Anweisungen auswerten.
  • Behalten Sie eine organisierte Datenbank - je mehr Daten Sie sammeln, desto schwieriger kann es werden, den Überblick zu behalten. Der Scraper sammelt nicht nur Inhalte, sondern speichert sie auch in dem Format, das Ihnen das Leben leichter macht.
  • Verwenden Sie aktuelle Informationen - in vielen Situationen ändern sich die Daten von einem Tag auf den anderen. Schauen Sie sich zum Beispiel die Aktienmärkte oder die Angebote von Online-Shops an. Mit ein paar Zeilen Code kann Ihr Bot dieselben Seiten in festen Abständen abrufen und Ihre Datenbank mit den neuesten Informationen aktualisieren.

WebScrapingAPI bietet Ihnen all diese Vorteile und umgeht gleichzeitig die verschiedenen Hindernisse, auf die Scraper im Internet häufig stoßen. All das klingt großartig, aber wie lassen sie sich in konkrete Projekte umsetzen?

Anwendungsfälle von Web Scraping

Es gibt viele verschiedene Möglichkeiten, Web Scraper einzusetzen. Der Himmel ist die Grenze! Dennoch gibt es einige Anwendungsfälle, die häufiger vorkommen als andere.

blog-image

Gehen wir näher auf die einzelnen Situationen ein:

  • Suchmaschinenoptimierung - Das Durchsuchen von Suchergebnisseiten nach Ihren Schlüsselwörtern ist ein einfacher und schneller Weg, um festzustellen, wen Sie im Ranking übertreffen müssen und welche Art von Inhalt Ihnen dabei helfen kann.
  • Marktforschung - Nachdem Sie überprüft haben, wie Ihre Konkurrenten bei der Suche abschneiden, können Sie weiter gehen und ihre gesamte digitale Präsenz analysieren. Verwenden Sie den Web Scraper, um zu sehen, wie sie PPC einsetzen, ihre Produkte beschreiben, welche Art von Preismodell sie verwenden und so weiter. Im Grunde stehen Ihnen alle öffentlichen Informationen zur Verfügung.
  • Markenschutz - Die Leute da draußen sprechen über Ihre Marke. Im Idealfall sind das nur gute Dinge, aber das ist keine Garantie. Ein Bot ist gut ausgerüstet, um sich auf Bewertungsportalen und Social-Media-Plattformen zurechtzufinden und Ihnen zu berichten, wenn Ihre Marke erwähnt wird. Was auch immer dort gesagt wird, Sie werden bereit sein, die Interessen Ihrer Marke zu vertreten.
  • Lead-Generierung - Es ist selten einfach, die Kluft zwischen Ihrem Vertriebsteam und möglichen Kunden im Internet zu überbrücken. Nun, es wird viel einfacher, wenn Sie einen Web Scraping Bot verwenden, um Kontaktinformationen in Online-Unternehmensregistern wie den Gelben Seiten oder Linkedin zu sammeln.
  • Content Marketing - Die Erstellung hochwertiger Inhalte ist zweifelsohne mit viel Arbeit verbunden. Sie müssen nicht nur glaubwürdige Quellen und eine Fülle von Informationen finden, sondern auch die Art des Tons und der Herangehensweise lernen, die Ihr Publikum mag. Glücklicherweise werden diese Schritte trivial, wenn Sie einen Bot haben, der die schwere Arbeit übernimmt.

Es gibt noch viele andere Beispiele. Natürlich können Sie auch eine völlig neue Methode entwickeln, um die Datenextraktion zu Ihrem Vorteil zu nutzen. Wir fördern stets die kreative Nutzung unserer API.

Die Herausforderungen des Web Scraping

So wertvoll Web Scraper auch sein mögen, es ist nicht alles eitel Sonnenschein. Einige Websites mögen es nicht, wenn sie von Bots besucht werden. Es ist nicht schwer, Ihren Scraper so zu programmieren, dass er die besuchte Website nicht ernsthaft belastet, aber seine Wachsamkeit gegenüber Bots ist gerechtfertigt. Schließlich ist die Website möglicherweise nicht in der Lage, zwischen einem gutmütigen Bot und einem bösartigen zu unterscheiden.

Daher gibt es einige Herausforderungen, auf die Scraper unterwegs stoßen.

blog-image

Die problematischsten Hürden sind:

  • IP-Sperren - Es gibt mehrere Möglichkeiten, um festzustellen, ob ein Besucher ein Mensch oder eine Maschine ist. Die Vorgehensweise nach der Identifizierung eines Bots ist jedoch viel einfacher - IP-Sperrung. Obwohl dies nicht oft vorkommt, wenn Sie die notwendigen Vorsichtsmaßnahmen ergreifen, ist es dennoch eine gute Idee, einen Proxy-Pool vorzubereiten, damit Sie weiterhin Daten extrahieren können, selbst wenn eine IP gesperrt wird.
  • Browser-Fingerprinting - Jede Anfrage, die Sie an eine Website senden, gibt auch einige Ihrer Informationen preis. Die IP-Adresse ist das häufigste Beispiel, aber die Anfrage-Header geben der Website auch Auskunft über Ihr Betriebssystem, Ihren Browser und andere kleine Details. Wenn eine Website diese Informationen verwendet, um zu erkennen, wer die Anfragen sendet, und feststellt, dass Sie viel schneller surfen, als es ein Mensch tun sollte, können Sie damit rechnen, dass Sie umgehend gesperrt werden.
  • Javascript-Rendering - Die meisten modernen Websites sind dynamisch. Das heißt, sie verwenden Javascript-Code, um die Seiten für den Benutzer anzupassen und ein maßgeschneidertes Erlebnis zu bieten. Das Problem ist, dass einfache Bots an diesem Code hängenbleiben, da sie ihn nicht ausführen können. Das Ergebnis: Der Scraper ruft Javascript ab, anstatt den vorgesehenen HTML-Code mit den relevanten Informationen.
  • Captchas - Wenn Websites nicht sicher sind, ob ein Besucher ein Mensch oder ein Bot ist, leiten sie ihn auf eine Captcha-Seite um. Für uns ist das bestenfalls ein kleines Ärgernis, aber für Bots ist es in der Regel ein kompletter Stopp; es sei denn, sie haben Captcha-Lösungsskripte integriert.
  • Anforderungsdrosselung - Die einfachste Methode, um Besucher davon abzuhalten, den Server der Website zu überlasten, besteht darin, die Anzahl der Anfragen zu begrenzen, die eine einzelne IP-Adresse innerhalb einer bestimmten Zeit senden kann. Wenn diese Zahl erreicht ist, muss der Scraper entweder den Timer abwarten oder ein Captcha lösen. In jedem Fall ist das nicht gut für Ihr Datenextraktionsprojekt.

Das Web verstehen

Wenn Sie einen Web Scraper bauen wollen, sollten Sie ein paar wichtige Konzepte darüber kennen, wie das Internet funktioniert. Schließlich wird Ihr Bot das Internet nicht nur nutzen, um Daten zu sammeln, sondern er muss sich auch unter die anderen Milliarden von Nutzern mischen.

Wir stellen uns Websites gerne wie Bücher vor, und das Lesen einer Seite bedeutet nur, dass man zur richtigen Nummer blättert und schaut. In Wirklichkeit ist es eher wie ein Telegramm, das zwischen Ihnen und dem Buch gesendet wird. Sie fordern eine Seite an, und sie wird Ihnen zugeschickt. Dann bestellen Sie die nächste Seite, und dasselbe geschieht.

Dieses ganze Hin und Her geschieht über HTTP, das Hypertext Transfer Protocol. Damit Sie, der Besucher, eine Seite sehen können, sendet Ihr Browser eine HTTP-Anfrage und erhält eine HTTP-Antwort vom Server. Der von Ihnen gewünschte Inhalt wird in dieser Antwort enthalten sein.

HTTP-Anfragen setzen sich aus vier Komponenten zusammen:

  • Die URL (Uniform Resource Locator) ist die Adresse, an die Sie Anfragen senden. Sie führt zu einer eindeutigen Ressource, die eine ganze Webseite, eine einzelne Datei oder etwas dazwischen sein kann.
  • Die Methode gibt an, welche Art von Aktion Sie durchführen möchten. Die gängigste Methode ist GET, mit der Daten vom Server abgerufen werden. Hier finden Sie eine Liste der gängigsten Methoden.
  • Die Kopfzeilen sind Metadaten, die Ihrer Anfrage eine Form geben. Wenn Sie z. B. ein Kennwort oder Anmeldedaten für den Zugriff auf Daten angeben müssen, werden diese in einer speziellen Kopfzeile aufgeführt. Wenn Sie Daten speziell im JSON-Format erhalten möchten, geben Sie dies in einer Kopfzeile an. Der User-Agent ist einer der bekanntesten Header beim Web-Scraping, da Websites ihn zur Identifizierung von Besuchern verwenden.
  • Der Body ist der allgemeine Teil der Anfrage, der Daten speichert. Wenn Sie Inhalte erhalten, wird dieser Teil wahrscheinlich leer sein. Wenn Sie hingegen Informationen an den Server senden wollen, finden Sie diese hier.

Nach dem Senden der Anforderung erhalten Sie eine Antwort, auch wenn die Anforderung keine Daten empfangen hat. Die Struktur sieht wie folgt aus:

  • Der Statuscode ist ein dreistelliger Code, der Ihnen auf einen Blick sagt, was passiert ist. Kurz gesagt, ein Code, der mit "2" beginnt, bedeutet in der Regel Erfolg, und ein Code, der mit "4" beginnt, signalisiert einen Fehler.
  • Die Kopfzeilen haben die gleiche Funktion wie ihre Gegenstücke. Wenn Sie zum Beispiel einen bestimmten Dateityp erhalten, gibt ein Header das Format an.
  • Der Body ist ebenfalls vorhanden. Wenn Sie den Inhalt mit GET angefordert haben und dies erfolgreich war, finden Sie die Daten hier.

REST-APIs verwenden HTTP-Protokolle, ähnlich wie Webbrowser. Wenn Sie also entscheiden, dass C++-Web-Scraper zu viel Arbeit machen, werden diese Informationen auch für Sie hilfreich sein, wenn Sie sich für WebScrapingAPI entscheiden , das bereits alle Herausforderungen der Datenextraktion bewältigt.

C++ verstehen

Wenn es um Programmiersprachen geht, gibt es kaum etwas Altmodischeres als C und C++. Die Sprache erschien 1985 als die perfektionierte Version von "C mit Klassen".

Obwohl C++ für die allgemeine Programmierung verwendet wird, ist es nicht wirklich die erste Sprache, die man für einen Web Scraper in Betracht ziehen würde. Sie hat einige Nachteile, aber die Idee ist nicht ohne Vorzüge. Lassen Sie uns diese erkunden, ja?

C++ ist objektorientiert, d. h., es verwendet Klassen, Datenabstraktion und Vererbung, um die Wiederverwendung von Code zu erleichtern und ihn für verschiedene Zwecke zu nutzen. Da Daten als Objekt behandelt werden, können Sie sie leichter speichern und analysieren.

Viele Entwickler kennen sich zumindest ein bisschen mit C++ aus. Selbst wenn Sie es nicht an der Uni gelernt haben, kennen Sie (oder ein Teamkollege) wahrscheinlich ein wenig C++. Das gilt für die gesamte Softwareentwicklergemeinschaft, so dass es nicht schwer sein wird, eine zweite Meinung zum Code einzuholen.

C++ ist in hohem Maße skalierbar. Wenn Sie mit einem kleinen Projekt beginnen und beschließen, dass Web Scraping das Richtige für Sie ist, ist der Großteil des Codes wiederverwendbar. Ein paar Anpassungen hier und da, und Sie sind bereit für viel größere Datenmengen.

Andererseits ist C++ eine statische Programmiersprache. Dies gewährleistet zwar eine bessere Datenintegrität, ist aber im Umgang mit dem Internet nicht so hilfreich wie dynamische Sprachen.

Außerdem ist C++ nicht gut für die Erstellung von Crawlern geeignet. Das mag kein Problem sein, wenn Sie nur einen Scraper wollen. Aber wenn Sie einen Crawler hinzufügen wollen, um URL-Listen zu erstellen, ist C++ keine gute Wahl.

Ok, wir haben über viele wichtige Dinge gesprochen, aber kommen wir zum Kern des Artikels - der Programmierung eines Web Scrapers in C++.

Erstellen eines Web Scrapers mit C++

Voraussetzungen

  1. C++-IDE. In diesem Leitfaden wird Visual Studio verwendet.
  2. vcpkg ist ein C/C++-Paketmanager, der von Windows erstellt und unterstützt wird
  3. cpr ist eine C/C++-Bibliothek für HTTP-Anfragen, die als Wrapper für das klassische cURL entwickelt wurde und von der Python-Request-Bibliothek inspiriert ist.
  4. gumbo ist ein vollständig in C geschriebener HTML-Parser, der Wrapper für mehrere Programmiersprachen, einschließlich C++, bietet.

Einrichten der Umgebung

1. Nachdem Sie Visual Studio heruntergeladen und installiert haben, erstellen Sie ein einfaches Projekt mit einer Konsolenanwendungsvorlage.

blog-image

2. Nun werden wir unseren Paketmanager konfigurieren. Vcpkg bietet ein gut geschriebenes Tutorial, damit Sie so schnell wie möglich loslegen können.

Hinweis: Wenn die Installation abgeschlossen ist, wäre es hilfreich , eine Umgebungsvariable zu setzen, damit Sie vcpkg von einem beliebigen Ort auf Ihrem Computer ausführen können.

3. Nun ist es an der Zeit, die benötigten Bibliotheken zu installieren. Wenn Sie eine Umgebungsvariable gesetzt haben, öffnen Sie ein beliebiges Terminal und führen Sie die folgenden Befehle aus:

	> vcpkg install cpr
> vcpkg install gumbo
> vcpkg integrate install

Wenn Sie keine Umgebungsvariable gesetzt haben, navigieren Sie einfach zu dem Ordner, in dem Sie vcpkg installiert haben, öffnen Sie ein Terminalfenster und führen Sie die gleichen Befehle aus.

Die ersten beiden Befehle installieren die Pakete, die wir zum Erstellen unseres Scrapers benötigen, und der dritte hilft uns, die Bibliotheken mühelos in unser Projekt zu integrieren.

Wählen Sie eine Website und prüfen Sie den HTML-Code

Und jetzt sind wir bereit! Bevor wir den Web Scraper erstellen, müssen wir eine Website auswählen und ihren HTML-Code untersuchen.

Wir sind zu Wikipedia gegangen und haben eine beliebige Seite aus dem Abschnitt "Wussten Sie schon ..." ausgewählt. Die heutige gescrapte Seite wird also der Wikipedia-Artikel über die Mohnabwehr sein, und wir werden einige seiner Bestandteile extrahieren. Werfen wir aber zunächst einen Blick auf die Seitenstruktur. Klicken Sie mit der rechten Maustaste irgendwo auf den Artikel, dann auf "Element inspizieren" und voila! Der HTML-Code ist unser.

blog-image

Auszug aus dem Titel

Jetzt können wir mit dem Schreiben des Codes beginnen. Um die Informationen zu extrahieren, müssen wir das HTML lokal herunterladen. Importieren Sie zunächst die Bibliotheken, die wir gerade heruntergeladen haben:

#include <iostream>
#include <fstream>
#include "cpr/cpr.h"
#include "gumbo.h"

Dann stellen wir eine HTTP-Anfrage an die Ziel-Website, um den HTML-Code abzurufen.

std::string extract_html_page()
{
cpr::Url url = cpr::Url{"https://en.wikipedia.org/wiki/Poppy_seed_defence"};
cpr::Response response = cpr::Get(url);
return response.text;
}

int main()
{
std::string page_content = extract_html_page();
}

Die Variable page_content enthält nun den HTML-Code des Artikels, und wir werden sie weiter verwenden, um die benötigten Daten zu extrahieren. An dieser Stelle kommt die Gumbo-Bibliothek ins Spiel.

Wir verwenden die Methode gumbo_parse, um die vorherige Zeichenkette page_content in einen HTML-Baum umzuwandeln, und rufen dann unsere implementierte Funktion search_for_title für den Wurzelknoten auf.

int main()

{

std::string page_content = extract_html_page();

GumboOutput* parsed_response = gumbo_parse(page_content.c_str());

search_for_title(parsed_response->root);

// free the allocated memory

gumbo_destroy_output(&kGumboDefaultOptions, parsed_response);

}

The called function will traverse the HTML tree in-depth to look for the <h1> tag by making recursive calls. When it finds the title, it’s displaying it in the console and will exit the execution.

void search_for_title(GumboNode* node)
{
if (node->type != GUMBO_NODE_ELEMENT)
return;

if (node->v.element.tag == GUMBO_TAG_H1)
{
GumboNode* title_text = static_cast<GumboNode*>(node->v.element.children.data[0]);
std::cout << title_text->v.text.text << "\n";
return;
}

GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; i++)
search_for_title(static_cast<GumboNode*>(children->data[i]));
}

Extrahieren Sie die Links

Das gleiche Prinzip wird für die restlichen Tags angewandt, wobei der Baum durchlaufen wird und wir das bekommen, was uns interessiert. Holen wir uns alle Links und extrahieren ihr href-Attribut.

void search_for_links(GumboNode* node)
{
if (node->type != GUMBO_NODE_ELEMENT)
return;

if (node->v.element.tag == GUMBO_TAG_A)
{
GumboAttribute* href = gumbo_get_attribute(&node->v.element.attributes, "href");
if (href)
std::cout << href->value << "\n";
}

GumboVector* children = &node->v.element.children;
for (unsigned int i = 0; i < children->length; i++)
{
search_for_links(static_cast<GumboNode*>(children->data[i]));
}
}

Sehen Sie? Ziemlich derselbe Code, mit Ausnahme des Tags, nach dem wir suchen. Die Methode gumbo_get_attribute kann jedes von uns benannte Attribut extrahieren. Daher können Sie damit nach Klassen, IDs usw. suchen.

Es ist wichtig, den Wert des Attributs vor der Anzeige auf Null zu prüfen. In höheren Programmiersprachen ist dies unnötig, da einfach ein leerer String angezeigt wird, aber in C++ wird das Programm abstürzen.

Schreiben in CSV-Datei

Es gibt viele Links, die über den gesamten Inhalt verteilt sind. Und dies war auch ein wirklich kurzer Artikel. Lassen Sie uns also alle extern speichern und sehen, wie wir sie unterscheiden können.

Zunächst erstellen und öffnen wir eine CSV-Datei. Dies geschieht außerhalb der Funktion, direkt bei den Importen. Unsere Funktion ist rekursiv, d. h. wir werden sehr viele Dateien haben, wenn sie bei jedem Aufruf eine neue Datei erstellt.

std::ofstream writeCsv("links.csv");

Dann schreiben wir in unserer Hauptfunktion die erste Zeile der CSV-Datei, bevor wir die Funktion zum ersten Mal aufrufen. Vergessen Sie nicht, die Datei zu schließen, nachdem die Ausführung abgeschlossen ist.

writeCsv << "type,link" << "\n";
search_for_links(parsed_response->root);
writeCsv.close();

Now, we write its content. In our search_for_links function, when we find a <a> tag, instead of displaying in the console now we do this:

if (node->v.element.tag == GUMBO_TAG_A)
{
GumboAttribute* href = gumbo_get_attribute(&node->v.element.attributes, "href");
if (href)
{
std::string link = href->value;
if (link.rfind("/wiki") == 0)
writeCsv << "article," << link << "\n";
else if (link.rfind("#cite") == 0)
writeCsv << "cite," << link << "\n";
else
writeCsv << "other," << link << "\n";
}
}

Wir nehmen den Wert des href-Attributs mit diesem Code und ordnen ihn in 3 Kategorien ein: Artikel, Zitate und der Rest.

blog-image

Natürlich können Sie noch viel weiter gehen und eigene Linktypen definieren, z. B. solche, die wie ein Artikel aussehen, aber eigentlich eine Datei sind.

Alternativen zum Web Scraping

Jetzt wissen Sie, wie Sie Ihren eigenen Web Scraper mit C++ erstellen können. Toll, nicht wahr?

Vielleicht haben Sie sich aber auch schon einmal gesagt: "Das macht mehr Mühe, als es wert ist!", und wir verstehen das sehr gut. Um ehrlich zu sein, ist das Programmieren eines Scrapers eine ausgezeichnete Lernerfahrung, und die Programme eignen sich für kleine Datenmengen, aber das war's dann auch schon.

Eine Web-Scraping-API ist die beste Option, wenn Sie ein schnelles, zuverlässiges und skalierbares Datenextraktionstool benötigen. Das liegt daran, dass sie über alle Funktionen verfügt, die Sie benötigen, wie einen rotierenden Proxy-Pool, Javascript-Rendering, Captcha-Löser, Geolokalisierungsoptionen und vieles mehr.

Sie glauben mir nicht? Dann sollten Sie sich selbst überzeugen! Starten Sie Ihren kostenlosen WebScrapingAPI-Test und finden Sie heraus, wie zugänglich Web Scraping sein kann!

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
LeitfädenErfahren Sie, wie Sie die Cloudflare-Erkennung mit dem besten Selenium-Browser umgehen

Erfahren Sie, welcher Browser am besten geeignet ist, um Cloudflare-Erkennungssysteme beim Web-Scraping mit Selenium zu umgehen.

Mihnea-Octavian Manolache
Autorenavatar
Mihnea-Octavian Manolache
9 Minuten lesen
Vorschaubild
Wissenschaft des Web ScrapingWeb Scraping leicht gemacht: Die Bedeutung von Data Parsing

Erfahren Sie, wie Sie mit Hilfe von Datenparsing, HTML-Parsing-Bibliotheken und schema.org-Metadaten effizient Daten für Web-Scraping und Datenanalysen extrahieren und organisieren können.

Suciu Dan
Autorenavatar
Suciu Dan
12 Minuten lesen
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