Startseite einer Website mit Synapse herunterladen

Alle Fragen zur Netzwerkkommunikation
Patrix2911
Beiträge: 32
Registriert: So 30. Jul 2017, 13:53

Startseite einer Website mit Synapse herunterladen

Beitrag von Patrix2911 »

Hallo,

also ich hab in der Vergangenheit hin und wieder kleine Tools für meinen Gebrauch unter Windows in Delphi realisiert. Da ich mich nun mehr & mehr aus verschiedensten Gründen zu Linux hingezogen fühle bin ich auf Lazarus gestoßen. Eine tolle Sache & auch noch Free, besser geht es nicht. :)

Nun zum eigentlichen, ich habe eine Liste von Urls die ich nach und nach abarbeiten und die jeweiligen Startseiten (index.html, index.php, etc.) lokal als Textdatei speichern möchte. Ich hab mich nun schon mehrmals mit Google über dieses Thema unterhalten, dabei stieß ich auch auf Threads in diesem Forum, der förderte mir die Synapse Units zu tage ... das funktioniert allerdings nur teilweise ...

Hier mal der Code:

In Memo1 sind folgende Zeilen enthalten:

http://www.klebe-portal.de
http://www.maler-ehrt-halle.de

Mit der ersten Url funktioniert es, mit der zweiten nicht ....

Code: Alles auswählen

 
procedure DownloadUrl(Url: String; Fn : String);
var
  t:TStringList;
  i:longint;
begin
  with THTTPSend.Create do
    try
      Log('Navigiere zu '+Url);
      HTTPMethod('GET',Url);
 
 
      t := TStringList.Create;
      t.LoadFromStream(Document);
      t.savetofile('Test.txt');
 
      If T.Count > 0 then
       Begin
        Log ('Lese Quelltext von "'+Url+'" ein.');
        T.SaveToFile(Fn);
       end else Log ('Adresse "'+url+'" nicht gefunden.');
    finally
      t.Free;
    end;
 Log('Bereit.');
end;
 
...
 
procedure TMain.Button5Click(Sender: TObject);
var i : integer;
begin
 For I := 0 to Memo1.Lines.Count-1 do
 Begin
  DownloadUrl(Memo1.Lines[i],inttostr(I)+'.txt');
 End;
end;
 
 
 


Das hat nun zum Ergebnis das in der 0.txt der Inhalt der index.html von http://www.klebe-portal.de steht, allerdings in der 1.txt steht nichts ...

Ich hoffe mir kann hier jemand helfen und danke im voraus für die Mühe.

Beste Grüße, Patrick.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von theo »

Hat möglicherweise mit einem HTTP Redirect zu tun (HTTP Resultat 301 etc.)
Hier gibt es was dazu, habe ich aber nicht getestet.
http://wiki.freepascal.org/Download_from_SourceForge

Patrix2911
Beiträge: 32
Registriert: So 30. Jul 2017, 13:53

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von Patrix2911 »

Danke für deine Mühe. Bin leider erst heut Abend zu Hause werd es aber heute Abend noch testen und meine Erfahrung hier Preis geben falls mal jemand vor dem selben Problem steht. :)

Patrix2911
Beiträge: 32
Registriert: So 30. Jul 2017, 13:53

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von Patrix2911 »

Also ich konnte das ganze nun testen, allerdings erfolglos

Code: Alles auswählen

raise Exception.Create('Downloaded document is empty.');


