Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Webden Bir Alandan Veri Çekmek
#1
Arkadaşlar herkese merhaba

Hiç api kullanmadan (Çünkü safya üyeliksiz girişe açık ve veriler açıkta duruyor) resimde koyduğum alandaki veriyi çekemez miyiz (Delphi 7 kullanıyorum)?

Ben bunu php ile kolayca yapıyordum. Delphi ile bir edit içerisinde gösteremez miyim?


Adres: "https://www.binance.com/tr/markets"
Mesela resimdeki gibi XRP nin "div.css-1ad2brd" alanındaki "0.00084913" değerini edit içerisinde görmek istiyorum.

Umarım anlatabilmişimdir.


Ek Dosyalar Resimler
   
Cevapla
#2
Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..  Smile

* Sizin için çözüm üreten kod aşağıdadır. 

 Idea Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim. 

 Arrow Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.

uses System.Net.HttpClientComponent, System.Generics.Collections, JSON;

function GetBinanceHighValue( const xValues: array of string ): string;
const
  aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
  aClient : TNetHTTPClient;
  sJSON, sSearch   : String;
  aJSONData   : TJSONValue;
  aJSONValue  : TJSONValue;
  i : Integer;
begin
  Result := '';
  aClient := TNetHTTPClient.Create(nil);
  try
    aClient.UserAgent   := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
    aClient.Accept      := 'text/html';
    sJSON               := aClient.Get( aUrl ).ContentAsString;

  // Parse Section
  // ------------------------------------------------------------------------ //
    sSearch := '<textarea id="__APP_DATA" style="display: none">';
    if pos(sSearch, sJSON ) > 0 then
    begin
      System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
      sSearch := '"productMap":';
      if pos(sSearch, sJSON ) > 0 then begin
        System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
        sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
      end;
    end;

  // -------------------------------------------------------------------------- //
  // JSON Parse section
  // -------------------------------------------------------------------------- //
    aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
    try
      if aJSONData <> nil then
      begin
        for i := Low(xValues) to High(xValues) do begin
          if aJSONData.FindValue(xValues[i]) <> nil then
          begin
            aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
            if aJSONValue.FindValue('high') <> nil then
            begin
              if Result = ''
                then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
                else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
            end;
          end;
        end;
      end else begin
        sJSON := '';
        MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
      end;
    finally
      aJSONData.Free;
    end;
  finally
    FreeAndNil(aClient);
  end;
end;

Kullanımı : 
procedure TForm1.Button1Click(Sender: TObject);
var
  Sonuclar : String;
begin
  Sonuclar := GetBinanceHighValue( [ 'ETHUSDT', 'BNBUSDT' ] );
  Showmessage( Sonuclar );
end;

lqdmj8yp8ixa7eef4dbm.gif
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#3
Merhabalar,

Buradaki konu işinizi görür düşüncesindeyim. O konuda öneri olarak sunulmuş diğer konulara da göz atmak fayda sağlayabilir.
özellikle @SimaWB hocamın konuları sizi nihai sonuca ulaştıracaktır kanaatindeyim.

Şahsi önerim ise ;

php tarafında kolaylıkla yapabiliyorsanız, php ile json çıktısı alıp delphi tarafında json olarak veriyi istediğiniz alana çekebilirsiniz. bu daha pratik bir yol sunacaktır diye düşünüyorum.
Tabiki yukarıdaki durumdan hariç olarak php kodunun sürekli çalışmasına ve uzaktan erişilmesine olanak sağlanması elbette bir dezavantaj  Idea
"Wall-e"
Cevapla
#4
(05-06-2020, Saat: 13:01)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..  Smile

* Sizin için çözüm üreten kod aşağıdadır. 

 Idea Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim. 

 Arrow Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.

uses System.Net.HttpClientComponent, System.Generics.Collections, JSON;

function GetBinanceHighValue( const xValues: array of string ): string;
const
  aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
  aClient : TNetHTTPClient;
  sJSON, sSearch   : String;
  aJSONData   : TJSONValue;
  aJSONValue  : TJSONValue;
  i : Integer;
begin
  Result := '';
  aClient := TNetHTTPClient.Create(nil);
  try
    aClient.UserAgent   := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
    aClient.Accept      := 'text/html';
    sJSON               := aClient.Get( aUrl ).ContentAsString;

  // Parse Section
  // ------------------------------------------------------------------------ //
    sSearch := '<textarea id="__APP_DATA" style="display: none">';
    if pos(sSearch, sJSON ) > 0 then
    begin
      System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
      sSearch := '"productMap":';
      if pos(sSearch, sJSON ) > 0 then begin
        System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
        sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
      end;
    end;

  // -------------------------------------------------------------------------- //
  // JSON Parse section
  // -------------------------------------------------------------------------- //
    aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
    try
      if aJSONData <> nil then
      begin
        for i := Low(xValues) to High(xValues) do begin
          if aJSONData.FindValue(xValues[i]) <> nil then
          begin
            aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
            if aJSONValue.FindValue('high') <> nil then
            begin
              if Result = ''
                then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
                else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
            end;
          end;
        end;
      end else begin
        sJSON := '';
        MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
      end;
    finally
      aJSONData.Free;
    end;
  finally
    FreeAndNil(aClient);
  end;
end;

Kullanımı : 
procedure TForm1.Button1Click(Sender: TObject);
var
  Sonuclar : String;
begin
  Sonuclar := GetBinanceHighValue( [ 'ETHUSDT', 'BNBUSDT' ] );
  Showmessage( Sonuclar );
end;

lqdmj8yp8ixa7eef4dbm.gif


Hocam çok teşekkür ederim fakat benim sormak istediğim farklı bir konu idi. Yani bu kodlarla evet veriyi çekebiliyoruz fakat benim istediğim resmini koyduğum sayfadaki verileri çekebilmek. Bir nevi parse tarzı... mrmarman



(05-06-2020, Saat: 13:05)Mr.Developer Adlı Kullanıcıdan Alıntı: Merhabalar,

Buradaki konu işinizi görür düşüncesindeyim. O konuda öneri olarak sunulmuş diğer konulara da göz atmak fayda sağlayabilir.
özellikle @SimaWB hocamın konuları sizi nihai sonuca ulaştıracaktır kanaatindeyim.

Şahsi önerim ise ;

php tarafında kolaylıkla yapabiliyorsanız, php ile json çıktısı alıp delphi tarafında json olarak veriyi istediğiniz alana çekebilirsiniz. bu daha pratik bir yol sunacaktır diye düşünüyorum.
Tabiki yukarıdaki durumdan hariç olarak php kodunun sürekli çalışmasına ve uzaktan erişilmesine olanak sağlanması elbette bir dezavantaj  Idea

Cevabınız için teşekkürler. Bu konuyu önce de gördüm ve biraz incelemiştim. Aslında mantık olarak yapmak istediğime benziyor fakat bu şekilde işlem yapamadım.Nasıl yapacağımı da bilemiyorum bir sürü test yaptım sonuca ulaşamadım...Sadece istediğim;Edit1.text alanına resmini koyduğum sayfadaki  XRP nin son fiyatını alabilmek.. Diğer arkadaşın verdiği kodla da oluyor fakat benim istediğim sadece sayfadaki o an var olan veriyi çekmek...Umarım anlatabildim...
Cevapla
#5
İlgili sayfaya neden ısrar ettiğinizi anlamakta güçlük çekiyorum. 
Size verdiğimiz cevap ile nokta tespiti ilgili veriyi parse ederek döndürüyor. Tek ve aynı veri geliyor...

PHP ile explode ederken de aynı şekilde parse ediyorsunuz buradan içeriği alarak da aynısı yapıyoruz. Amaç veri almak ise bu imkanı size sağladık, umarım istediğiniz sonuca kavuşursunuz. Idea
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#6
(05-06-2020, Saat: 13:01)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..  Smile

* Sizin için çözüm üreten kod aşağıdadır. 

 Idea Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim. 

 Arrow Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.

uses System.Net.HttpClientComponent, System.Generics.Collections, JSON;

function GetBinanceHighValue( const xValues: array of string ): string;
const
  aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
  aClient : TNetHTTPClient;
  sJSON, sSearch   : String;
  aJSONData   : TJSONValue;
  aJSONValue  : TJSONValue;
  i : Integer;
begin
  Result := '';
  aClient := TNetHTTPClient.Create(nil);
  try
    aClient.UserAgent   := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
    aClient.Accept      := 'text/html';
    sJSON               := aClient.Get( aUrl ).ContentAsString;

  // Parse Section
  // ------------------------------------------------------------------------ //
    sSearch := '<textarea id="__APP_DATA" style="display: none">';
    if pos(sSearch, sJSON ) > 0 then
    begin
      System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
      sSearch := '"productMap":';
      if pos(sSearch, sJSON ) > 0 then begin
        System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
        sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
      end;
    end;

  // -------------------------------------------------------------------------- //
  // JSON Parse section
  // -------------------------------------------------------------------------- //
    aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
    try
      if aJSONData <> nil then
      begin
        for i := Low(xValues) to High(xValues) do begin
          if aJSONData.FindValue(xValues[i]) <> nil then
          begin
            aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
            if aJSONValue.FindValue('high') <> nil then
            begin
              if Result = ''
                then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
                else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
            end;
          end;
        end;
      end else begin
        sJSON := '';
        MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
      end;
    finally
      aJSONData.Free;
    end;
  finally
    FreeAndNil(aClient);
  end;
end;

Kullanımı : 
procedure TForm1.Button1Click(Sender: TObject);
var
  Sonuclar : String;
begin
  Sonuclar := GetBinanceHighValue( [ 'ETHUSDT', 'BNBUSDT' ] );
  Showmessage( Sonuclar );
end;

lqdmj8yp8ixa7eef4dbm.gif
@mrmarman hocam,
yazdığınız örneği hemen denedim. Ancak bende
if aJSONValue.FindValue('high') <> nil then
satırındaki findvalue işlemini kabul etmedi. 10.2 den mi kaynaklanıyor bilemedim.
Cevapla
#7
Bendeki 10.4 ve problem yaşamadım.. @wiseman

(05-06-2020, Saat: 13:01)mrmarman Adlı Kullanıcıdan Alıntı: Merhaba.
Biraz önce diğer forumda gördüm başlığı aynısını burada da paylaşayım. Diğer foruma pek uğramam ama arama sırasında bir şey denk geldi, sizin başlığı görmüştüm..  Smile

* Sizin için çözüm üreten kod aşağıdadır. 

 Idea Bonus olarak daha da gelişkin -bir defada birden fazla değer- sorgulamak isteyebileceğinizi değerlendirdim. 

 Arrow Parametre olarak set halinde dilediğiniz kadar içeriğin high değerini bir defada string olarak döndürecektir.

uses System.Net.HttpClientComponent, System.Generics.Collections, JSON;

function GetBinanceHighValue( const xValues: array of string ): string;
const
  aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
  aClient : TNetHTTPClient;
  sJSON, sSearch   : String;
  aJSONData   : TJSONValue;
  aJSONValue  : TJSONValue;
  i : Integer;
begin
  Result := '';
  aClient := TNetHTTPClient.Create(nil);
  try
    aClient.UserAgent   := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
    aClient.Accept      := 'text/html';
    sJSON               := aClient.Get( aUrl ).ContentAsString;

  // Parse Section
  // ------------------------------------------------------------------------ //
    sSearch := '<textarea id="__APP_DATA" style="display: none">';
    if pos(sSearch, sJSON ) > 0 then
    begin
      System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
      sSearch := '"productMap":';
      if pos(sSearch, sJSON ) > 0 then begin
        System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
        sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
      end;
    end;

  // -------------------------------------------------------------------------- //
  // JSON Parse section
  // -------------------------------------------------------------------------- //
    aJSONData := JSON.TJSONObject.ParseJSONValue( TEncoding.ASCII.GetBytes( Trim(sJSON) ), 0);
    try
      if aJSONData <> nil then
      begin
        for i := Low(xValues) to High(xValues) do begin
          if aJSONData.FindValue(xValues[i]) <> nil then
          begin
            aJSONValue := aJSONData.GetValue<TJSONObject>(xValues[i]);
            if aJSONValue.FindValue('high') <> nil then
            begin
              if Result = ''
                then Result := xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value
                else Result := Result + ', ' + xValues[i] + ': ' + ((aJSONValue as TJSONObject).Get('high').JsonValue as TJSONString).Value;
            end;
          end;
        end;
      end else begin
        sJSON := '';
        MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
      end;
    finally
      aJSONData.Free;
    end;
  finally
    FreeAndNil(aClient);
  end;
end;

Kullanımı : 
procedure TForm1.Button1Click(Sender: TObject);
var
  Sonuclar : String;
begin
  Sonuclar := GetBinanceHighValue( [ 'ETHUSDT', 'BNBUSDT' ] );
  Showmessage( Sonuclar );
end;


lqdmj8yp8ixa7eef4dbm.gif

