Webseiten nach String absuchen



  • Hallo,

    ich bin auf der Suche nach einem C++-Code.
    Es sollen Webseiten abgesucht werden. Deren Links setzen sich zusammen aus einem String, der immer gleich ist und dahinter einer Nummer, die variiert, also so:
    vollständigerulrstring = Stringderimmergleichist & Nummer.

    Ich brauche nun einen Code, der (irgendwie per Loop) alle diese Webseiten (Nummer 4 bis 23234) nach einem bestimmten Wort sucht und exakt die url findet, in welcher das entsprechende Wort enthalten ist.

    Kurzes (irreales) Beispiel:
    Stringderimmergleichist = "www.beispiel.de/blabla"
    Nummer = 3
    --> vollständigerurlstring = "www.beispiel.de/blabla3

    Ich möchte nun alle Seiten für die Nummern 3 bis 1000 nach dem Wort "amöbe" absuchen.

    Vielen Dank!! 🙂
    amöbe



  • amöbe schrieb:

    Ich möchte nun alle Seiten für die Nummern 3 bis 1000 nach dem Wort "amöbe" absuchen.

    Vielen Dank!! 🙂
    amöbe

    viel erfolg!

    (ansatz?)



  • Naja, Seite(n) runterladen und einen String-Search-Algo anwenden.

    Ich kann dir nicht sagen, inwiefern C++ dazu taugt, aber in Java, PHP und Perl ist das recht trivial.



  • Hallo Andromeda,

    wie geht denn das in Java? Mir geht es mehr um die Zweckmäßigkeit, weniger darum welche Programmiersprache ich verwende. Ich dachte an C++, da das die einzige dieser Programmiersprachen ist, welche ich so halbwegs kann. Von Java hab ich leider nicht so viel Ahnung. Aber wenn das so trivial ist, dass du mir den Code sagen kannst, wär das super.

    Viele Grüße,
    amöbe



  • in C++ benötigst du zumindest eine externe bibliothek, die dir die nötige funktionalität zur verfügung stellt. z.b. curl

    https://github.com/JosephP91/curlcpp/blob/master/README.md

    #include <iostream>
    #include <ostream>
    
    #include "curl_easy.h"
    #include "curl_form.h"
    #include "curl_ios.h"
    #include "curl_exception.h"
    
    using std::cout;
    using std::endl;
    using std::ostringstream;
    
    using curl::curl_easy;
    using curl::curl_ios;
    using curl::curl_easy_exception;
    using curl::curlcpp_traceback;
    
    int main() {
        // Create a stringstream object
        ostringstream str;
        // Create a curl_ios object, passing the stream object.
        curl_ios<ostringstream> writer(str);
    
        // Pass the writer to the easy constructor and watch the content returned in that variable!
        curl_easy easy(writer);
        // Add some option to the easy handle
        easy.add<CURLOPT_URL>("http://www.google.it");
        easy.add<CURLOPT_FOLLOWLOCATION>(1L);
        try {
            // Execute the request.
            easy.perform();
        } catch (curl_easy_exception error) {
            // If you want to get the entire error stack we can do:
            curlcpp_traceback errors = error.get_traceback();
            // Otherwise we could print the stack like this:
            error.print_traceback();
            // Note that the printing the stack will erase it
        }
        // Let's print the stream content.
        cout<<str.str()<<endl;
        return 0;
    }
    

    nichts mit reinem standard C++.

    wie du dir den URL zusammenbaust und text durchsuchst, weißt du hoffentlich.



  • amöbe schrieb:

    Hallo Andromeda,

    wie geht denn das in Java? Mir geht es mehr um die Zweckmäßigkeit, weniger darum welche Programmiersprache ich verwende. Ich dachte an C++, da das die einzige dieser Programmiersprachen ist, welche ich so halbwegs kann. Von Java hab ich leider nicht so viel Ahnung. Aber wenn das so trivial ist, dass du mir den Code sagen kannst, wär das super.

    Viele Grüße,
    amöbe

    Um eine Seite in einen String zu laden: http://stackoverflow.com/questions/4328711/read-url-to-string-in-few-lines-of-java-code

    Und dann einfach das: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf(java.lang.String)

    In C++ gibt es sowas wie strstr, aber das Laden der Seite in einen String mag wohl nicht ganz so einfach sein.



  • Machen wir ein simples Perl-\1:

    use 5.14.0;
    use warnings;
    use LWP::Simple;
    
    for my $i (3..1000) {
        my $html = get("http://www.beispiel.de/blabla$i");
        if ($html =~ /amöbe/) {
            say "Gefunden in http://www.beispiel.de/blabla$i"
        }
    }
    

    Fehlt nur noch, dass amöbe auch als amöbe oder noch anders kodiert sein könnte - dann müsstest du das html parsen oder vielleicht einfacher nach ein paar alternativen Schreibmöglichkeiten suchen.

    Alternativ einfach die 1000 Seiten erstmal runterladen und dann einfach darin greppen? Wozu als Programm?

    Ich käme nie auf die Idee, sowas in C++ zu machen.



  • Mit curl ist nichts leichter als das.

    #include "curl/curl.h"
    #include <iostream>
    
    static std::size_t write_callback(char* buffer, std::size_t size, std::size_t blocks, std::string* s){
        return s->append(buffer, buffer + (int)(size *= blocks)), size;
    }
    
    int main(){
        curl_global_init(CURL_GLOBAL_ALL);
    
        std::string html;
        CURL* handle = curl_easy_init();
    
        curl_easy_setopt(handle, CURLOPT_WRITEDATA, &html);
        curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, &write_callback);
        curl_easy_setopt(handle, CURLOPT_URL, "http://google.com");
        curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1);
    
        curl_easy_perform(handle);
        std::cout << std::boolalpha << (html.find("<title>") != std::string::npos);
    
        curl_easy_cleanup(handle);
        curl_global_cleanup();
    }
    

    Oder du baust dir wie dove schon gezeigt hat eigene Curl-Klassen, das sieht dann nochmal hübscher aus:

    #include "collection/curl/http_request.hpp"
    #include <iostream>
    #include <sstream>
    
    int main(){
        std::stringstream stream;
        curl::get_request request{stream, "http://google.com"};
        request.perform();
        std::cout << std::boolalpha << (stream.str().find("<title>") != std::string::npos) << '\n';
    }
    


  • Hat alles super funktioniert! Danke euch!! 👍 🙂


Anmelden zum Antworten