Startseite einer Website mit Synapse herunterladen

Alle Fragen zur Netzwerkkommunikation

Startseite einer Website mit Synapse herunterladen

Beitragvon Patrix2911 » 30. Jul 2017, 13:07 Startseite einer Website mit Synapse herunterladen

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.
Patrix2911
 
Beiträge: 31
Registriert: 30. Jul 2017, 12:53

Beitragvon theo » 30. Jul 2017, 13:43 Re: Startseite einer Website mit Synapse herunterladen

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
theo
 
Beiträge: 8146
Registriert: 11. Sep 2006, 18:01

Beitragvon Patrix2911 » 30. Jul 2017, 16:27 Re: Startseite einer Website mit Synapse herunterladen

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: 31
Registriert: 30. Jul 2017, 12:53

Beitragvon Patrix2911 » 30. Jul 2017, 20:19 Re: Startseite einer Website mit Synapse herunterladen

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 .... :(
Patrix2911
 
Beiträge: 31
Registriert: 30. Jul 2017, 12:53

Beitragvon wp_xyz » 30. Jul 2017, 20:54 Re: Startseite einer Website mit Synapse herunterladen

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;
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon Patrix2911 » 30. Jul 2017, 21:09 Re: Startseite einer Website mit Synapse herunterladen

Danke für deine Antwort. :) Ich verwende allerdings die Linux Version von Lazarus, da wirds mit den beiden DLLs schwierig :/
Patrix2911
 
Beiträge: 31
Registriert: 30. Jul 2017, 12:53

Beitragvon wp_xyz » 30. Jul 2017, 21:25 Re: Startseite einer Website mit Synapse herunterladen

Ach so. Wenn OpenSSL installiert ist, geht's auch so.
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon Patrix2911 » 30. Jul 2017, 22:00 Re: Startseite einer Website mit Synapse herunterladen

Funktioniert weitestgehend. Ich danke Dir!!! Aber, wenn die URL nicht existiert, stürzt die Anwendung ab ... wie kann ich das abfangen?
Patrix2911
 
Beiträge: 31
Registriert: 30. Jul 2017, 12:53

Beitragvon wp_xyz » 30. Jul 2017, 23:22 Re: Startseite einer Website mit Synapse herunterladen

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;
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon creed steiger » 31. Jul 2017, 00:20 Re: Startseite einer Website mit Synapse herunterladen

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.
Code: Alles auswählen
curl http://www.maler-ehrt-halle.de

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.
Code: Alles auswählen
curl https://www.maler-ehrt-halle.de

3 Minuten google.
Den Rest überlass ich dir.
creed steiger
 
Beiträge: 949
Registriert: 11. Sep 2006, 21:56

Beitragvon Patrix2911 » 31. Jul 2017, 07:09 Re: Startseite einer Website mit Synapse herunterladen

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 ....
Patrix2911
 
Beiträge: 31
Registriert: 30. Jul 2017, 12:53

Beitragvon wp_xyz » 31. Jul 2017, 11:55 Re: Startseite einer Website mit Synapse herunterladen

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.
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon Patrix2911 » 31. Jul 2017, 14:49 Re: Startseite einer Website mit Synapse herunterladen

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?
Patrix2911
 
Beiträge: 31
Registriert: 30. Jul 2017, 12:53

Beitragvon wp_xyz » 31. Jul 2017, 15:17 Re: Startseite einer Website mit Synapse herunterladen

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 31. Jul 2017, 15:32, insgesamt 1-mal geändert.
wp_xyz
 
Beiträge: 2833
Registriert: 8. Apr 2011, 08:01

Beitragvon theo » 31. Jul 2017, 15:20 Re: Startseite einer Website mit Synapse herunterladen

Ich glaube BeniBelas Internet Tools können sowas auch:
http://benibela.de/sources_en.html#internettools
theo
 
Beiträge: 8146
Registriert: 11. Sep 2006, 18:01

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Netzwerk



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron
porpoises-institution
accuracy-worried