An dieser Codezeile bleibt das Programm dann hängen. Allerdings hab ich jetzt gelesen das ist direkt um Sourceforge Projekt-Seiten auszulesen, ich hab keine Ahnung wie ich das umstricken könnte .... :(

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von wp_xyz »

Mit synapse ist es mir bisher auch nicht gelungen, den Quelltext der 2.Seite herunterzuladen, ich erhalte immer FehlerCode 500. Wenn du aber statt Synapse die Unit fphttpclient verwendest, die mit zum "Lieferumfang" von fpc/Lazarus gehört, funktioniert es. Allerdings musst du die beiden OpenSSL-DLLs libeay32.dll und ssleay32.dll ins Verzeichnis der Exe-Datei kopieren.

Code: Alles auswählen

uses
  fphttpclient;
 
function DownloadHTTP(URL: String; AStream: TStream; out AErrMsg: String): Boolean;
begin
  AErrMsg := '';
  with TFPHTTPClient.Create(nil) do
    try
      AllowRedirect := true;
      Get(URL, AStream);
      Result := (ResponseStatusCode = 200);
      if not Result then
        AErrMsg := ResponseStatusText;
    finally
      Free;
    end;
end;
 
procedure Log(AMsg: String);
begin
  Form1.Memo2.Lines.Add(AMsg);
end;
 
procedure DownloadURL(URL: String; FN: String);
var
  stream: TMemoryStream;
  errmsg: String;
  t:TStringList;
  i:longint;
begin
  stream := TMemoryStream.Create;
  try
    Log('Lese Quelltext von "' + URL + '" ein:');
    if DownloadHTTP(URL, stream, errmsg) then
    begin
      stream.SaveToFile(FN);
      Log('--> OK (' + IntToStr(stream.Size) + ' Bytes gelesen)');
    end else
      Log('--> Fehler: ' + errmsg);
  finally
    stream.Free;
  end;
end;

Patrix2911
Beiträge: 32
Registriert: So 30. Jul 2017, 13:53

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von Patrix2911 »

Danke für deine Antwort. :) Ich verwende allerdings die Linux Version von Lazarus, da wirds mit den beiden DLLs schwierig :/

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von wp_xyz »

Ach so. Wenn OpenSSL installiert ist, geht's auch so.

Patrix2911
Beiträge: 32
Registriert: So 30. Jul 2017, 13:53

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von Patrix2911 »

Funktioniert weitestgehend. Ich danke Dir!!! Aber, wenn die URL nicht existiert, stürzt die Anwendung ab ... wie kann ich das abfangen?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von wp_xyz »

Mit einem stummen try-except Block. Allerdings wird die IDE immer noch anhalten, außerhalb der IDE passiert nichts. Vielleicht gibt es auch eine Methode des HTTPClient, die die Verbindung zur Zielseite ohne die Gefahr einer Exception herstellen kann, wenn nicht, sollte man sowas mal auf der fpc MailingList vorschlagen.

Code: Alles auswählen

 
function DownloadHTTP(URL: String; AStream: TStream; out AErrMsg: String): Boolean;
begin
  AErrMsg := '';
  with TFPHTTPClient.Create(nil) do
    try
      AllowRedirect := true;
      try
        Get(URL, AStream);
        Result := (ResponseStatusCode = 200);
        if not Result then
          AErrMsg := ResponseStatusText;
      except
        Result := false;
        AErrMsg := 'Fehler, z.B. URL existiert nicht.';
      end;
    finally
      Free;
    end;
end;

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von creed steiger »

Poste die Antwort lieber da:
http://www.delphipraxis.net/193432-star ... ost1377759

;)
an den Threadersteller:

mal davon abgesehen liefert curl das selbe Resultat, ein leeres File.

WENN man jetzt selber ein bissl nachgeforscht hätte, könnte man darauf kommen das man mit https statt http plötzlich doch
ein Ergebnis geliefert bekommt.

3 Minuten google.
Den Rest überlass ich dir.

Patrix2911
Beiträge: 32
Registriert: So 30. Jul 2017, 13:53

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von Patrix2911 »

Hallo wp_xyz,

nochmal danke für deine Mühe mit der ich nun endlich zum Ziel gekommen bin. :)

@creed steiger

Auch Dir danke für deinen Vorschlag, dass das Problem mit der Weiterleitung bzw. Änderung von http zu https zu tun ist mir dann auch aufgefallen, aber ich ging davon aus das auch in dem Fall ein File mit ner 301-Funktion vom Server kommt der dann die https Adresse enthält ...

Auf CURL bin ich tatsächlich auch gestoßen. Wenn ich jedoch mehrere Adressen mittels CURL (Url) in einer FOR-Schleife abgreife ... ist mir keine Funktion bekannt die auf die erfolgreiche oder fehlerhafte Ausführung eines Shell-Befehls wartet ....

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von wp_xyz »