@mrmarman hocam,
yazdığınız örneği hemen denedim. Ancak bende
if aJSONValue.FindValue('high') <> nil then
satırındaki findvalue işlemini kabul etmedi. 10.2 den mi kaynaklanıyor bilemedim.
Cevapla
#8
@akissoftware
Konu ve yorumlarınızda Forum Kurallarına riayet etmediğinizi görüyoruz.
Bu konu başlığında yaptığınız tüm alıntı ve kod biçimlendirmeler düzeltilmiştir.
Bir sonraki konu veya yorumlarınızda bu uyarıları dikkate almadığınızda forum kurallarında belirtilen yaptırımlar uygulanacaktır!
Delphi Can'dır!
WWW
Cevapla
#9
JSON olmadan passive parse ile yapalım derseniz şöyle yapabilirsiniz. 

Not: Özellikle Indy kullanmıyorum, o zaman OpenSSL DLL'leri de gerekecek. SSL için DLL kullanmak kaydıyla Indy de kullanabilirsiniz.


uses System.Net.HttpClientComponent;

function PassiveGetBinanceHighValue( const xValues: array of string ): string;
const
  aUrl = 'https://www.binance.com/tr/trade/BNB_USDT';
var
  aClient : TNetHTTPClient;
  sJSON, sSearch, sBlock   : String;
  i : Integer;
begin
  Result := '';
  aClient := TNetHTTPClient.Create(nil);
  try
    aClient.UserAgent   := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'; // 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; SM-N950F Build/R16NW)';
    aClient.Accept      := 'text/html';
    sJSON               := aClient.Get( aUrl ).ContentAsString;

  // Parse Section
  // ------------------------------------------------------------------------ //
    sSearch := '<textarea id="__APP_DATA" style="display: none">';
    if pos(sSearch, sJSON ) > 0 then
    begin
      System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
      sSearch := '"productMap":';
      if pos(sSearch, sJSON ) > 0 then begin
        System.Delete(sJSON, 1, Pos(sSearch, sJSON) + Length(sSearch)-1);
        sJSON := Copy(sJSON, 1, Pos(',"updateTime":', sJSON)-1);
      end;
    end;

  // -------------------------------------------------------------------------- //
  // JSON Parse section
  // -------------------------------------------------------------------------- //
    if sJSON <> '' then begin
      for i := Low(xValues) to High(xValues) do begin
        sBlock := sJSON;
        if Pos(xValues[i], sBlock) > 0 then begin
          sSearch := xValues[i];
          System.Delete(sBlock, 1, Pos(sSearch, sBlock) + Length(sSearch)-1);
          sSearch := '"high":"';
          if Pos(sSearch, sBlock) > 0 then begin
            System.Delete(sBlock, 1, Pos(sSearch, sBlock) + Length(sSearch)-1);
            if Result = ''
              then Result := xValues[i] + ': ' + Copy( sBlock, 1, Pos('"', sBlock)-1 )
              else Result := Result + ', ' + xValues[i] + ': ' + Copy( sBlock, 1, Pos('"', sBlock)-1 );
          end;
        end;
      end;
    end else begin
      MessageDlg('Veri ekranına ulaşılamadı....', mtError, [mbOk], 0 );
    end;
  finally
    FreeAndNil(aClient);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Sonuclar : String;
begin
  Sonuclar := PassiveGetBinanceHighValue( [ 'ETHUSDT', 'BNBUSDT' ] );
  Showmessage( Sonuclar );
end;
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#10
@mrmarman Hocam
Süper oldu. Elinize sağlık. Kime niyet kime kısmet Smile
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Problem - ZKTeco Cihazlardan Anlık Veri Alma mad85 7 1.069 24-07-2020, Saat: 16:00
Son Yorum: mad85
  Inform AP modeli Ups'den veri alma, bağlantı sağlama 41linea41 0 245 15-07-2020, Saat: 09:52
Son Yorum: 41linea41
  Web'den Veri Alma MEDCEZİR 2 536 08-07-2020, Saat: 13:41
Son Yorum: mrmarman
  Firebird - İçinde veri olan bir alanın tipini değiştirme habikus 3 637 07-06-2020, Saat: 23:32
Son Yorum: habikus
  ComboBox da Veri Listelemek OZCANK 15 2.412 25-04-2020, Saat: 09:01
Son Yorum: OZCANK



Konuyu Okuyanlar: 1 Ziyaretçi