Entwickler-Ecke

Internet / Netzwerk - Quelltext einer Webseite auslesen


dominikkv2 - So 24.09.06 19:16
Titel: Quelltext einer Webseite auslesen
Hi
ich habe vor 7 Tagen angefage mich mit Delphi zu beschäftigen und bin grad dabei mein zweites Program zu schreiben.
Dieses Programm soll den Quelltext aus einer webseite auslesen und daraus Informationen filtern.
Meine Frage: wie kann ich den Quelltext der seite abfragen die grad mein FireFox/Opera anzeigt? Wenn das nicht geht hatte ich die Idee die seite mit einem TWebBrowser anzuzeigen und dann darus den quelltext zu holen (wobei ich auch da nicht weiss wie das geht). In mehreren Beiträgen habe ich gesehen das man das mit der Komponente FastNet geht, allerdings hab ich Turbo Delphi ohne FasNet. Ausserdem soll es irgendwie mit IDHTTP gehen, hab allerdings keine ahnung wie :-(

hoffe ihr könnt mir helfen

mfg.dominikkv


wulfskin - So 24.09.06 20:07

Hallo,

wenn es nur um den Quelltext geht, brauchst du keine Komponenten verwenden. Da kannst du direkt auf die APIs zugreifen:
Gruß Hape!


Chryzler - So 24.09.06 20:31

Wenn dein Browser die gefilterten Daten anzeigen soll, dann ist IdHTTPProxy (weiß den Namen leider nicht genau) das Richtige. Dann kannst du dein Programm im Browser als Proxy eintragen, und dein Prog bekommt jeden Quelltext.


wulfskin - So 24.09.06 20:35

user profile iconChryzler hat folgendes geschrieben:
Wenn dein Browser die gefilterten Daten anzeigen soll, dann ist IdHTTPProxy (weiß den Namen leider nicht genau) das Richtige. Dann kannst du dein Programm im Browser als Proxy eintragen, und dein Prog bekommt jeden Quelltext.
Was meinst du damit? Welche Quelltext sollte man denn so nicht bekommen?


Chryzler - So 24.09.06 20:59

Ich meine damit das, was ich geschrieben habe. Vielleicht will user profile icondominikkv2 einen Webfilter o.ä. schreiben, und dazu muss man ja den gefilterten Quelltext im Browser anzeigen lassen. Er hat gefragt, wie er den Quelltext von der Seite kriegt, die gerade im FF angezeigt wird. Bei deinen Vorschlägen muss er erstmal die URL aus dem Browser kriegen, bei einem Proxy bekommt er die URL und dazu noch gleich den Quelltext.


marconist - So 24.09.06 21:17

Hi,

ich halte auch die Lösung mit local proxy für die elegantere Möglichkeit.

Üblicherweise schreibe ich so etwas mit tserversocket und tclientsocket.

srs,
marconist


dominikkv2 - Mo 25.09.06 18:34

hi
erstmal danke für eure antworten

ich will keinen webfilter machen, der browser soll alles anzeigen was er sonst auch anzeigen würde, nur will ich den quelltext von der seite holen. dieser quelltext enthält informationen die ich analysieren und speichern will. dazu muss ich doch irgendwie den quelltext der seite in mein programm "importieren", vllt in eine variable oder memo?

ich habe schon mehrmals das wort indy gehört, weiss aber nicht so ganz was das ist und wie ich das anwenden kann.

vllt könnt ihr mir einen beispiel-code geben damit ich da ein bisschen durchblick?
achja und bei swissdelphycenter hab ich schon geschaut, da brauch ich aber andere komponenten die ich nicht hab :/


Chryzler - Mo 25.09.06 18:41

Also, die Indys sind Komponenten (hauptsächlich Netzwerkkomponenten), z.B. HTTP-Client, FTP-Client, aber auch Server, z.B. Telnet-Server, FTP-Server. Darunter ist auch ein HTTPProxy.
Ich weiß nicht ob bei Turbo Delphi die Indy Komponenten dabei sind. (Ich weiß nichtmal was Turbo Delphi ist). Ich glaube die Indys sind kostenlos, d.h. du müsstest sie auch irgendwo runterladen können.
Wenn du die Komponenten hast, dann pflanzt du dir so einen TIdTTPProxy auf deine Form. Wie es weitergeht, sag ich dir nachher...

Chryzler


dominikkv2 - Mo 25.09.06 18:53

turbo-delphi ist eine kostenlose version von delphi und ist glaube ich erst seit september draussen. früher hieß das mal developper studio oder so^^
indy 9 und 10 sind dabei, nur weiss ich eben nicht wie ich das anwenden kann. es gibt auch keine objekte wie TIdTTPProxy von indy die man auf die form ziehen kann :(


Chryzler - Mo 25.09.06 19:14

Also ich hab grad nachgeschaut: es heißt TIdHTTPProxyServer
Hier [http://www.delphi-forum.de/viewtopic.php?t=60934] hab ich was brauchbares gefunden. Im HTTPDocument-Ereignis des IdHTTPProxyServers gibt es das Argument "ADocument". Das müsste eigentlich die URL sein, die man aufgrufen hat. Dann gibt es noch ein Argument namens "VStream", das ist der Quelltext.


dominikkv2 - Do 28.09.06 14:43

hi
ich hab leider keine ahnung wie ich Indy verwenden kann :/
es gibt keinerlei objekte die TIdHTTPProxyServer oder ähnlich heißen oder irgendwas mit Indy zu tun haben...

oder muss ich das irgendwie anders machen?

btw: gibt es hier im forum irgendein bewertungssystem zum bewerten der posts anderer?


Marc_S - Fr 29.09.06 15:31

Hi Dominik,

auf der Homepage SwissDelphiCenter unter Tips [http://www.swissdelphicenter.ch/de/tipsindex.php]gibt es viele Code-Beispiele.
Unter anderen gibt es 3 Möglichkeiten [http://www.swissdelphicenter.ch/de/showcode.php?id=412] wie man eine Datei aus dem Netz laden kann.
Und dreimal darfste raten was du erhälst wenn du ein *.html Dokument herunterlädst :)

Gruss,
MArc


Chryzler - Sa 30.09.06 17:14

user profile icondominikkv2 hat folgendes geschrieben:
hi
ich hab leider keine ahnung wie ich Indy verwenden kann :/
es gibt keinerlei objekte die TIdHTTPProxyServer oder ähnlich heißen oder irgendwas mit Indy zu tun haben...

Dann ist bei deinem Delphi auch kein Indy dabei. :? Lade dir doch mal von der Homepage die Komponenten runter.
user profile icondominikkv2 hat folgendes geschrieben:
gibt es hier im forum irgendein bewertungssystem zum bewerten der posts anderer?

Ein Bewertungssystem gibts hier nicht, wäre aber eine gute Idee! :?:


dominikkv2 - Sa 30.09.06 18:56

hmm...ich glaub ich hab indy installiert...bei der installation hat er mich gefragt ob er indy 9 oder 10 verwenden soll.

naja auf jedenfall ich habs jetzt geschaft :)
mit der funktion:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function GetHTMLCode(WB: IWebbrowser2; ACode: TStrings): Boolean;  
var
 ps: IPersistStreamInit;
 s: string;
 ss: TStringStream;
 sa: IStream;
begin
 ps := WB.document as IPersistStreamInit;
 s := '';
 ss := TStringStream.Create(s);
 try
   sa:= TStreamAdapter.Create(ss, soReference) as IStream;
   Result := Succeeded(ps.Save(sa, Bool(True)));
   if Result then ACode.Add(ss.Datastring);
    end;
 finally
   ss.Free;
 end;
end;

jetzt hab ich aber ein problem:
auf "normalen" inetseiten funktioniert das, allerdings nicht auf der seite http://www.space-pioneers.de/ wo das programm letztendlich eingesetzt werden soll :/

wenn man aber die seite Aktualisiert gehts <--!!

weiss jemand warum und wie ich es hinbekomm das man den quelltext gleich bekommt und nicht erst aktualisieren muss?
eine alternative ist es wie oben gesagt einen proxyserver zu erstellen...gibt es da tutorials dazu?

danke für eure antworten :)
mfg.dominik


dominikkv2 - So 01.10.06 14:51

ich hab mir jetzt borland developer studio 2006 runtergeladen und da kann ich jetzt indy benutzen...

hab TIdHTTPProxyServer auf Form1 plaziert und im FF den proxy eingetragen und siehe da... klappt auf anhieb. :mrgreen:

allerdings hab ich ein neues problem ...
hier mal der quelltext:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,
  IdCmdTCPServer, IdHTTPProxyServer;

type
  TForm1 = class(TForm)
    IdHTTPProxyServer1: TIdHTTPProxyServer;
    procedure IdHTTPProxyServer1Connect(AContext: TIdContext);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdHTTPProxyServer1Connect(AContext: TIdContext);
begin
 showmessage ('connected')
end;

end.


Fehlermeldung:

Zitat:
[Pascal Fehler] Unit1.pas(13): E2003 Undefinierter Bezeichner: 'TIdContext'


-.-


mkinzler - So 01.10.06 14:56

http://www.delphipraxis.net/post619306.html#619306