Hier noch die nun funktionierende Lösung mit Synapse:

Code: Alles auswählen

uses
  httpsend, ssl_openssl;
 
function DownloadHTTP(URL: String; AStrings: TStrings; out AErrMsg: String): Boolean;
var
  ok: Boolean;
  realURL: String;
  i, p: Integer;
  s: String;
begin
  Result := false;
  AErrMsg := '';
  with THttpSend.Create do
    try
      ok := HTTPMethod('GET', URL);
      if ok then
      begin
        // If its a 301 or 302 we need to do more processing
        if (ResultCode = 301) or (ResultCode = 302) then
        begin
          realURL := '';
          // Check the headers for the Location header
          for i := 0 to Headers.Count -1 do
          begin
            // Extract the URL
            s := Headers[i];
            p := pos('location', Lowercase(s));
            if p = 1 then begin
              p := Length('location') + 1;
              while (p < Length(s)) and (s[p] in [':', ' ', '"']) do
                inc(p);
              realURL := copy(s, p, MaxInt);
              while (realURL[Length(realURL)] in ['"', '/']) do
                Delete(realURL, Length(realURL), 1);
              break;
            end;
          end;
          if realURL <> '' then begin
            Log('Redirecting to ' + realURL);
            // If we have a URL, run it through the same function
            Result := DownloadHTTP(realURL, AStrings, AErrMsg)
          end else
            AErrMsg := 'Redirection error';
        end else begin
          AStrings.LoadFromStream(Document);
          Result := true;
        end;
      end
      else
        AErrMsg := 'Error code ' + IntToStr(ResultCode);
    finally
      Free;
    end;
end;
 
procedure DownloadURL(URL: String; FN: String);
var
  t: TStringList;
  errmsg: String;
begin
  t := TStringList.Create;
  try
    Log('Lese Quelltext von "' + URL + '" ein:');
    if DownloadHTTP(URL, t, errmsg) then
    begin
      t.SaveToFile(FN);
      Log('--> OK (' + IntToStr(Length(t.Text)) + ' Bytes)');
    end else
      Log('--> Fehler: ' + errmsg);
  finally
    t.Free;
  end;
end;

Ich war der Meinung, die unit ssl_openssl wäre ausreichend, aber man muss auch hier, wenn OpenSSL nicht installiert ist, die DLLs erreichbar machen. Apropos ssl_openssl: da diese Unit nicht im Package enthalten ist, muss man, ganz Lazarus-untypisch, den Pfad zu den Synapse-Quelltexten im Projekt angeben oder die beiden ssl_openssl* Units ins Projeklverzeichnis kopieren. Andererseits erzeugt Synapse bei einer nicht existierenden URL keine Exception sondern einen Fehler 500. Zusammen mit dem explizit zu codierenden HTTP-Redirect würde ich sagen: bei dieser Programmieraufgabe steht es 2:1 für fpc.

Patrix2911
Beiträge: 32
Registriert: So 30. Jul 2017, 13:53

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von Patrix2911 »

Nochmals danke für deine Mühe. :)

Gibt es vllt. auch eine Möglichkeit mit der Unit alle Links aus der heruntergeladen Datei in eine StringList zu lesen?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von wp_xyz »

Das geht recht einfach mit dem fasthtmlparser, der ebenfalls zum fpc gehört. Dieser durchläuft den eingelesenen Text Zeichen für Zeichen und erzeugt bei jedem gefundenen HTML-Tag ein Ereignis OnFoundTag, dem der komplette Text des Tag übergeben wird. Nun musst du nur prüfen, ob das Tag einen Querverweis enthält (HREF). Ein ausgearbeitetes Beispiel, nicht ganz komplett, und auch mit Extraction des reinen Texts der Seite, findest du unter http://forum.lazarus.freepascal.org/ind ... #msg239199
Zuletzt geändert von wp_xyz am Mo 31. Jul 2017, 16:32, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Startseite einer Website mit Synapse herunterladen

Beitrag von theo »

Ich glaube BeniBelas Internet Tools können sowas auch:
http://benibela.de/sources_en.html#internettools

Antworten