Entwickler-Ecke

Internet / Netzwerk - Webseiteninformationen auslesen


Amalia - Sa 23.09.06 20:29
Titel: Webseiteninformationen auslesen
Hallo,

ich hab grad euer Forum entdeckt und wollte gleich mal mit einer Frage in Erscheinung treten:

Ich würde gerne verschiedene Webseiteninformationen mit meinem Delphi-Programm auslesen, speziell Typ, Kodierung, Größe, Modifizierdatum und alle enthaltenden Grafiken. So in etwas wie es der FF auch macht (siehe Screenie). Wie könnte ich diese Daten am besten mit meinem Programm auslesen?

Freue mich über jeden Vorschlag / Idee. :-)


Amalia - So 24.09.06 20:31

Hat keiner nen Tipp oder kleinen Ansatz für mich?


jakobwenzel - So 24.09.06 20:32

Das müsste mit der idHTTP gehen.


marconist - So 24.09.06 20:33

Hallo,

die Daten stehen teils im http header, teils im html header und teils im html body.

Mein Programm, das dies alles anzeigt, baut auf der tclientsocket Komponente auf. Die übertragenen strings zu analysieren ist ja kein Problem.

sieht ungefähr so aus:

request:

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:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
GET / HTTP/1.0
Host: www.delphi-forum.de

http header:
HTTP/1.1 200 OK
Date: Sun, 24 Sep 2006 18:17:20 GMT
Server: Apache/2.0.54 (Linux/SUSE)
X-Powered-By: PHP/4.3.11
Cache-Control: no-cache, pre-check=0, post-check=0
Expires: 0
Pragma: no-cache
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
html header:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">

<meta name="DC.creator" content="Tino Teuber">
<meta name="DC.date.created" content="2004-11-05">
<meta name="DC.description" content="In diesem Programmierforum treffen sich Delphi Entwickler um Hilfe zu erhalten und zu geben.">
<meta name="DC.format" content="text/html">
<meta name="DC.language" content="de">
<meta name="DC.publisher" content="Tino Teuber">
<meta name="DC.rights" content="Copyright © Tino Teuber, 2002 - 2006.">
<meta name="DC.subject" content="In diesem Programmierforum treffen sich Delphi Entwickler um Hilfe zu erhalten und zu geben.">
<meta name="DC.title" content="Delphi-Forum.de">
<meta name="DC.type" scheme="DCMIType" content="Text">
<meta name="abstract" content="Deine freundliche Delphi Community">
<meta name="audience" content="all">
<meta name="author" content="Tino Teuber">
<meta name="copyright" content="Copyright © Tino Teuber, 2002 - 2006.">
<meta name="description" content="In diesem Programmierforum treffen sich Delphi Entwickler um Hilfe zu erhalten und zu geben.">
<meta name="keywords" content="delphi, forum, board, faq, tutorial, pascal, delphilanguage, programmierung, programmieren, tutorials, borland, diskussionsforum, fragen, antworten, experten, windows, linux, kylix, api, debugger, fehler, lösungen, sql, datenbanken, multimedia, directx, algorithmen, suchen, sortieren, bäume, listen, prozedur, funktion, procedure, function, vcl, komponente">
<meta name="page-type" content="faq">
<meta name="publisher" content="Tino Teuber">
<meta name="revisit-after" content="2 days">
<meta name="robots" content="index,follow">
<link rel="shortcut icon" href="./favicon_df.ico">
<link rel="stylesheet" type="text/css" href="styles/common.css">
<link rel="stylesheet" type="text/css" href="styles/main.css">
<link rel="stylesheet" type="text/css" href="styles/styles_others.css">

<link rel="alternate" type="application/rss+xml" title="Alle Beiträge" href="rss.php">
<link rel="alternate" type="application/rss+xml" title="Delphi- & C-Sharp-Forum.de News" href="rss.php?f=2">
<link rel="alternate" type="application/rss+xml" title="Neuigkeiten" href="rss.php?f=42">
<link rel="top" href="./index.php?sid=585b0d68604099b8b16c28ef72fd4b9b" title="Delphi-Forum.de Sparten-Übersicht">
<link rel="search" href="./search.php?sid=585b0d68604099b8b16c28ef72fd4b9b" title="Suche">
<link rel="help" href="./faq.php?sid=585b0d68604099b8b16c28ef72fd4b9b" title="">
<link rel="author" href="./memberlist.php?sid=585b0d68604099b8b16c28ef72fd4b9b" title="Mitgliederliste">

