Seite 1 von 2

quelltext einer internetseite in einen string laden

Verfasst: 12.04.2007 15:56
von philipp
hallo,
gibt es eine möglichkeit den quelltext einer internetseite direkt in einen
string einzulesen, also ohne URLDownloadToFile_() zuerst alles in eine datei speichern und dann auslesen zu müssen?
vielen danke
philipp

Verfasst: 12.04.2007 17:14
von Nero
So in der art könnteste es machen

Code: Alles auswählen

If InitNetwork() = 0
  MessageRequester("Fehler", "Netzwerk konnte nicht Initialisiert werden!", 0)
  End
EndIf

URL.s = "www.purebasic.fr"
Path.s = "/german/viewforum.php?f=16"
Port.l = 80
EOL$ = Chr(13) + Chr(10)

Connection.l = OpenNetworkConnection(URL, 80, #PB_Network_TCP)

SendNetworkString(Connection, "GET /"+ Path + "/ HTTP/1.1" + EOL$) 
SendNetworkString(Connection, "Host: "+ URL + EOL$) 
SendNetworkString(Connection, "Connection: close" + EOL$) 
SendNetworkString(Connection, "Accept: text/plain" + EOL$) 
SendNetworkString(Connection, "Accept-Charset: ISO-8859-1, *;q=0.7" + EOL$) 
SendNetworkString(Connection, "User-Agent: Simple Test"+ EOL$) 
SendNetworkString(Connection, "Refferer: www.womba.net"+ EOL$) 
SendNetworkString(Connection, EOL$)  

 String.s
 For x = 0 To 400
   If NetworkClientEvent(Connection) <> 0
     buffer.s = Space(1024)
     ReceiveNetworkData(Connection, @buffer, 1024)
     String + buffer
   EndIf   
   Delay(5) 
 Next
CloseNetworkConnection(Connection)

MessageRequester("Test", String)

Verfasst: 12.04.2007 19:38
von AND51
1) SendNetworkString(Connection, "Accept: text/plain, */*;q=0.8" + EOL$) ist besser!

2) user-agent nicht erforderlich

3) Referrer ebenfalls nicht erforderlich

4) Es dauert sehr lange, bis mit deinem Code die Websetie abgerufen worden ist. Ich habe es versucht, schneller zu machen, weiß aber nicht wie. Es hat nicht geklappt. Bei deinem Code wird aber in jedem Fall 400*5 ms, also 2 Sekunden gewartet, und wenn die Webseite noch so klein ist. Das könnte man noch besser machen.

Verfasst: 12.04.2007 21:43
von Nero
Ob du nun den Agent und refferer mit angibst ist zwar egal aber mit taucht es wenigstens ordentlich in den statistiken auf <)

Naja er arbeitet halt erst die schleife ab danach gehts erst weiter dauert halt 2 sec aber fürn beispiel sollte es reichen :lol:

Verfasst: 12.04.2007 22:03
von AND51
> taucht es wenigstens ordentlich in den statistiken auf
Hab mir schon gedacht, dass dies dein Grund ist :wink: Dann sollte man aber wenigstens vernünftige Inhalte hemen und nicht www.wambo.de oder so... :lol:

> dauert halt 2 sec aber fürn beispiel sollte es reichen
Das ist richtig. IMHO dient es jedoch nur zu Demozwecken, wenn man es "richtig" machen will, sollte man auf jeden Fall Repeat-Schleifen nehmen und den Datenverkehr überwachen.
Ich stellte nämlich fest, dass die Daten anscheinend mit dem Verfahren "chunked encoding", also in "Stücke zerteilt" versendet werden, weshalb mir ein umschreiben des Codes nicht auf Anhieb gelang.
Es bedarf etwas Einarbeitung in das HTTP-Protokoll, um "richtige" Codes zu schreiben (damit will ich nicht sagen, dass keiner von uns HTTP versteht). Tipp: Verwende HTTP 1.0, in der älteren Version gibt es noch kein chunked encoding. Obwohl der Server es eigentlich nicht verwenden dürfte, weil du es in dem Request doch nicht angegeben hast?! Oder darf der Server chunked encoding immer verwenden, wenn er im Response darauf hinweist?

Verfasst: 12.04.2007 22:18
von Nero
Hab mir schon gedacht, dass dies dein Grund ist Wink Dann sollte man aber wenigstens vernünftige Inhalte hemen und nicht www.wambo.de oder so...
Die Domain "www.womba.net" gehört mir <) ist aber noch nix drauf

ReceiveNetworkData zerhackt die Daten bzw. holt immer die menge an daten
je nachdem wie groß der buffer ist und je nachdem wieviele daten schon angekommen sind.

In der Hilfe steht es so
'Ergebnis' gibt die Anzahl an tatsächlich bereits gelesenen Bytes an. Ist 'Ergebnis' gleich 'DatenBufferLaenge', dann sind noch
mehr Daten zum Einlesen verfügbar.
Das problem ist aber wen zum zeipunkt des abfragens der daten der webserver noch nicht genug daten gesendet hat so ist die länge
trotzdem das noch daten kommen < der Buffergröße von daher kann man da nicht zuverlässig prüfen.
Zumidest scheint es mir so wen ich das ergebnis von ReceiveNetworkData
per Debuger ausgeben lasse das sieht ungefähr so bei mir aus
1024->1024->450->1024
Laut hilfe sollte aber doch bei 450 schluß sein aber wen ich daraufhin prüfe
ist nur ein bruchteil der seite Geladen

Bleibt also nur eine auswertung der daten weil der apache ne abschließende 0 ans ende setzt.

Verfasst: 12.04.2007 22:40
von AND51
Ich weiß schon, wie receiveNetworkData() funktioniert :)

> weil der apache ne abschließende 0 ans ende setzt
Entweder empfängst du immer weite,r bis eine NULL kommt... Aber darauf verlasse ich mich nicht. Nicht jeder benutzt Apache, bzw. nicht überall kommt ne NULL noch dahinter, obwohl's, denke ich, sich so gehört.

Dann sollte man lieber wirklich "Content-length" auswerten!

Verfasst: 13.04.2007 00:36
von bluejoke
Content-length wird ja auch nicht immer gesendet. Aber man kann ja die verschiedenen Maßnahmen kombinieren. DarkDragon hat soweit ich weiß schon ne funktionsfähige Prozedur die das prima macht. Bei mir hats nach ein wenig umschreiben (ich musste GET-Parameter mitsenden) tadellos funktioniert.

Verfasst: 13.04.2007 00:57
von AND51
> Content-length wird ja auch nicht immer gesendet. Aber man kann ja die verschiedenen Maßnahmen kombinieren.
Ja, das denke ich auch. Ich sehe, wir beide nähern uns an. Weiter so! :allright:

Ich würde mal wagen zu behaupten, dass man mit der Conent-Length-Methode und mit der NULL-Byte-Such-Methode schon genug Server abdeckt, die man korrekt behandeln kann.

Verfasst: 13.04.2007 09:55
von TomS
Wenn du schon sagen willst, von welcher Domain du kommst, dann schreib doch bitte Referrer und nicht Refferer. Das nur so am Rande.