IdHTTP İle web sayfadan veri çekme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

IdHTTP İle web sayfadan veri çekme

Mesaj gönderen brs »

İyi akşamlar;

IdHTTP1 ile http://www.xxx.asp bulunan web sayfamdan ( id="adi"> - id="telefon"> - id="adres">) alanlarındaki bilgileri editlere ayrı ayrı nasıl alabilirim?



Kod: Tümünü seç

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=windows-1254" http-equiv="Content-Type" />
<meta content="tr" http-equiv="Content-Language" />
<title>Bigi</title>
</head>

<body>

<table style="width: 100%">
	<tr>
		<td id="adi">baris</td>
	</tr>
	<tr>
		<td id="telefon">0000000</td>
	</tr>
	<tr>
		<td id="adres">istanbul</td>
	</tr>
</table>

</body>

</html>
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen barisatalay »

Aklıma ilk şu geldi sonuç olarak bir websitesi XML yapıda değil midir Get ile aldığınız verileri bir xmldocument componenti içerisine alarak nodeler arası gezinebilirsiniz gibi.
alyamus
Üye
Mesajlar: 44
Kayıt: 09 Ara 2011 09:09

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen alyamus »

Öncelikle aşağıdaki kod ile kaynak sitenin kodlarını memo'ya aktar

Kod: Tümünü seç


procedure TForm1.Button1Click(Sender: TObject);
const
 NONE              = $00; //Zero-value number
 INET_USERAGENT    = 'Mozilla/4.0, Indy Library (Windows; utf-8)';
 INET_REDIRECT_MAX = 10;
var
  StreamData :TMemoryStream;
  Url,html        : string;
begin
  idhttp1.request.userAgent:=INET_USERAGENT;
  idhttp1.redirectMaximum:=INET_REDIRECT_MAX;
  idhttp1.handleRedirects:=INET_REDIRECT_MAX<>NONE;
  Url        :=edit1.text;
  StreamData := TMemoryStream.Create;
  try
    try
     html:= idhttp1.Get(edit1.text); 
     idhttp1.Get(edit1.text, StreamData); 
     StreamData.Seek(0,soFromBeginning);
     memo1.Lines.Text:=html;
     button2.Click;
    Except On E : Exception Do
     MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
    End;
  finally
    StreamData.free;
  end;
end;
Daha sonra momu içerisinde istediğin divleri Aradansec fonksiyonuyla istediğin edite aktar.

Aradansec Fonksiyonu

Kod: Tümünü seç

Function aradansec( text, ilk, son:String ): String;
begin
   Delete(Text, 1, pos(ilk, Text) + Length(ilk)-1);
   Result := Copy(Text, 1, Pos(Son, Text)-1);
end;

Kullanımıda

Kod: Tümünü seç

var
sec:string;
sec := aradansec(memo1.lines.text,'<id class"isim">','</div>');

edit1.text:=sec;
komple dongü yapmak istersen bu kodu for döngüsüne alırsın memo countta hepsini yazdırırsın.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen brs »

Teşekkür ederim fakat memo ya almadan direk alma şansım var mı?
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen Lord_Ares »

Memo kullanmak istemiyorsan Tstringlist veya ansistring tipte bir değişken tanımla ve bilgiyi buna çekerek işlemi gerçekleştir. Yukarıdaki kodda memo1.Lines.Text:=html; yerine tanımladığın değişkeni kullan. örnek olarak tanımladığın değişken adı Kaynakkod ise kaynakkod:=html; demen yeterli. Aslında o değişkenleri tanımlamadan da yapabilirsin stream olarak zaten bilgiyi çekmiş ama stream okuma zor olur diyorsan dediğim şekilde yap veya uçüncü bir seçenek direk html değişkeninde ara zaten bilgiyi oraya geliyor ilk. Burada dikkat etmen gereken string tipteki bir değişkenin karakter sınırlaması vardır. Dolayısı ile Sayfadan çektiğin satır sayısı stringin alabileceğinden fazla olursa kodu eksik çekmiş olursun tavsiyem stringlist türlerinden birini kullanman. ( not bu son söylediğim html değişkeni içinde geçerli oda string tanımlanmış )
En son Lord_Ares tarafından 17 Oca 2015 10:30 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
alyamus
Üye
Mesajlar: 44
Kayıt: 09 Ara 2011 09:09

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen alyamus »

Lord ares arkadaşımız en kısa yolu sölemiş sana zaten ben bilerek memoya kadar uzattımki ilerd ebaşka işlerdede kullanmak istersen diye elinde kaynak kod bulunsun ama çok hızlı yapmak istiyorum diyorsan aynen ilk streamde tum işlemi bitirebilirsin.
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen warder »

alyamus yazdı:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
....
var
  StreamData :TMemoryStream;
  Url,html        : string;
begin
.....
  Url        :=edit1.text;
  StreamData := TMemoryStream.Create;
  try
    try
     html:= idhttp1.Get(edit1.text); 
     idhttp1.Get(edit1.text, StreamData); 
     StreamData.Seek(0,soFromBeginning);
     memo1.Lines.Text:=html;
     button2.Click;
    Except On E : Exception Do
     MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0);
    End;
  finally
    StreamData.free;
  end;