<title>Delphi-Forum.de - Deine freundliche Delphi Community</title>
<script language="JavaScript" type="text/JavaScript" src="./scripts/common.js"></script>
</head>
<body> .... </body>


srs,
marconist

Moderiert von user profile iconraziel: Code-Tags hinzugefügt


Amalia - So 24.09.06 20:36

Hallo marconist,

Zitat:
http header:
HTTP/1.1 200 OK
Date: Sun, 24 Sep 2006 18:17:20 GMT
Server: Apache/2.0.54 (Linux/SUSE)
X-Powered-By: PHP/4.3.11
Cache-Control: no-cache, pre-check=0, post-check=0
Expires: 0
Pragma: no-cache
Connection: close
Content-Type: text/html
Das wär schonmal ein Anfang. Hast du da mal ein bisschen Code für mich wie man das machen könnte? Quelltext auslesen ist ja kein Problem...


wulfskin - So 24.09.06 20:40

Wemm ich recht gelesen habe, dann geht es auch mit Suche im MSDN HTTPQUERYINFO. Wird aber etwas aufwendiger als Komponenten zu benutzen sein.

Gruß Hape!


Amalia - So 24.09.06 20:49

Hallo wulfskin, danke erstmal für die Info. Ich hab mich mal durchs MSDN gekämpft und bin bei

Delphi-Quelltext
1:
2:
3:
function HttpQueryInfo(hRequest: HINTERNET; dwInfoLevel: DWORD;
  lpvBuffer: Pointer; var lpdwBufferLength: DWORD;
  var lpdwReserved: DWORD): BOOL; stdcall;
hängengeblieben. Leider bin ich nicht so bewandert in Delphi (hab erst vor kurzem bedingt durch die Ausbildung damit begonnen), kannst du mir mal einen Beispielaufruf geben? Vielen Dank.


GTA-Place - So 24.09.06 21:05

Wichtig sind:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/httpqueryinfo.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/query_info_flags.asp

Und mit Suche bei Google HTTPQUERYINFO DELPHI:
http://www.cryer.co.uk/brian/delphi/wininet/example_isurlvalid.htm


marconist - So 24.09.06 21:05

Den http header bekommst du über den socket ganz gleich wie die html source. Die Daten kann man dann verarbeiten wie man will.

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var intext:string;
begin
slog('read'); // testoutput
hlog(intext); // testoutput
// ....... Verarbeitung nach Wunsch
end;

Wenn du konkrete Fragen hast, kannst du sie gerne stellen.

srs,
marconist


Amalia - So 24.09.06 21:14

