Quelltext einer Webseite auslesen // anderen Browser vorgaukeln



  • Hallo liebe C++-Gemeinde,

    ich stehe vor einem Problem und benötige noch einmal Eure Hilfe.
    Ich möchte gerne den Quelltext von Internetseiten auslesen. Das Problem ist, dass die Seite, nachdem der Browser schon den Status "fertig" hat, Daten nachlädt. Zwischen dem Aufrufen der Webseite und dem Auslesen des Quelltextes muss ich daher noch Zeit verstreichen lassen. Ihr könnt das gerne testen, indem ihr manuell die im Code angegebene URL aufruft.

    Was das "Zeit verstreichen lassen" angeht, habe ich folgenden Ansatz:
    Ich rufe die Webseite auf und lade dann in einer Schleife so lange den Quelltext, bis ein Textsegment, dass erst mit dem Nachladen in den Quelltext kommt, vorhanden ist. Ich habe das unter VBA aus Access heraus probiert und das klappt problemlos. Allerdings führt das Aufrufen des Internet Explorers mit mehrmaligem Seitenaufruf über den Navigate-Befehls zu einem konstanten Speichersanstieg bis zum Fast-Stillstand des Internet Explorers. Zahlreiche VBA-Foren haben darüber diskutiert und es am Ende als nicht umgehbaren Speicherleak des IE eingestuft. Schade.

    Somit dachte ich mir, entwickle ich in C++, liegt mir eh mehr als VBA 😃

    Ich gehe zunächst einmal davon aus, dass ich die Indy-Komponente nicht gebrauchen kann, da mir keine Möglichkeit bekannt ist, nach dem Aufruf der Seite (htmlstring = F_Main->IdHTTP1->Get(url)) den Quelltextes mehrmals auzulesen, bis die gewünschten Segmente geladen wurden, oder?

    Das bringt mich zur TCppWebBRowser-Komponente und folgendem Code:

    void __fastcall TF_Main::BitBtn1Click(TObject *Sender)
    {
       AnsiString url = "http://openbook.etoro.com/DevilTrader/#/portfolio/Copied_Traders/";
    
       try
       {
    
          F_Main->WB_Site1->Navigate(WideString(url));
          while(!WB_Site1->Busy) Application->ProcessMessages();
          while(WB_Site1->Busy) Application->ProcessMessages();
    
          //die folgende Zeile in eine Schleife, solange bis gewünschtes Segment vorhanden ist     
          ExtractHtmlCodeOfCurrentPage(WB_Site1, F_Main->RichEdit1->Lines, true);
       }
    
       catch(Exception &e)
       {
          Application->MessageBoxA(e.Message.c_str(), "Fehler", MB_OK);
       }
    }
    

    In der Theorie sollte das klappen, ABER:
    Wenn ich den Code aufrufe, bekomme ich den Hinweis vom Server, dass zum Aufruf der Seite einer der folgenden Browser benötigt wird:
    - Google Chrome
    - Firefox
    - Internet Explorer
    - Safari

    Was mich zu der eigentlichen Frage meines Postings führt:
    Habe ich über die TCppWebBrowser-Komponente die Möglichkeit, dem Server vorzugaukeln, dass ich ein bestimmter Browser bin?

    Danke für Eure Ideen und Antworten.



  • Hallo,

    die TCppWebBrowser-Komponente verwendet doch die IE-Engine. Welche BCB-Version hast du denn (evtl. ist die übermittelte IE-Version zu alt)?



  • Hallo,

    ich habe BCB 6.
    Welche IE-Version nutzt die denn?



  • Die, die auf deinem Rechner drauf. Das ist eine COM Komponente vom System.



  • OK, dann scheint die TCppWebBrowser-Komponente aber etwas anderes zu übertragen.
    Auf meinem Rechner ist der IE8. Wenn ich damit die Webseite aufrufe, dann klappt alles einwandfrei.

    Rufe ich mit dem obigen Code die Webseite auf, bekomme ich die Meldung, dass ich einen der vier genannten Browser nutzen soll, also kann die TCppWebBrowser-Komponente sich nicht als IE8 ausgeben.

    Oder kann ich der TCppWebBrowser-Komponente irgendwo vorgeben, als welcher Browser sie sich ausgeben soll?



  • Hallo W.Stecher,

    ruf mal direkt vom IE 8 und von deinem Programm (mittels der TCppWebBrowser-komponente) die Seite http://www.aadmm.de/de/index.php?lang=de&page=browser-und-plugin-abfrage.html auf und vergleiche die Ergebnisse.

    Edit: anscheinend verwendet das darunterliegende ActiveX-Control bei installiertem IE8 den IE7-Modus.
    Unter http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx gibt es einen Registry-Eintrag, um den IE8-Modus zu aktivieren.



  • Hallo Th69,

    habe ich gemacht.
    Beim Aufruf der Seite direkt aus dem IE8 erhalte ich folgede Informationen:

    **Browsername:
    Microsoft Internet Explorer

    HTTP-Identifikation:
    Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Tablet PC 1.7; .NET CLR 1.0.3705; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)**

    Beim Aufruf aus meiner Applikation erhlate ich die Meldung:
    Error 404 - ein Fehler ist aufgetreten
    Die Anfrage konnte nicht eindeutig identifiziert werden, wir bitten diesen Umstand zu entschuldigen.

    Daran ändert sich auch nichts, wenn ich den Registryeintrag für meine Anwenudng setze. Egal ob DOWRD 8000 (IE8_Standard) oder 8888 (IE8 forced).

    Verschleiert die TCppWebBrowser-Komponente ihre Identität bzw. Engine?



  • Hallo,

    das ist wirklich sehr merkwürdig.

    Hast du denn evtl. einen anderen Rechner zur Verfügung, mit dem du das Programm testen kannst? Oder kannst du dein Programm (mit Aufruf der von mir verlinkten Seite) irgendwo uploaden, so daß ich es mal auf meinen Rechnern ausführen kann?



  • Hey,

    habe leider erst wieder Ende dieser Woche einen 2. Rechner zur Verfügung.
    Wäre daher sehr dankbar, wenn Du (auch) einmal testen könntest.

    Die Exe habe ich als Zip (23 KB) hier hochgeladen:
    http://www.file-upload.net/download-4334832/eToro.zip.html

    DANKE.



  • Hallo,

    da ich keinen BCB6 hier habe, fehlen mir einige DLLs. Könntest du dein Projekt "ohne Laufzeitpackages" kompilieren und "ohne dynamische RTL" linken, s. http://www.mbdealer.de/standalone-exe-datei-erstellen ?



  • Hey,

    natürlich, wenn Du schon so nett bist und testest, ist das ja wohl das mindeste, was ich machen kann.

    Ich vergesse das grundsätzlich immer und merke es erst, wenn das fertige Projekt von meinem Entwicklungsrechner auf meinen Desktop wandert und dann dort aufgrund fehlender DLLs nicht läuft ...

    Jetzt ist alles drin, sind 383 KB als ZIP:
    http://www.file-upload.net/download-4335366/eToro.zip.html

    Danke.



  • Danke.

    Leider kriege ich auf meinem Arbeitsrechner (Win7, IE8) auch "Error 404" (mit und ohne aktiviertem Registry-Key).

    Ich werde es heute abend noch mal zuhause auf meinem XP-Rechner probieren...

    P.S. Das eigenartige ist, daß wenn ich über dein Programm (eToro.exe) auf der Testseite auf "Browser Infos" klicke und dort dann bei "Browser und Plugins abfragen" den Link "Abfrage jetzt starten" drücke, dann die korrekten Infos erhalte (und zwar egal, ob der Registry-Key aktiviert ist oder nicht):

    Browsername         Microsoft Internet Explorer 
    HTTP-Identifikation Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)
    


  • W.Stecher schrieb:

    Ich vergesse das grundsätzlich immer und merke es erst, wenn das fertige Projekt von meinem Entwicklungsrechner auf meinen Desktop wandert und dann dort aufgrund fehlender DLLs nicht läuft ...

    => VMs zum Testen nehmen 😉

    Außerdem kann man das auch in den Standardprojektoptionen irgendwo einstellen, dann hast du das Problem bei zukünftigen Projekten nicht mehr.



  • Hallo W.Stecher,

    auch zuhause (XP, IE8) erhalte ich die Fehlermeldung "Error 404".

    Da es aber dann per von-Hand-navigieren funktioniert, denke ich, daß es irgendwie an den TCppWebBrowser-Einstellungen bzw. dem Aufruf liegt.
    Du könntest mal den erzeugten HTTP-Request mitloggen, z.B. mittels WireShark.


Anmelden zum Antworten