quelltext einer internetseite in einen string laden
quelltext einer internetseite in einen string laden
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
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
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)
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.
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.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
> taucht es wenigstens ordentlich in den statistiken auf
Hab mir schon gedacht, dass dies dein Grund ist
Dann sollte man aber wenigstens vernünftige Inhalte hemen und nicht www.wambo.de oder so...
> 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?
Hab mir schon gedacht, dass dies dein Grund ist


> 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?
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
Die Domain "www.womba.net" gehört mirHab 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...

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
Das problem ist aber wen zum zeipunkt des abfragens der daten der webserver noch nicht genug daten gesendet hat so ist die länge'Ergebnis' gibt die Anzahl an tatsächlich bereits gelesenen Bytes an. Ist 'Ergebnis' gleich 'DatenBufferLaenge', dann sind noch
mehr Daten zum Einlesen verfügbar.
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.
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!

> 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!
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
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.
Windows XP Pro SP2 - PB 4.00Ich bin Ausländer - fast überall
> 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!
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.
Ja, das denke ich auch. Ich sehe, wir beide nähern uns an. Weiter so!

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.
PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End