Quelltext einer Webseite auslesen



  • Hi...
    Leider hab ich wieder ein kleines Problem, bei dem ich um Rat fragen muss.
    Ich will wie schon im Topic angedeutet den Quelltext einer Internetseite in eine Datei schreiben um später damit zu arbeiten.
    Das Problem hier ist bei links wie "www.myhomepage.de/index.php?action=kontakt" funktioniert das nicht.
    Hier mal mein Code soweit:

    bool Getsite(string sitename, string filename, string sitepath) 
       { 
        bool ret_val = false; 
    
        WSADATA m_wsaData; 
        WSAStartup(MAKEWORD(1, 1), &m_wsaData); 
    
        if(HINTERNET m_hINet = InternetOpen("InetURL", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0)) 
        { 
            if(HINTERNET m_hConnection = InternetConnect(m_hINet, sitename.c_str(), 80, 0, 0, INTERNET_SERVICE_HTTP, NULL, 0)) 
            { 
                if(HINTERNET m_hData = HttpOpenRequest(m_hConnection, "GET", 0, 0, 0, 0, INTERNET_FLAG_KEEP_CONNECTION, 0)) 
                { 
                    HttpSendRequest(m_hData, 0, 0, 0, 0); 
    
                    char szBuff1[1025];
    				 bool bGO = true;
                    DWORD dwReadSize; 
    
    				ofstream savedat(filename.c_str(), ios_base::app);
    				if (savedat)
    					{
    					 while(bGO)
    						{
    						 bGO = (bool)InternetReadFile(m_hData, &szBuff1, 1024, &dwReadSize);
    						 if(bGO && dwReadSize == 0) 
    							{
    							 ret_val = true;
    							 break;
    							}
    
    						 szBuff1[dwReadSize] = '\0';
    						 savedat << szBuff1 << endl;
    						}
    					}
    				else
    					cout << "Fehler beim erstellen der Datei" << endl;
    
                    InternetCloseHandle(m_hData); 
                } 
                InternetCloseHandle(m_hConnection); 
            } 
            InternetCloseHandle(m_hINet); 
        } 
    
        WSACleanup(); 
    
        return ret_val; 
       }
    

    Falls es schon eine Lösung gibt (ich hab aber vor 1 Woche hier nichts gefunden was mir weiterhilft) tut es mir Leid, da die Suchfunktion deaktiviert ist und ich nicht nachkucken kann.

    Wär sehr nett wenn mir einer sagen würde wie ich diesen Codeteil abändern müsste, dass das mit den Links auch klappt !

    Danke fürs Durchlesen und Helfen !



  • Habs kurz überflogen... aber warum benutzt du Sockets?

    HINTERNET hInternet = NULL;
      HINTERNET hInternetUrl = NULL;
      DWORD dwBytes = 0;
      hInternet = InternetOpen(0,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0);
      if(hInternet == NULL) MessageBox(NULL,"InternetOpen error","error",MB_OK);
      hInternetUrl = InternetOpenUrl(hInternet,szSite,NULL,0,INTERNET_FLAG_EXISTING_CONNECT,0);
      if(hInternetUrl == NULL) MessageBox(NULL,"InternetOpenUrl error","error",MB_OK);
      InternetReadFile(hInternetUrl,&szString,2048,&dwBytes); // 2048 = max. 2kb
      if(hInternetUrl == NULL) MessageBox(NULL,"InternetOpenUrl error","error",MB_OK);
      // Hier kannste deinen String speichern  
      InternetCloseHandle(hInternetUrl);
      InternetCloseHandle(hInternet);
    

    Musst du nur noch in C++ umwandeln(mit den Strings und so)
    Kann sein das da oben Memory Leaks etc drin sind... wahrscheinlich nicht aber möglich wärs ^^



  • Danke für die Antwort !

    aber warum benutzt du Sockets?

    Jetzt wo dus sagst 🙂
    Ich wollte das in einem Extraprojekt test und hab mir vieles von hier zusammengestöpselt. Hab ich ganz vergessen, stammt noch vom vorherigen Versuch :).
    THX das du mich darauf hingewiesen hast, ich hätte es wahrscheinlich wieder voll verplant und drinnengelassen *g*.

    Hmm... in deinem Code müsste das also gehen wenn ich in 'szSite' den ganzen Pfad reinschreib also z.b. "www.myhomepage.de/index.php?action=kontakt".
    Werde das später mal testen. Ich schreib auf jedenfall wieder.



  • Super ! Vielen DANK Url funktioniert einwandfrei !
    Ich habs leicht umgeändert falls das hier einen Interessiert poste ich das mal:

    bool Getsite(string sitename, string filename) 
    	{
    	 HINTERNET hInternet = NULL; 
    	 HINTERNET hInternetUrl = NULL; 
    	 DWORD dwBytes = 0; 
    
    	 if((hInternet = InternetOpen(0,INTERNET_OPEN_TYPE_PRECONFIG,0,0,0)) == NULL) 
    		 return false;
    	 else
    		{ 
    		 if((hInternetUrl = InternetOpenUrl(hInternet,sitename.c_str(),NULL,0,INTERNET_FLAG_EXISTING_CONNECT,0)) == NULL)
    			 return false;
    		 else
    			{ 
    			 bool eofpage=true;
    			 char szString[2049];
    
    			 ofstream quelltext(filename.c_str(), ios_base::beg);
    			 if (quelltext)
    				{
    				 while(eofpage)
    					{
    					 eofpage = (bool)InternetReadFile(hInternetUrl,&szString,2048,&dwBytes); // 2048 = max. 2kb 
    					 if(hInternetUrl == NULL)
    						 return false;
    					 else
    						{
    						 if (eofpage && dwBytes == 0)
    							break;
    
    						 szString[dwBytes] = '\0';
    						 quelltext << szString << endl;
    						}
    					}
    				}
    			 else
    				 return false;
    			}
    		}  
    	 InternetCloseHandle(hInternetUrl); 
    	 InternetCloseHandle(hInternet); 
    
    	 return true;
    	}
    


  • Hallo,

    Ich hab den Quelltext im letzten Post auch mal ausprobiert um den Quelltext einer Webseite zu laden. Allerdings liefert InternetOpenUrl bei mir immer NULL zurück und über GetLastError bekomme ich den Fehler 12029 (Sending information to the server failed, error 12029 or 12030). Als url übergebe ich in sitename den string "http://www.lovehits.net/index.htm", ich habe es aber auch schon mit zahlreichen anderen Adressen probiert, immer Fehler 12029. InternetOpen klappt noch. Ich habe übrigens keine Firewall, auch die SP2 Firewall ist deaktiviert, daran kann es also eigentlich nicht liegen, Internet ist auch an, überprüfe ich in meinem Programm bevor ich die Seite lade mit InternetGetConnectedState. Mein Computer ist über das Home WLan mit dem Internet verbunden, hat aber vollen Zugriff aufs Internet. Hat jemand eine Ahnung wo das Problem liegen könnte?



  • Also bei mir klappt es.
    Die Passage:

    ofstream quelltext(......) brachte bei mir zwar den Compiler (DEV-C++)
    zum meckern, so daß ich den Code ein wenig umändern mußte,
    aber ich kann ohne Probleme Webseiten auslesen.

    Gruß,
    DC


Anmelden zum Antworten