Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Quellcode einer Webseite herunterladen (https://www.delphipraxis.net/169319-quellcode-einer-webseite-herunterladen.html)

Amateurprofi 11. Jul 2012 21:41

Quellcode einer Webseite herunterladen
 
Ich möchte den Quellcode einer Webseite herunterladen und auswerten.
Zurzeit mache ich das manuell indem ich auf der Webseite "Quellcode anzeigen" wähle.
Dann erscheint ein neues Fenster, das ein RichEdit enthält, in dem der Quellcode steht.
Mit Strg-A und Strg-C kopiere ich den gesamten Inhalt ins Clipboard, das mein Programm dann auswertet.

Nun möchte ich das automatisieren, d.h. mein Programm soll im Hintergrund laufen und alle paar Minuten ohne mein Zutun den Quellcode herunterladen und auswerten.
Ich habe hier auch schon einige Beiträge gelesen und die gezeigten Routinen ausprobiert, leider ohne Erfolg.

Dieses scheint zumindest teilweise zu funktionieren, liefert aber nur einen kleinen Teil der Daten und auch innerhalb dieses Teiles fehlen einige Daten.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   IdHttp:TIdHttp;
   data:string;
begin
   //  data:=LoadUrl('http://www.030chat.de');
   idHttp:=TIdHttp.Create;
   Data := IdHTTP.Get('http://www.030chat.de');
   idHttp.Free;
   Memo1.Text:=data;
end;
Ein anderes das ich ausprobierte liefert einen leeren String, obwohl ein paar Daten geladen wurden.
Delphi-Quellcode:
function LoadURL(URL: String): String;
var
   IOpen, IURL: HINTERNET;
   Read: Cardinal;
   Msg: array[0..4096] of Char;
begin
   Result := '';
   IOpen := InternetOpen('GetIP', INTERNET_OPEN_TYPE_PRECONFIG, '', '',
                         INTERNET_FLAG_NEED_FILE);
   if IOpen <> nil then
   try
     IURL := InternetOpenUrl(IOpen, PWideChar(URL), nil, 0,
                             INTERNET_FLAG_NO_UI or INTERNET_FLAG_PRAGMA_NOCACHE
                             or INTERNET_FLAG_RELOAD, 0);
     if IURL <> nil then
     try
       repeat
         FillChar(Msg, SizeOf(Msg), 0);
         if InternetReadFile(IURL, @Msg[0], Pred(SizeOf(Msg)), Read) then
           Result := Result + Msg else
             Break;
       until Read = 0;
     finally
       InternetCloseHandle(IURL);
     end;
   finally
     InternetCloseHandle(IOpen);
   end;
end;
Das dritte, das ich probiert habe basiert auf TWebBrowser, liefert aber, wie das erste nur einen kleinen Teil der Daten (anscheinend nur den Header der Seite).

Ich habe mich bisher nie mit "Internet" beschäftigt, stehe sozusagen auf dem Schlauch und bekomme Verständnis für Beiträge in denen jemand fragt "wie kann ich zwei Zahlen addieren".

Könnte mir bitte jemand weiterhelfen ?
Was ich vorzugsweise möchte, ist das, was ich bei eingangs beschriebener Vorgehensweise erhalte.

Phoenix 11. Jul 2012 21:54

AW: Quellcode einer Webseite herunterladen
 
Tja. Das ist recht einfach. Dir scheint es bei der Seite um die Tabelle zu gehen?

Wenn Du Dir die eigentliche Antwort bei der URL anschaust, dann siehst Du folgendes:
Code:
<FRAMESET cols="120,*" FRAMEBORDER=0 FRAMESPACING=0 SCROLLING="AUTO" BORDER=0>
  <FRAME SRC="navi.htm" NAME="webnavi" SCROLLING="AUTO" MARGINHEIGHT=5 MARGINWIDTH=5>
  <FRAME SRC="online.html" NAME="webmain" SCROLLING="AUTO" MARGINHEIGHT=5 MARGINWIDTH=5>
</FRAMESET>
Das heisst die Webseite verwendet Frames. Einen Links mit der Navi, und einen rechts mit dem Hauptteil der Seite drin.
Das ist wohl der interessante Teil und dort steht auch der Pfad: Online.html.

Das heisst wenn Du nun http://www.030chat.de/online.html anfragst bekommst Du die ganzen Tabellen mit allen Daten ohne die Navigation drumrum.
Versuch das mal als Adresse und dann schau mal wie Du die Antwort auswerten kannst.

p80286 11. Jul 2012 22:21

AW: Quellcode einer Webseite herunterladen
 
Versuch es doch mal hiermit:http://www.delphipraxis.net/557172-post5.html

Gruß
K-H

Amateurprofi 11. Jul 2012 22:25

AW: Quellcode einer Webseite herunterladen
 
Zitat:

Zitat von Phoenix (Beitrag 1174375)
Tja. Das ist recht einfach. Dir scheint es bei der Seite um die Tabelle zu gehen?

Wenn Du Dir die eigentliche Antwort bei der URL anschaust, dann siehst Du folgendes:
Code:
<FRAMESET cols="120,*" FRAMEBORDER=0 FRAMESPACING=0 SCROLLING="AUTO" BORDER=0>
  <FRAME SRC="navi.htm" NAME="webnavi" SCROLLING="AUTO" MARGINHEIGHT=5 MARGINWIDTH=5>
  <FRAME SRC="online.html" NAME="webmain" SCROLLING="AUTO" MARGINHEIGHT=5 MARGINWIDTH=5>
</FRAMESET>
Das heisst die Webseite verwendet Frames. Einen Links mit der Navi, und einen rechts mit dem Hauptteil der Seite drin.
Das ist wohl der interessante Teil und dort steht auch der Pfad: Online.html.

Das heisst wenn Du nun http://www.030chat.de/online.html anfragst bekommst Du die ganzen Tabellen mit allen Daten ohne die Navigation drumrum.
Versuch das mal als Adresse und dann schau mal wie Du die Antwort auswerten kannst.

Danke, Phoenix,
habe ich ausprobiert, funktioniert aber leider nicht.
Beim Data := IdHTTP.Get('http://www.030chat.de/online.html'); hängt "sich das auf".
Da scheint eine endlos-Schleife zu laufen. (CPU-Auslastung 12 %, also "eine CPU voll ausgelastet).
Die Webseite funktioniert (Das Get… ohne "/online.html" läuft wie bisher.

Andreas L. 12. Jul 2012 09:33

AW: Quellcode einer Webseite herunterladen
 
Vielleicht hilft davon etwas:
  • TIdCookieManager zuweisen
  • Request.UserAgent einen Browser-UserAgent zuweisen
  • HandleRedirects auf True setzen

Welche Indy-Version verwendest du? Vielleicht behebt ein Update das Problem.

Amateurprofi 12. Jul 2012 13:17

AW: Quellcode einer Webseite herunterladen
 
Zitat:

Zitat von Andreas L. (Beitrag 1174410)
Vielleicht hilft davon etwas:
  • TIdCookieManager zuweisen
  • Request.UserAgent einen Browser-UserAgent zuweisen
  • HandleRedirects auf True setzen

Welche Indy-Version verwendest du? Vielleicht behebt ein Update das Problem.

Hallo Andreas L.,
danke für die Hinweise.

HandleRedirects hab ich auf True gesetzt, bringt keine anderen Ergebnisse.
UserAgent enthält "Mozilla/3.0 (compatible; Indy Library)" – muss ich da was ändern ? Und wenn ja, was muss ich da reinschreiben?
Die Indy-Version scheint 10.5.7 zu sein.

Und last not least "TIdCookieManager zuweisen"
Wie mache ich das? Ich hab keinerlei Erfahrung auf diesem Gebiet.

Andreas L. 12. Jul 2012 13:43

AW: Quellcode einer Webseite herunterladen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1174451)
UserAgent enthält "Mozilla/3.0 (compatible; Indy Library)" – muss ich da was ändern ? Und wenn ja, was muss ich da reinschreiben?

z. B.: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1
Weitere: http://www.useragentstring.com/pages...gentstring.php

Zitat:

Zitat von Amateurprofi (Beitrag 1174451)
Und last not least "TIdCookieManager zuweisen"
Wie mache ich das? Ich hab keinerlei Erfahrung auf diesem Gebiet.

Einen TIdCookieManager auf die Form ziehen und der Eigenschaft CookieManager der IdHTTP-Komponente eintragen und AllowCookie auf true setzen.

shmia 12. Jul 2012 13:58

AW: Quellcode einer Webseite herunterladen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich kann die Seite http://www.030chat.de/online.html ohne Probleme herunterladen.
Cookies werden keine gesetzt und es wird auch kein Redirect angeboten.
Testprogramm ist im Anhang.

Thom 12. Jul 2012 14:03

AW: Quellcode einer Webseite herunterladen
 
Bei mir gibt es auch keine Probleme (Delphi XE): Mit den enthaltenen Indy-Komponenten funktioniert das Laden der Seite. Cookies sind ebenso egal wie der User-Agent.
Delphi-Quellcode:
  HTTP:=TIdHTTP.Create;
  try
    Content:=HTTP.Get('http://www.030chat.de/online.html');
    HTTP.Response.RawHeaders.ConvertToStdValues(Memo1.Lines);
    Memo1.Lines.Add(Content);
  finally
    HTTP.Free;
  end;

Andreas L. 12. Jul 2012 14:13

AW: Quellcode einer Webseite herunterladen
 
Bei mir gehts auch (Delphi 2009 Pro + Indy 10)

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  http: TIdHTTP;
begin
  http := TIdHTTP.Create(nil);
  try
    Memo1.Text := http.Get('http://www.030chat.de/online.html');
  finally
    FreeAndNil(http);
  end;
end;

Amateurprofi 13. Jul 2012 15:33

AW: Quellcode einer Webseite herunterladen
 
Habe alles ausprobiert, alles was offenbar bei allen funktioniert, funktioniert (außer dem was shmia gepostet hat) bei mir leider nicht.
Vielen Dank an alle und ganz besonderen Dank an shmia.
Problem gelöst und ich bin happy.

Andreas L. 14. Jul 2012 09:22

AW: Quellcode einer Webseite herunterladen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1174616)
Problem gelöst und ich bin happy.

Wie konntest du das Problem beheben?

Amateurprofi 14. Jul 2012 17:44

AW: Quellcode einer Webseite herunterladen
 
Mit einer für meine Zwecke umgemodelten Version von shmias Projekt.
Delphi-Quellcode:
class function TMain.CreateRequestObject: IXMLHTTPRequest;
begin
   try
      Result := Createoleobject('Msxml2.XMLHTTP.6.0') as IXMLHTTPRequest;
   except
      on E:Exception do
      begin
         E.Message := 'MSXML 4.0 or higher required!'#13#10+E.Message;
         raise;
      end;
   end;
end;
Delphi-Quellcode:
FUNCTION TMain.ReadSourceCode(const url:string; var headers,texts:string):boolean;
const
   header='User-Agent';
   value='Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)';
var
   req:IXMLHTTPRequest;
   body:OleVariant;
begin
   req := CreateRequestObject;
   req.Open('GET', url, false, '', '');
   req.SetRequestHeader(header, value);
   body := '';
   req.Send(body);
   headers:=req.GetAllResponseHeaders;
   texts:=req.ResponseText;
   result:=req.statusText='OK';
end;

decibel666 28. Okt 2012 13:27

AW: Quellcode einer Webseite herunterladen
 
Hallo!

Hab mir das Programm xmlhttprequest.zip angesehen und es macht genau das was ich auch machen will. Wollte es mit Borland Enterprise 7 compilieren , scheitert aber daran das
eine Komponente nicht gefunden wird und zwar MSXML2_TLB. Welche Version von MSXML muss ich hier instzellieren ? (Ich verwende Windows 7 64 Bit und Borland Delphi 7 Enterprise..)

So MSXML 4.0 Service Pack 2 ist jetzt instlaliert und exportiert. Das funktioniert jetzt. Nur kommt jetzt beim Kompilieren wieder ein Fehler :( [Fehler] Unit1.pas(90): Undefinierter Bezeichner: 'EmptyParam' . Hmzz

Auch erledigt : Unter Delphi 7 muss die Unit Variants.pas eingebunden werden.

Funktioniert jetzt :) Jetzt kann ichs meinen Wünschen anpassen *freu*

Sorry, hab schon lange nichts mehr mit Delphi gemacht (doch schon mehr als 10 Jahre her)...

Folgendes will ich jedenfalls probieren :

Würde gerne die Holidaycheckseite mit einer vordefinierten Abfrage automatisch auswerten (in einem gewissen Interval) und bei einem gewissen Schwellwert (Preis) ein Mail an mich verschicken.

So brauch ich nicht jeden Tag nachsehen obs ein Neues Angebot mit meinen speziellen Angaben gibt

Die URL der Seite welche ausgewertet werden soll sieht zb. so aus (hier sind alle gewünschten Optionen enthalten- je nach Abfrage ändern sich natürlich die URL..) :

http://www.holidaycheck.at/hotel-Rei...ferlistOrder=0

Ich will jetzt den Bereich wo class="offerlistItem.." davor steht auswerten und
aufbereiten und wenn der Preis unter einem bestimmten Wert fällt eine Mail verschicken.

Mal schauen ob es auch möglich ist das Angebot Prüfen auch auszuwerten...

vielen Dank
DeCi


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz