Datei per http aus dem Web laden

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

Datei per http aus dem Web laden

Beitrag von turbo »

Moin,

vor gut 25 Jahren habe ich mal in Turbo Pascal von 3.0 bis 6.0 unter MSDOS von 2.11 bis 6.22 programmiert. Jetzt steige ich mit fpc/Lazarus wieder ein. Heute Abend geht es beim lokalen monatlichen Oldenburger Lazarustreffen los.

Nach dem Test des Compilers mit "Hallo Welt" steht jetzt das 2. Programm zur Realisierung an. Es soll eine Konsolenanwendung für Windows 7 und Linux Mint 17.2 werden, die ab Intel i5 aufwärts läuft. Es wäre gut, wenn man bei allen meinen Programmen Konzepte verwendete, die auch auf Mac und Android laufen können. Das ist aber jetzt erst mal nicht so wichtig.

Das Programm soll im Wesentlichen ungefähr so aussehen:

Code: Alles auswählen

 
program roaloader;
 
uses NochAuszuwaehlendeURLBibliothek;
 
var
  ROA: double;
 
  function LoadROAFromWeb(const aURL: shortstring): double;
  begin
    Daten ins RAM laden, nicht in eine Datei
    ROA in den Daten raussuchen, result zuweisen
  end;
 
begin
  ROA:= LoadROAFromWeb('http://finviz.com/quote.ashx?t=intc');
end.
Inhaltlich geht es um Webcrawling von Wertpapierdaten wie sie z.B. hier angezeigt werden von http://finviz.com/quote.ashx?t=intc . Das Beispiel ROA ist Return On Assets. Später werden diverse Daten aus einer Vielzahl von Quellen verknüpft: SEC, EZB, NASDAQ, Yahoo usw.

Könnt Ihr meine Gedanken noch etwas lenken. Ich sehe den Wald vor lauter Bäumen nicht. Hinweise zur Auswahl der "Download-Routine" wären hilfreich sowie einige Schlagworte, was ich mir noch ansehen sollte.


Die letzte Tage habe ich mir angesehen und vielleicht auch einige Teile verstanden:

Übersicht Netzwerk-Bibliotheken: http://wiki.freepascal.org/Networking_libraries

Ist das vielleicht die Lösung?
http://wiki.freepascal.org/fphttpclient#Examples

Damit kam ich nicht so gut klar, außerdem stand irgendwo, dass es für eine spätere Verwendung mit Threads nciht geeignet sei.:
lNet: http://wiki.freepascal.org/lNet#Documentation http://sourceforge.net/projects/lazarus ... t%200.6.5/
Außerdem hatte ich Probleme, diese Dokumentation lesbar anzuzeigen: /lnet/doc/en/doc_lnet.xml

Synapse sah auf den ersten Blick ganz gut aus.
Code: http://www.lazarusforum.de/viewtopic.php?p=77413#p77413
http://synapse.ararat.cz/doc/help/
Beispiel Getfile: http://stackoverflow.com/questions/6291 ... pse-delphi
Installation Synapse: http://www.lazarusforum.de/viewtopic.php?p=77417#p77417
http://synapse.ararat.cz/doc/help/laz_synapse.html
Beispiel: http://wiki.freepascal.org/Synapse#From_an_HTTP_server

Internet Tools, das sah auch ganz sympatisch aus, vor allem das Umfeld:
http://www.benibela.de/sources_de.html#internettools
http://wiki.freepascal.org/Internet_Too ... a_web_page:
Allerdings gab es da nicht wirklich etwas, was ein Anfänger wie ich als gut verständliche (über den Quelltext hinausgehende) Dokumentation verstehen würde.

Das passt nicht so ganz oder ich verstehe davon noch weniger, als ich bisher denke.
http://www.martinjakobs.de/media/Lazaru ... 1.2010.pdf
Webserver: http://opensoft.homeip.net/articles/webserver1.pdf ich will ja einen Client

