webseite auslesen



  • hi,

    ich benutze Visual C++ mit MS-Visual Studio (2005).

    Wie kann man mit Visual C++ zu einer URL verbinden und den (Quell-)Text der Webseite auslesen?

    Also ich suche eine Funktion:
    string getContentOfUrl(string url);

    In Java gehts ohne Probleme nur bei C++ weiss ich nicht mal wonach ich suchen soll.

    Danke



  • Hallo,

    Standard C++ kann sowas auch nicht. Vielleicht fragst du besser im Visual C++-Forum nach.



  • ... oder du gehst -betriebssystemabhängig- in die socketprogrammierung selber hinein:
    http://www.c-worker.ch/winsock/getpage.c



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Vielleicht kannste dir ja auch was aus den FAQ abgucken:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39078.html



  • isabeau schrieb:

    Vielleicht kannste dir ja auch was aus den FAQ abgucken:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39078.html

    Danke. Aber er liefert mit einen seltsamen String zurueck.

    Ich habe folgendes gemacht:

    CString blubb = GetSourceHtml( _T("http://www.google.de/") );
    
    MessageBox(blubb);
    
    CString GetSourceHtml(CString url)
       {      
          CString somecode, s;      
          CInternetSession session;
          CInternetFile* file = NULL;
    
          try
          {      
             file = (CInternetFile*) session.OpenURL(url);
          }
          catch (CInternetException* m_pException)
          {      
             file = NULL;
             m_pException->Delete();
          }
    
          if(file)
          {      
             while (file->ReadString(somecode) != NULL)
             {
                s = s + somecode;
             }
          }
    
          file->Close();
          return s;
       }
    

    Der String (blubb) ist dann (in Messagebox und bei Haltepunkt-schnellueberwachung):

    "格浴㹬格慥㹤洼瑥⁡瑨灴攭畱癩∽潣瑮湥⵴祴数•潣瑮湥㵴琢硥⽴瑨汭※档牡敳㵴卉ⵏ㠸㤵ㄭ㸢琼瑩敬䜾潯汧㱥琯瑩敬㰾瑳汹㹥ℼⴭ潢祤琬ⱤⱡⱰ栮晻湯⵴慦業祬愺楲污猬湡⵳敳楲㭦੽栮晻湯⵴楳敺›〲硰紻焮捻汯牯⌺〰〰捣紻ⴭਾ⼼瑳汹㹥猼牣灩㹴ℼⴭ畦据楴湯猠⡦笩潤畣敭瑮昮焮昮捯獵⤨紻⼯ⴠ㸭⼼捳楲瑰ਾ⼼敨摡㰾潢祤戠捧汯牯⌽晦晦晦琠硥㵴〣〰〰‰楬歮⌽〰〰捣瘠楬歮⌽㔵愱戸愠楬歮⌽晦〰〰漠䱮慯㵤晳⤨琠灯慭杲湩㌽洠牡楧桮楥桧㵴㸳挼湥整㹲琼扡敬戠牯敤㵲‰散汬灳捡湩㵧‰散汬慰摤湩㵧‰楷瑤㵨〱┰㰾牴㰾摴愠楬湧爽杩瑨渠睯慲㹰昼湯⁴楳敺ⴽ㸱愼栠敲㵦⼢牵㽬慳瀽瀦敲㵦杩瀦慶㵬☳㵱瑨灴⼺眯睷朮潯汧⹥敤椯╧䘳汨㌥摄≥倾牥潳慮楬楳牥整匠慴瑲敳瑩㱥愯☾扮灳簻渦獢㭰愼栠敲㵦栢瑴獰⼺眯睷朮潯汧⹥潣⽭捡潣湵獴䰯杯湩挿湯楴畮㵥瑨灴⼺眯睷朮潯汧⹥敤☯汨搽≥䄾浮汥敤㱮愯㰾是湯㹴⼼摴㰾琯㹲琼⁲敨杩瑨㐽㰾摴㰾浩⁧污㵴∢眠摩桴ㄽ栠楥桧㵴㸱⼼摴㰾琯㹲⼼慴汢㹥椼杭猠捲∽椯瑮⽬敤摟⽥浩条獥氯杯⹯楧≦眠摩桴㌽㄰栠楥桧㵴ㄱ‰污㵴䜢潯汧≥㰾牢㰾牢ਾ昼牯捡楴湯⼽敳牡档渠浡㵥㹦琼扡敬戠牯敤㵲‰散汬灳捡湩㵧‰散汬慰摤湩㵧㸴琼㹲琼⁤潮牷灡㰾潦瑮猠穩㵥ㄭ㰾㹢敗㱢戯☾扮灳☻扮灳☻扮灳☻扮灳㰻⁡摩ㄽ⁡汣獡㵳ⁱ牨晥∽椯杭灨栿㵬敤琦扡眽♩敩唽䙔㠭㸢楂摬牥⼼㹡渦獢㭰渦獢㭰渦獢㭰渦獢㭰愼椠㵤愲挠慬獳焽栠敲㵦栢瑴㩰⼯牧畯獰朮潯汧⹥敤术灲灨栿㵬敤琦扡眽♧敩唽䙔㠭㸢片畯獰⼼㹡渦獢㭰渦獢㭰渦獢㭰渦獢㭰愼椠㵤愳挠慬獳焽栠敲㵦⼢楤桲㽰汨搽♥慴㵢摷椦㵥呕ⵆ∸嘾牥敺捩湨獩⼼㹡渦獢㭰渦獢㭰渦獢㭰渦獢㭰愼椠㵤愴挠慬獳焽栠敲㵦栢瑴㩰⼯敮獷朮潯汧⹥敤港獷灨栿㵬敤琦扡眽♮敩唽䙔㠭㸢敎獷⼼㹡渦獢㭰渦獢㭰渦獢㭰渦獢㭰愼椠㵤愵挠慬獳焽栠敲㵦栢瑴㩰⼯牦潯汧⹥潧杯敬搮⽥牦桧㽰汨搽♥慴㵢晷椦㵥呕ⵆ∸䘾潲杯敬⼼㹡渦獢㭰渦獢㭰渦獢㭰渦獢㭰戼㰾⁡牨晥∽椯瑮⽬敤漯瑰潩獮∯挠慬獳焽䴾桥♲扮灳☻慲畱㭯⼼㹡⼼㹢⼼潦瑮㰾琯㹤⼼牴㰾琯扡敬㰾慴汢⁥散汬灳捡湩㵧‰散汬慰摤湩㵧㸰琼㹲琼⁤楷瑤㵨㔲㸥渦獢㭰⼼摴㰾摴愠楬湧挽湥整㹲椼灮瑵琠灹㵥楨摤湥渠浡㵥汨瘠污敵搽㹥椼灮瑵琠灹㵥楨摤湥渠浡㵥敩瘠污敵∽卉ⵏ㠸㤵ㄭ㸢椼灮瑵洠硡敬杮桴㈽㐰‸楳敺㔽‵慮敭焽瘠污敵∽•楴汴㵥䜢潯汧ⵥ畓档≥㰾牢㰾湩異⁴祴数猽扵業⁴慶畬㵥䜢潯汧ⵥ畓档≥渠浡㵥瑢䝮㰾湩異⁴祴数猽扵業⁴慶畬㵥䄢晵朠瑵䜠ﱬ正∡渠浡㵥瑢䥮㰾琯㹤琼⁤慶楬湧琽灯渠睯慲⁰楷瑤㵨㔲㸥昼湯⁴楳敺ⴽ㸲渦獢㭰渦獢㭰愼栠敲㵦愯癤湡散彤敳牡档栿㵬敤䔾睲楥整瑲⁥畓档㱥愯㰾牢☾扮灳☻扮灳㰻⁡牨晥⼽牰晥牥湥散㽳汨搽㹥楅獮整汬湵敧㱮愯㰾牢☾扮灳☻扮灳㰻⁡牨晥⼽慬杮慵敧瑟潯獬栿㵬敤匾牰捡瑨潯獬⼼㹡⼼潦瑮㰾琯㹤⼼牴㰾牴㰾摴挠汯灳湡㌽愠楬湧挽湥整㹲昼湯⁴楳敺ⴽ㸱畓档㩥㰠湩異⁴摩愽汬琠灹㵥慲楤慮敭洽瑥⁡慶畬㵥∢挠敨正摥㰾慬敢潦㵲污㹬䐠獡圠扥㰠氯扡汥㰾湩異⁴摩氽牧琠灹㵥慲楤慮敭洽瑥⁡慶畬㵥氢㵲慬杮摟≥㸠氼扡汥映牯氽牧‾敓瑩湥愠晵䐠略獴档㰠氯扡汥㰾湩異⁴摩挽祴琠灹㵥慲楤慮敭洽瑥⁡慶畬㵥挢㵲潣湵牴䑹≅㸠氼扡汥映牯挽祴‾敓瑩湥愠獵䐠略獴档慬摮㰠氯扡汥㰾是湯㹴⼼摴㰾琯㹲⼼慴汢㹥⼼潦浲㰾牢㰾牢㰾潦瑮猠穩㵥ㄭ㰾⁡牨晥⼽湩汴搯⽥摡⽳圾牥畢杮⼼㹡ⴠ㰠⁡牨晥⼽敳癲捩獥㸯湕整湲桥敭獮湡敧潢整⼼㹡ⴠ㰠⁡牨晥⼽湩汴搯⽥扡畯⹴瑨汭�敢⁲潇杯敬⼼㹡ⴠ㰠⁡牨晥栽瑴㩰⼯睷⹷潧杯敬挮浯港牣䜾潯汧⹥潣湩䔠杮楬桳⼼㹡⼼潦瑮㰾㹰昼湯⁴楳敺ⴽ㸲挦灯㭹〲㘰䜠潯汧㱥是湯㹴⼼㹰⼼散瑮牥㰾戯摯㹹⼼瑨汭>"

    Was mache ich falsch?



  • glaube, deine session braucht eine initialisierung per name

    das hier funktioniert auf der konsole (eine konsolenapplikation anlegen) oder bei dir einen namen einbauen:

    include <afx.h>
    #include <afxinet.h>
    #include <iostream>
    using namespace std;
    
      CString GetSourceHtml(CString url)
       {      
          CString somecode, s;      
          CInternetSession session("test"); 
          CInternetFile* file = NULL;
    
          try
          {      
             file = (CInternetFile*) session.OpenURL(url);
          }
          catch (CInternetException* m_pException)
          {      
             file = NULL;
             m_pException->Delete();
          }
    
          if(file)
          {      
             while (file->ReadString(somecode) != NULL)
             {
                s = s + somecode;
             }
          }
    
          file->Close();
          return s;
       }
    
    int main(){
    
    	CString blubb = GetSourceHtml( _T("http://www.google.de/") );
    
    	 MessageBox(NULL, (LPCSTR)blubb, "", MB_OK); 
    }
    


  • Danke elise.

    Aber ich steh noch auf dem Schlauch. Vorher hatte ich ein MFC-Dialog angelegt.

    Wie muss ich bei Visual Studio verfahren damit dein Code funktioniert?

    Ich habe "win32 console application" mit "add common header files for MFC" probiert.

    Dann erstellt er mir eine .cpp unter anderem mit

    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    

    Wenn ich jetzt den gesamten vorgefertigten Code durch deinen ersetze, dann sagt er:

    Error 1 fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? g:\c sharp\dune2\wg\wg\wg.cpp 40

    Sorry, aber ich bin da ein ziemlicher Anfaenger.

    Wenn ich die stdafx.h einbinde und die Strings anpasse (L"test" statt "test"), dann kommt wieder der alte Fehler.

    Uebrigens kann ich auch deine MessageBox nicht verwenden, weil:

    Error 1 error C2440: 'type cast' : cannot convert from 'CString' to 'LPCSTR' g:\c sharp\dune2\wg\wg\wg.cpp 40

    Ich komme von Java/C# und irgendwie scheinen mir noch ein paar Grundlagen zu fehlen, ich weiss nur nicht welche.



  • hi

    ich habe nur eine konsolenanwendung ohne schon 'fertige dateien' angelegt, und selber eine datei zum projekt hinzugefügt.

    aber du brauchst jetzt keine konsolenanwendung machen, das war nur für mich zum testen.
    schau, ob du einfach diese zeile:

    CInternetSession session("test");
    

    durch deine selbige ohne initialisierung ersetzt.

    der session kann übrigens noch ein zweiter parameter mitgegeben werden.. aber ich kenn mich nicht so aus mit mfc.

    es fehlt aber eben der name der session, nach meiner geringen idee.
    gruß



  • Hi,

    also erstmal danke elise! Aber es scheint, dass die Funktion doch korrekt ist. Allerdings ist der String in unicode/utf-8 codiert.

    Jetzt muss ich ihn irgendwie in einen ASCII-CString umwandeln. Weiss jemand wie?



  • nimm libcurl!


Anmelden zum Antworten