Gut, werde ich versuchen, Sie in die richtige Richtung zu weisen. Konzeptionell ist ein Webcrawler ziemlich einfach. Es dreht sich um eine FIFO-Warteschlangen-Datenstruktur, die ausstehende URLs speichert. C++ verfügt über eine integrierte Warteschlangenstruktur in der Standardbibliothek std::queue
, mit der Sie URLs als Zeichenfolgen speichern können.
Der grundlegende Algorithmus ist ziemlich einfach:
- mit einer Basis-URL beginnen, die Sie auswählen , und legen Sie es auf der Spitze Warteschlange
- Pop die URL an der Spitze der Warteschlange und laden sie es
- Parse die heruntergeladene HTML-Datei und extrahieren alle Verbindungen
- Einfügen jedes extrahiert Link in die Warteschlange
- Goto Schritt 2 oder stoppen, sobald Sie
nun einige angegebene Grenze erreicht, sagte ich, dass ein webcrawler konzeptionell einfach ist, aber es ist nicht so einfach zu implementieren. Wie Sie aus dem obigen Algorithmus sehen können, benötigen Sie: eine HTTP-Netzwerkbibliothek zum Herunterladen von URLs, und einen guten HTML-Parser, mit dem Sie Links extrahieren können. Sie haben erwähnt, dass Sie wget
verwenden können, um Seiten herunterzuladen. Das vereinfacht die Dinge etwas, aber Sie müssen die heruntergeladenen HTML-Dokumente noch analysieren. HTML korrekt zu analysieren ist eine nicht-triviale Aufgabe. Eine einfache String-Suche nach <a href=
funktioniert nur manchmal. Wenn dies jedoch nur ein Spielzeugprogramm ist, mit dem Sie sich mit C++ vertraut machen, reicht möglicherweise eine einfache String-Suche für Ihre Zwecke aus. Andernfalls müssen Sie eine seriöse HTML-Parsing-Bibliothek verwenden.
Es gibt auch andere Überlegungen, die Sie berücksichtigen müssen, wenn Sie einen Webcrawler schreiben, wie Höflichkeit. Die Leute werden sauer sein und möglicherweise Ihre IP-Adresse verbieten, wenn Sie versuchen, zu viele Seiten zu schnell vom selben Host herunterzuladen. Daher müssen Sie möglicherweise eine Art von Richtlinie implementieren, bei der Ihr Webcrawler eine kurze Zeit wartet, bevor Sie jede Site herunterladen. Sie brauchen auch einen Mechanismus, um das erneute Herunterladen der gleichen URL zu vermeiden, befolgen Sie die robots exclusion protocol, vermeiden Sie Crawler-Traps, etc ... All diese Details summieren sich dazu, dass die Implementierung eines robusten Webcrawlers nicht so einfach ist.
Das sagte, ich stimme mit larsmans in den Kommentaren überein. Ein Webcrawler ist nicht der beste Weg, C++ zu lernen. Außerdem ist C++ nicht die beste Sprache, um einen Webcrawler zu schreiben. Der in C++ verfügbare rohe und niedrige Zugriff ist nutzlos, wenn man ein Programm wie einen Webcrawler schreibt, der die meiste Zeit darauf wartet, dass URLs aufgelöst werden herunterladen. Eine höhere Skriptsprache wie Python oder etwas anderes ist meiner Meinung nach besser für diese Aufgabe geeignet.
Zuerst lernen Sie C++ richtig, dann versuchen Sie etwas so kompliziert wie ein Crawler zu tun. –
Hmm ... Sogar ein einfacher Crawler? Nicht so kompliziert wie Larbin. Ich denke, während der Crawler wird mir helfen, viele Dinge in C++ zu lernen. Schätze, mein Denken ist falsch – popurity09
betrachten Sie mit https://github.com/Microsoft/cpprestdk – Sergei