Das habe ich nciht einmal in der deutschen Version des Lazarus Buches verstanden:
http://wiki.freepascal.org/Web_Service_Toolkit

Ob das was brauchbares drin ist? http://silvioprog.github.io/brookframework/


Nachdem der Download von der Webseite geschafft ist, soll schrittweise ergänzt werden:
- Prüfung, ob eine Datei seit dem letzten Besuch verändert wurde und dann nicht erneut downloaden
- Threads, um auf unterschiedliche Datenquellen parallel "warten" zu können
- Ausdehnung auf diverse Kennzahlen neben ROA
- in eine Objekthierarchie gießen
- als Form anzeigen
- in eine Datenbank schreiben
- Auswertung des Datenbestandes auf Widersinnigkeit von menschlichen Entscheidungen
- langfristig Erweiterung heute üblicher Entscheidungsmodelle, jenseits von typischerweise verwendeten Menschenbildern
- Weltfrieden :lol:


Das ist schon mal vorsorglich notiert:
http://wiki.freepascal.org/Package_List

Hinweise zu Threads:
http://wiki.freepascal.org/Multithreade ... utorial/de
http://wiki.freepascal.org/Manager_Work ... ads_System


Wie mache ich jetzt am besten praktisch weiter?
Liebe Grüße
turbo

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

Re: Datei per http aus dem Web laden

Beitrag von theo »

Was ist genau die Frage?
Bereits In deinem ersten Link gibt es eine Methode, um die Daten mit TFPHttpClient zu holen.
Wo ist das Problem?

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Datei per http aus dem Web laden

Beitrag von Komoluna »

Ich glaube du möchtest Empfehlungen zu Netzlibs haben, oder?

Das wird kompliziert, da es relativ viele gibt die alle ihre Stärken und Schwächen haben.
Jeder hier hat da so seine Präferenzen. Ich finde z.b. Synapse gut. Ich finde es angenehm damit zu arbeiten, andere mögen aber anders denken...

Für einfache HTTP Requests hat Synapse fertige Methoden nach dem Schema

Code: Alles auswählen

HTTPGetText(url, Stringlist)
MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

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

Re: Datei per http aus dem Web laden

Beitrag von wp_xyz »

Ist das vielleicht die Lösung?
http://wiki.freepascal.org/fphttpclient#Examples
Der folgende Code funktioniert bei mir basierend auf der im fpc integrierten Unit fphttpclient, es sind also keine weiteren Bibliotheken erforderlich; es wird die als Parameter übergebene URL in einen Stream geladen:

Code: Alles auswählen

 
function DownloadHTTP(URL: String; AStream: TStream): Boolean;
var
  response: Integer;
begin
  with TFPHttpClient.Create(nil) do
    try
      Get(URL, AStream);
      response := ResponseStatuscode;
      Result := (response >= 100) and (response < 300);
    finally
      Free;
    end;
end;
 
Wenn du von DOS kommst, wirst du wahrscheinlich noch nicht mit Streams gearbeitet haben; das sind die "Dateien" des objektorientierten Zeitalters. Es gibt dabei auch den speziellen "MemoryStream", sozusagen eine Datei im RAM, wie von dir gewünscht.

Um obigen Code anwenden zu können, musst du zuerst den Stream erzeugen. Dann wird die URL in den Stream eingelesen. Da gelesenen Datei einfache Textdaten sind, würde ich den Stream dann an eine Stringlist übergeben, in der du auf die einzelnen Zeilen über einen Index zugreifen kannst. Zum Schluss nicht vergessen, die erzeugten Objekte wieder zu zerstören.

Etwa so (nicht getestet):

Code: Alles auswählen

 
var
  stream: TStream;
  stringlist: TStringList;
  i: Integer;