end;
Bu kodu sanıyorum direk programınızda kullandığınız yerden kopyalayıp yapıştırdınız.
button2.Click; öyle düşündürüyor.
Yanlış da anlamayınız lütfen. Ben delphi programıcısı değilim. Delphi kurulu bile değil.
Kodu inceleyince bazı soru işaretleri belirdi. Sormazsam kendimle çelişirim.
Uzatmadan..
Kodunuzdaki Url değişkeni neden tanımlandı, değer verildi ve hiç kullanılmadı?
StreamData değişkeni tanımlandı, içeriğini doldurmak için ikinci bir idHttp talebi ile programa zaman kaybettirildi, Seek ile kursör başa çekildi, sonra free edildi..
Neden?.. ne işe yaradı?
Lord_Ares yazdı:Burada dikkat etmen gereken string tipteki bir değişkenin karakter sınırlaması vardır. Dolayısı ile Sayfadan çektiğin satır sayısı stringin alabileceğinden fazla olursa kodu eksik çekmiş olursun tavsiyem stringlist türlerinden birini kullanman. ( not bu son söylediğim html değişkeni içinde geçerli oda string tanımlanmış )
String tip 2GB a kadar veri taşıyabilir.
Sanıyorum onu aşan web sayfası değildir.
Bir konu da AradanSec fonksiyonuna String gönderip, işleyip, String dönüyor. Dolayısı ile Stringi aşan bir durumda fonksiyon da çökecektir.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Kullanıcı avatarı
dogan
Üye
Mesajlar: 173
Kayıt: 17 Eki 2014 10:11

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen dogan »

Merhaba.

Bence xml ile çekmen daha kolay olur diye düşünüyorum alta verdiğim kod kurları bir zamanlar çekiyordum, şimdi kullanamıyorum sen kendine göre düzenle veya formdan bir uzman arkadaş düzenlemede yardımcı olur. :P

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
  DolarAlis, DolarSatis, EuroAlis, EuroSatis, banka: String;
begin
  try
    banka := IdHTTP1.Get('http://www.tcmb.gov.tr/kurlar/today.xml');
  except
    ShowMessage('Üzgünüm Merkez Bankasına Bağalanamadım.');
    exit;
  end;
  DolarAlis := trim(Copy(banka, 312, 5));
  DolarSatis := trim(Copy(banka, 306, 5));

  EuroAlis := trim(Copy(banka, 1083, 6));
  EuroSatis := trim(Copy(banka, 1096, 6));

  Label1.Caption := 'Dolar Alış  : ' + DolarAlis;
  Label2.Caption := 'Dolar Satış : ' + DolarSatis;

  Label3.Caption := 'Euro Alış   : ' + EuroAlis;
  Label4.Caption := 'Euro Satış  : ' + EuroSatis;
end;
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen brs »

dogan yazdı:Merhaba.

Bence xml ile çekmen daha kolay olur diye düşünüyorum alta verdiğim kod kurları bir zamanlar çekiyordum, şimdi kullanamıyorum sen kendine göre düzenle veya formdan bir uzman arkadaş düzenlemede yardımcı olur. :P

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
  DolarAlis, DolarSatis, EuroAlis, EuroSatis, banka: String;
begin
  try
    banka := IdHTTP1.Get('http://www.tcmb.gov.tr/kurlar/today.xml');
  except
    ShowMessage('Üzgünüm Merkez Bankasına Bağalanamadım.');
    exit;
  end;
  DolarAlis := trim(Copy(banka, 312, 5));
  DolarSatis := trim(Copy(banka, 306, 5));

  EuroAlis := trim(Copy(banka, 1083, 6));
  EuroSatis := trim(Copy(banka, 1096, 6));

  Label1.Caption := 'Dolar Alış  : ' + DolarAlis;
  Label2.Caption := 'Dolar Satış : ' + DolarSatis;

  Label3.Caption := 'Euro Alış   : ' + EuroAlis;
  Label4.Caption := 'Euro Satış  : ' + EuroSatis;
end;

Aslında asp veya xml hiç fark etmez artık, fakat xml den veri çekme olayını çok araştırdım bulamadım gibi bir düzenleme yapamadım maalesef...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: IdHTTP İle web sayfadan veri çekme

Mesaj gönderen brs »

Sonunda Bitti.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
with XMLDocument1 do
begin
LoadFromFile('http://newyorg.myminicity.com/xml');
Active := true;
Edit1.Text := DocumentElement.ChildNodes['population'].Text;
Edit2.Text := VarToStr(DocumentElement.ChildNodes['bases'].Attributes['ind']);
Edit3.Text := VarToStr(DocumentElement.ChildNodes['bases'].Attributes['tra']);
Edit4.Text := VarToStr(DocumentElement.ChildNodes['bases'].Attributes['sec']);
Edit5.Text := VarToStr(DocumentElement.ChildNodes['bases'].Attributes['env']);
XMLDocument1.Active := false;
end;
end;
Kaynak: http://parsing-and-i.blogspot.com.tr/20 ... elphi.html
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Cevapla