Den Quellcode lese ich bis jetzt mit idHTTP aus. Mit den Sockets habe ich bis jetzt noch gar nicht gearbeitet, weiß daher leider auch nicht wie ich deinen Code verwenden solle. :-(

Kannst du mir bitte genauer helfen, ich mcöhte doch nur fix diese Header-Daten auslesen...


marconist - So 24.09.06 21:18

gern, wenn du genauere Fragen stellst.


Amalia - So 24.09.06 21:20

Wie muss der Quellcode lauten mit dem ich die Header-Informationen einer Webseite auslesen kann? :mrgreen:


marconist - Mo 25.09.06 05:04

Ja durch wiederholen werden solche Fragen nicht genauer, sondern nur, wenn man präzisiert, wie weit man gekommen ist und was der nächste Teilschritt ist, der Probleme bereitet. Welcher Befehl macht dier denn ein Problemchen?

Ich bin davon überzeugt, dass du programmieren lernen willst, und nicht nur nach nützlichen Idioten Ausschau hältst, die dir dein Programm schreiben.

srs,
marconist


Amalia - Mo 25.09.06 19:23

Also praktisch gesehen bin ich noch genauso weit wie am Anfang. Ich habe also die Prozedur

Delphi-Quelltext
1:
2:
3:
function HttpQueryInfo(hRequest: HINTERNET; dwInfoLevel: DWORD;  
   lpvBuffer: Pointer; var lpdwBufferLength: DWORD;  
   var lpdwReserved: DWORD): BOOL;

Jetzt hab ich im MSDN geguckt welche Konstante alle diese Daten ausliest. Ich bin mir absolut nicht sicher aber es könnte HTTP_QUERY_ALLOW sein. Leider komm ich mit der Funktion aber nicht klar, wo muss ich die URL angeben? Der Typ HINTERNET ist mit gänzlich unbekannt, auch wie und worum ich dort Pointer übergeben soll. :-(

Wäre nett wenn du (oder ein anderer) mir nochmals helfen könnest. ;)


GTA-Place - Mo 25.09.06 19:34

user profile iconGTA-Place hat folgendes geschrieben:
Wichtig sind:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/httpqueryinfo.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/query_info_flags.asp

Und mit Suche bei Google HTTPQUERYINFO DELPHI:
http://www.cryer.co.uk/brian/delphi/wininet/example_isurlvalid.htm


Amalia - Mo 25.09.06 19:48

@GTA-Place: Ich hatte deinen Beitrag gelesen, von der MSDN-Seite habe ich ja auch die Informationen. :roll:

Der andere Link ist ein Beispiel um zu Prüfen ob eine URL existiert, ich kann nicht erkennen wie mir das weiterhelfen soll.


wulfskin - Di 26.09.06 00:46

Hallo,

ich hab meinen guten Tag heute (naja eigentlich nicht). Aber dabei lernst du wohl nicht so viel:

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:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
function GetHeader(const AURL: Stringvar ABuf: Pointer;
  var ABufLength: Cardinal): Boolean;
var
  hInet, hFile: HINTERNET;
  Dummy: Cardinal;
begin
  Result := False;
  hInet := InternetOpen('Mein Agent', INTERNET_OPEN_TYPE_PRECONFIG, nilnil,
    0);
  if Assigned(hInet) then
  begin
    hFile := InternetOpenUrl(hInet, PChar(AURL), nil0,
      INTERNET_FLAG_EXISTING_CONNECT or INTERNET_FLAG_RELOAD, 0);
    if Assigned(hFile) then
    begin
      Dummy := 0;
      if HTTPQueryInfo(hFile, HTTP_QUERY_RAW_HEADERS_CRLF, ABuf, ABufLength,
        Dummy) then
        Result := True
      else
      begin
        if GetLastError = ERROR_INSUFFICIENT_BUFFER then
        begin
          //neuen Speicher anfordern
          ReallocMem(ABuf, ABufLength);
          if HTTPQueryInfo(hFile, HTTP_QUERY_RAW_HEADERS_CRLF, ABuf, ABufLength,
            Dummy) then
            Result := True;
        end;
      end;
      InternetCloseHandle(hFile);
    end;
    InternetCloseHandle(hInet);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
const
  BUF_LENGTH = 100;
var
  Buf: PChar;
  Length: Cardinal;
begin
  GetMem(Buf, BUF_LENGTH);
  Length := BUF_LENGTH;
  if GetHeader('http://www.google.de', Pointer(Buf), Length) then
    ShowMessage(Buf);
  FreeMem(Buf);
end;
Gruß Hape!


marconist - Di 26.09.06 05:31

Die Definition von httpqueryinfo in pascal steht in der unit wininet.pas. Die bindest du mit uses ein und ab dann kannst du mit "deklaration suchen" alle Elemente in ihrer Delphi definition ansehen.

Die Parameter von httpqueryinfo sind in der msdn library doch detailliert erklärt.

http://msdn.microsoft.com/library/en-us/wininet/wininet/httpqueryinfo.asp?frame=true

Zitat:
Der Typ HINTERNET ist mit gänzlich unbekannt, auch wie und worum ich dort Pointer übergeben soll.
1.Parameter laut msdn
Zitat:
hRequest
[in] Handle returned by HttpOpenRequest or InternetOpenUrl.
Zitat:
Jetzt hab ich im MSDN geguckt welche Konstante alle diese Daten ausliest. Ich bin mir absolut nicht sicher
3.Parameter laut msdn
Zitat:
lpvBuffer
[in, out] Pointer to a buffer to receive the requested information. This parameter must not be NULL.

Steht doch tatsächlich ALLES da, Du hast das noch nicht wirklich gelesen.

srs,
marconist


Amalia - Di 26.09.06 21:49

Danke @all, ich werd mich nochmal etwas mehr damit beschäftigen. :-)