begin
  stringlist := TStringList.Create;
  try
    stream := TMemoryStream.Create;
    try
      if DownloadHTTP(URL, stream) then
      begin
        // für yahoo-finance wäre die URL beispielsweise:
        // http://real-chart.finance.yahoo.com/table.csv?s=IFNNY&a=00&b=1&c=2000&d=09&e=7&f=2014&g=d&ignore=.csv
 
        // Stream wieder an den Anfang setzen
        stream.Position := 0;
 
        // Stream in die Stringliste einlesen
        stringlist.LoadFromStream(stream);
 
        // Zeilenweise ausgeben
        for i:=0 to stringlist.Count-1 do
          WriteLn(stringlist[i]);
      end else
        WriteLn(URL + 'konnte nicht gelesen werden');
    finally
      stream.Free;
    end;
  finally
    stringlist.Free;
  end;
end;
Hier werden die eingelesenen Zeilen einfach per WriteLn in der Konsole ausgegeben. Du wirst natürlich diese Zeilen in ihre Bestandteile zerlegen wollen. Aber das wird dann die nächste Frage, verdau' mal zuerst das hier alles.

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

Re: Datei per http aus dem Web laden

Beitrag von creed steiger »

haben die keine json api oder so was, das wäre das einfachste.

turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

Re: Datei per http aus dem Web laden

Beitrag von turbo »

Moin,

schon einmal vielen Dank soweit. Ich schaue mir das an und probiere es aus.

Das brauche ich später vielleicht noch:
DynDNS: http://forum.lazarus.freepascal.org/ind ... #msg110917
https: http://www.lazarusforum.de/viewtopic.php?f=26&t=8774
Liebe Grüße
turbo

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

Re: Datei per http aus dem Web laden

Beitrag von theo »

creed steiger hat geschrieben:haben die keine json api oder so was, das wäre das einfachste.
Ja, mit API (z.B. Yahoo) hat man schnell was anzuschauen. :wink:

Code: Alles auswählen

uses ...,httpsend; //Synapse
...
var Ms:TMemoryStream;
begin
  Ms:=TMemoryStream.Create;
  HttpGetBinary('http://download.finance.yahoo.com/d/quotes.csv?s=AAPL+MSFT&f=snat1---',Ms);
  Ms.Position:=0;
  StringGrid1.LoadFromCSVStream(Ms,',',false);
  Ms.free;
end; 

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Datei per http aus dem Web laden

Beitrag von Andromeda »

Hallo turbo,

viele nützliche Funktionen für die Kommunikation mit dem Internet sind in der Synapse-Sammlung enthalten, wie zum Beispiel http, ftp, smtp usw. Du findest die aktuellen Dateien unter der Internet-Adresse http://www.ararat.cz/synapse/doku.php/download

Lade die Datei synapse.zip herunter und packe sie aus. Im Lazarus-Programmordner erstellst Du jetzt den Unterordner „Synapse“ und überträgst alle Dateien aus dem entpackten Ordner. Die für Dich wichtigen Units befinden sich hier im Unterordner source/lib. Starte Lazarus und gib unter Projekt --> Projekteinstellungen --> Compilereinstellungen --> Andere Units den Pfad zu diesem Ordner an, also beispielsweise „../..lazarus/synapse/source/lib“. Wenn Du noch ein Häkchen bei „Diese Compilereinstellungen als Vorgabe“ machst, kannst Du das Einstellmenü mit [OK] abspeichern.

Im Programm brauchst Du dann nur noch mit uses ..., httpsend, ftpsend oder ssl_openssl die entsprechende Unit laden. Mit dem folgenden Code lade ich beispielsweise täglich die von der EZB veröffentlichten Wechselkurse über eine Stringliste in ein Memo:

Code: Alles auswählen

 
var
  t:TStringList;
begin
  with THTTPSend.Create do
    try
      HTTPMethod('GET','http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
      t := TStringList.Create;
      t.LoadFromStream(Document);
      Memo.Text:=t.Text;
    finally
      t.Free;
    end;
 

Antworten