web browser içinde arama yapma sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

web browser içinde arama yapma sorunu

Mesaj gönderen forumsad »

arkadaşlar bir sürü örnek buldum denedim ama sonuç almadım

yapmaya çalıştığım web browser içinde sahibinden sitesini açıyorum...

web browseer içinde # ila başlayan ilan numaralarını çekmem lazım ...

biraz yol gösterirmisiniz.


saygılarımla..
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: web browser içinde arama yapma sorunu

Mesaj gönderen Lord_Ares »

Pos fonksiyonu ile bu istediğini yapabilirsin. Forumda html parse adına çalışan bir çok örneği mevcut
Kolay gelsin.
örneğin mrman hocamın paylaşmış olduğu bir kod örneği
viewtopic.php?f=2&t=31699
viewtopic.php?f=2&t=28148&p=156346&hili ... te#p156346
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: web browser içinde arama yapma sorunu

Mesaj gönderen forumsad »

Tesekkurler hocam hemen inceliyorum
Saygilarimla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: web browser içinde arama yapma sorunu

Mesaj gönderen mrmarman »

Kılavuz olsun diye bir örnek vereyim...

- Örnek bir proje oluşturup, Forma bir Memo, bir Edit ve bir WebBrowser koyduğunu varsayalım. Bunlar Memo1, Edit1 ve WebBrowser1 olsun. Butona bastığında aşağıdaki şekilde bir yapı EDIT içindeki aramayı yapar ve sonuçları Memo içine atar.

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Const
  Sonuc = '<TD class=searchResultsSmallThumbnail>';
Var
  i : Integer;
  strAra, strBlok : String;
  strBaslik, strURL, strImageURL, strIlanID, strFiyat : String;
begin
  WebBrowser1.Navigate( 'http://www.sahibinden.com/arama?query_text=' + StringReplace( Edit1.Text, ' ', '+', [rfReplaceAll]) );
  while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
  begin
    Application.ProcessMessages;
    Sleep(1);
  end;
  strBlok := WebBrowser1.OleObject.Document.Body.InnerHTML;
  while Pos( Sonuc, strBlok ) > 0 do
  begin
    System.Delete(strBlok, 1, Pos(Sonuc, strBlok) + Length(Sonuc)-1 );
    strAra    := 'href="';
    System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
    strURL    := Copy(strBlok, 1, Pos('"', strBlok)-1);

    strAra    := 'alt="';
    System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
    strBaslik := Copy(strBlok, 1, Pos('"', strBlok)-1);

    i := Length(strAra);
    while (i > 0) AND (strBaslik[i] <> '#') do Dec(i);
    if i > 0
      then begin
             strIlanID := Copy(strBaslik, i, Length(strBaslik)-i+1);
             strBaslik := Copy(strBaslik, 1, i-1);
           end
      else strIlanID := '-';

    strAra      := 'src="';
    System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
    strImageURL := Copy(strBlok, 1, Pos('"', strBlok)-1);

    strAra      := '<TD class=searchResultsPriceValue>';
    System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
    strAra      := '<DIV>';
    System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
    strFiyat    := Copy(strBlok, 1, Pos('</DIV>', strBlok) -1 );
    if Pos('<SUP>', strFiyat) > 0 then
    begin
      strFiyat := StringReplace( strFiyat, '<SUP>',  '', [rfReplaceAll] );
      strFiyat := StringReplace( strFiyat, '</SUP>', '', [rfReplaceAll] );
    end;
    
    Memo1.Lines.Add( '-------------------------------------------------------' );
    Memo1.Lines.Add( strBaslik );
    Memo1.Lines.Add( 'Fiyat = ' + strFiyat );
    Memo1.Lines.Add( 'http://www.sahibinden.com'+strURL );
    Memo1.Lines.Add( strIlanID );
    Memo1.Lines.Add( strImageURL );
    Memo1.Lines.Add( '-------------------------------------------------------' );
  end;
  ShowMessage('Arama Bitti.');
end;
Resim
Resim ....Resim
forumsad
Üye
Mesajlar: 296
Kayıt: 29 Tem 2010 10:47

Re: web browser içinde arama yapma sorunu

Mesaj gönderen forumsad »

mrmarman hocam örneginiz çok güzel olmuş web browserdan direkt biliğleri analiz ederek ilanla ilğili bir çok bilğiyi almışsınız...
verdiğiniz örnegi deneyeceğim..

ben biraz tembellik edip web siteyi browserda açtıktan sonra içeriğini memo ya atıp memo içerisinde ilan numaralarını buldum.

Kod: Tümünü seç



function WB_GetHTMLCode(WebBrowser: TWebBrowser; ACode: TStrings): Boolean;
var
ps: IPersistStreamInit;
ss: TStringStream;
sa: IStream;
s: string;
begin
ps := WebBrowser.Document as IPersistStreamInit;
s := '';
ss := TStringStream.Create(s);
try
sa := TStreamAdapter.Create(ss, soReference) as IStream;
Result := Succeeded(ps.Save(sa, True));
if Result then ACode.Add(ss.Datastring);
finally
ss.Free;
end;
end;



function RakamlariDondur(Metin:String):String;		
var		
  Rakamlar:String;		
  i:integer;		
begin		
  Rakamlar:='';		
  for i:=1 to length(Metin) do		
  begin		
    if Metin[i] in ['0'..'9'] then		
      Rakamlar:=Rakamlar+Metin[i];		
  end;		
  Result:=Rakamlar;		
end;		



procedure TfrmMain.btnAlClick(Sender: TObject);
var
  st: string;
  i,ii: integer;
  str:string;

begin
WB_GetHTMLCode(Webbrowser1, Memo1.Lines);

  st := '#';
  for i := 0 to Memo1.Lines.Count - 1 do
  begin
    if pos(st, Memo1.Lines[i]) > 0 then
    begin
    str:=copy(Memo1.Lines[i],pos(st, Memo1.Lines[i]),12);
    str:=RakamlariDondur(str);
    if Length(str)<7 then Continue;

    ListBox1.Items.Add(str);
    end;

   end;

    //ilan numaralarını bulduk dizimize atalım
    SetLength(ilanNu,ListBox1.Items.Count);  //listboxdaki eleman sayısı kadar dizi eleman sayısını  tanımla
    for ii := 0 to ListBox1.Items.Count-1 do
    begin
    ilanNu[ii]:=Listbox1.Items[ii];

    end;
topIlan:= ListBox1.Items.Count;
end;

saygılarımla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: web browser içinde arama yapma sorunu

Mesaj gönderen Lord_Ares »

mrman hocam, kodunuz yine nefis ellerinize sağlık. Buna birde sayfa sayfa gezip parseleme olayına ( 1.ci sayfa ,2. sayfa ) fikir verirseniz çok sevinirim. Teşekkürler
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: web browser içinde arama yapma sorunu

Mesaj gönderen mrmarman »

Aşağıdaki örneği bu istediğine göre revize ettim.

- Forma bir tane TListView koyup, bunun style'nin vsReport yaparak bu ListView'e (0 .. 6) olmak üzere toplam (7) tane ITEM ekle.

- Aramanda başlangıç sayfa ve toplam sayı verebiliyorsun. (5,1) dersen sadece (5) nolu sayfa gelir. (5,3) dersen (5)'den başlar o dahil takip eden iki sayfa ile toplam (3) sayfa getirir.

- Toplam sayfa için 9999 gibi büyük rakam verebilirsin, sorgu sırasında SONRAKİ SAYFA butonu gelmezse arama otomatik olarak sona erer.

Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  SahibindenAra( Edit1.Text, SpinEdit1.Value, SpinEdit2.Value, WebBrowser1, ListView1 );
  ShowMessage('Arama Bitti.');
end;

Kod: Tümünü seç

Procedure SahibindenAra( strAranacakKelime: String; iBaslangicSayfa, iToplamOkunacakSayfa:Integer; WebBrowser:TWebBrowser; ListView:TListView );
Const
  Sonuc        = '<TD class=searchResultsSmallThumbnail>';
  Sayfalar     = '<UL class=pageNaviButtons>';
  AktifSayfa   = '<SPAN class=currentPage>';
  SonrakiSayfa = '<A class=prevNextBut href="';
Var
  i, iBasSayfaGeriSayim, iSayfaGeriSayim : Integer;
  strAra, strBlok : String;
  strBaslik, strURL, strImageURL, strIlanID, strFiyat : String;
  boolDongudenCik : Boolean;
begin
  WebBrowser.Navigate( 'http://www.sahibinden.com/arama?query_text=' + StringReplace( strAranacakKelime, ' ', '+', [rfReplaceAll]) );
  while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
  begin
    Application.ProcessMessages;
    Sleep(1);
  end;
  boolDongudenCik := False;

  if iBaslangicSayfa >= 1
    then iBasSayfaGeriSayim := iBaslangicSayfa
    else iBasSayfaGeriSayim := 1;

  if iToplamOkunacakSayfa > 1
    then iSayfaGeriSayim := iToplamOkunacakSayfa
    else iSayfaGeriSayim := 1;

  while NOT boolDongudenCik do
  begin
    // boolDongudenCik Sonsuza kadar FALSE kalmamalı.
    // Sayfalar sonunda veya MaxSayfa ulaşıldığında TRUE olacak
    strBlok := WebBrowser.OleObject.Document.Body.InnerHTML;
    if Pos( AktifSayfa, strBlok ) <= 0
      then boolDongudenCik := TRUE; // Aktif sayfa yoksa sorun var demektir. Döngüden derhal çıkılsın...

    if iBasSayfaGeriSayim > 0 then Dec(iBasSayfaGeriSayim);

    if (NOT boolDongudenCik) AND (iBasSayfaGeriSayim = 0) then
    begin // ByPass sigortamız...
      while Pos( Sonuc, strBlok ) > 0 do
      begin
        System.Delete(strBlok, 1, Pos(Sonuc, strBlok) + Length(Sonuc)-1 );
        strAra    := 'href="';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strURL    := Copy(strBlok, 1, Pos('"', strBlok)-1);

        strAra    := 'alt="';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strBaslik := Copy(strBlok, 1, Pos('"', strBlok)-1);

        i := Length(strBaslik);
        while (i > 0) AND (strBaslik[i] <> '#') do Dec(i);

        if i > 0
          then begin
                 strIlanID := Copy(strBaslik, i, Length(strBaslik)-i+1);
                 strBaslik := Copy(strBaslik, 1, i-1);
               end
          else strIlanID := '-';

        strAra      := 'src="';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strImageURL := Copy(strBlok, 1, Pos('"', strBlok)-1);

        strAra      := '<TD class=searchResultsPriceValue>';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strAra      := '<DIV>';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strFiyat    := Copy(strBlok, 1, Pos('</DIV>', strBlok) -1 );
        if Pos('<SUP>', strFiyat) > 0 then
        begin
          strFiyat := StringReplace( strFiyat, '<SUP>',  '', [rfReplaceAll] );
          strFiyat := StringReplace( strFiyat, '</SUP>', '', [rfReplaceAll] );
        end;
        With ListView.Items.Add do
        begin
          Caption := '';
          SubItems.Add( strBaslik   );
          SubItems.Add( strFiyat    );
          SubItems.Add( strIlanID   );
          SubItems.Add( strImageURL );
          SubItems.Add( strURL      );
        end;
      end;
      DEC(iSayfaGeriSayim);
      boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );
    end; // if

    if not boolDongudenCik then
    begin
      strAra := AktifSayfa;
      System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );

      if Pos(SonrakiSayfa, strBlok) > 0 then
      begin
        strAra := SonrakiSayfa;
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );

        strURL := Copy( strBlok, 1, Pos('"', strBlok)-1 );
        strUrl := StringReplace( strUrl, '&', '&', [rfReplaceAll]);
        WebBrowser.Navigate( 'http://www.sahibinden.com' + strURL );
        while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
        begin
          Application.ProcessMessages;
          Sleep(1);
        end;
      end else boolDongudenCik := TRUE;
    end;
  end; // While
  for i := 0 to ListView.Columns.Count - 1 do ListView.Columns[i].Width := -1;
end;
Resim
Dosya ekleri
SahibindenCOM.rar
Proje örneği kaynak kodları
(11.44 KiB) 146 kere indirildi
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: web browser içinde arama yapma sorunu

Mesaj gönderen Lord_Ares »

hocam kodu inceledim de gerçekten ellerine sağlık , html parse işlemlerinde sürekli kullanılabilecek bir yapı. Beni kırmayıp paylaştığın için çok teşekkürler.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: web browser içinde arama yapma sorunu

Mesaj gönderen mrmarman »

Lord_Ares yazdı:hocam kodu inceledim de gerçekten ellerine sağlık , html parse işlemlerinde sürekli kullanılabilecek bir yapı. Beni kırmayıp paylaştığın için çok teşekkürler.
- Hakikaten genel geçer örnek olsun diye böyle yaptık. Aslında (5) nolu sayfadan başlasın dediğimizde (5) defa navigate etmek yerine bu sayfaya özel şekilde (5) nolu sayfanın linki direkt seçilip kullanılabilirdi veya sayfada 20 sonuç olduğu biliniyorsa 20 x 5 = 100 nolu item başlangıç pozisyonu belirlenip de kullanılabilirdi -ki android için olsaydı minimum sorgu maksimum verim için bunu tercih ederdim- , tümüyle bant genişliği, yoğurt yiyiş vs. ile ilgili.

- Başarılar.
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: web browser içinde arama yapma sorunu

Mesaj gönderen Lord_Ares »

Mrmarman hocam, sayfa sayfa gezme örneğinizi inceleyerek farklı sayfalarda kullanmak istedim. Sanırım biraz anlamakta ve kendime uyarlamakta zorlandım :)))
Yaptığınız işlem sanırım sayfa sayısını html den parse ederek okuyup adres kısmının sonuna ekleyerek navigate etmek. Arada bir kod dikkatimi çekti boolean bir değişkene yaptığınız atamayı ilk defa bu şekilde kullanıldığını gördüm. Bunun nasıl olduğunu anlayamadım. Normalde true yada false alması gerektiğini düşünürken birden acaba ne değeri aldı diyerek şaşırdım :))))

Kod: Tümünü seç

 boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );
Eğer sizin için sorun olmaz ve vaktiniz varsa sizden ricam, bu uygulamadaki sayfa sayfa gezme işlemini yalın olarak paylaşabilir misiniz.Aslında örneğiniz açık ama kusura bakmayın copy paste yapmak istemiyorum, mantığını kavrayıp daha iyi anlamak ve kendimde temel oluşturmak için istiyorum. O koddan o koda aklarken kafam iyice karıştı.
Tabi yukarıda belirttiğim gibi imkanınız varsa ..
Çok teşekkürler..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: web browser içinde arama yapma sorunu

Mesaj gönderen mrmarman »

Lord_Ares yazdı:Mrmarman hocam, sayfa sayfa gezme örneğinizi inceleyerek farklı sayfalarda kullanmak istedim. Sanırım biraz anlamakta ve kendime uyarlamakta zorlandım :)))
Yaptığınız işlem sanırım sayfa sayısını html den parse ederek okuyup adres kısmının sonuna ekleyerek navigate etmek. Arada bir kod dikkatimi çekti boolean bir değişkene yaptığınız atamayı ilk defa bu şekilde kullanıldığını gördüm. Bunun nasıl olduğunu anlayamadım. Normalde true yada false alması gerektiğini düşünürken birden acaba ne değeri aldı diyerek şaşırdım :))))

Kod: Tümünü seç

 boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );
Eğer sizin için sorun olmaz ve vaktiniz varsa sizden ricam, bu uygulamadaki sayfa sayfa gezme işlemini yalın olarak paylaşabilir misiniz.Aslında örneğiniz açık ama kusura bakmayın copy paste yapmak istemiyorum, mantığını kavrayıp daha iyi anlamak ve kendimde temel oluşturmak için istiyorum. O koddan o koda aklarken kafam iyice karıştı.
Tabi yukarıda belirttiğim gibi imkanınız varsa ..
Çok teşekkürler..
Rica ederim,

Kod: Tümünü seç

      // Buradaki TRUE / FALSE durumu
      // - Sayfa Geri Sayımı (0) olmuşsa veya NEXT butonu yok ise
      // - Acil! Çıkış! yapmak üzere TRUE olsun...
      // - Kullanıcı 7 sayfalık sonuç için 100 sayfa sonuç getir demiş olabilir.
      //   olmayan sayfayı getirmeye çalışmayıp olan kadar ile YETİNİLİR.
      boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );
// Döngü içerisinde aşağıdaki bloğa odaklanıyor olucaz...

Kod: Tümünü seç

// (a) Sayfalardan örneğimizde 1/7 sayfada aşağıdaki şekilde NEXT butonu varken...
// (bkz.prevNextBut ifadesi)
    //<UL class=pageNaviButtons>
      //<LI><SPAN class=currentPage>1</SPAN> <INPUT id=currentPageValue type=hidden value=1> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=20">2</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=40">3</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=60">4</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=80">5</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=100">6</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=120">7</A> </LI>
      //<LI><A class=prevNextBut href="/arama?query_text=S3+Batarya&pagingOffset=20">Sonraki <SPAN class="pager-arrow last"></SPAN></A></LI>
    //</UL>

Kod: Tümünü seç

// (b) Sayfalardan örneğimizde 7/7 sayfada aşağıdaki şekilde NEXT butonu yok olacaktır...
    //<UL class=pageNaviButtons>
      //<LI><A class=prevNextBut href="/arama?pagingOffset=100&query_text=S3+Batarya"><SPAN class="pager-arrow first"></SPAN>Önceki</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya">1</A> </LI>
      //<LI><A href="/arama?pagingOffset=20&query_text=S3+Batarya">2</A> </LI>
      //<LI><A href="/arama?pagingOffset=40&query_text=S3+Batarya">3</A> </LI>
      //<LI><A href="/arama?pagingOffset=60&query_text=S3+Batarya">4</A> </LI>
      //<LI><A href="/arama?pagingOffset=80&query_text=S3+Batarya">5</A> </LI>
      //<LI><A href="/arama?pagingOffset=100&query_text=S3+Batarya">6</A> </LI>
      //<LI><SPAN class=currentPage>7</SPAN> <INPUT id=currentPageValue type=hidden value=7></LI>
    //</UL>
- Normal şartlarda ilk sayfa ve devam eden sayfalar listeye alınacağından boş döngü faktörü olmayacaktır.

- Örneğin 3 nolu sayfadan itibaren 2 sayfalık arama sonucu talep ediliyor olsun.

- Diyebilirsiniz ki boş döngü olacağına direkt ilgili talep edilen sayfanın linki üzerinden gidilseydi. O zaman daha derin bir sorgu stratejisi geliştirecektik.

- ilk (10) sayfa 1,2,3,4,5,6,7,8,9,10 şeklinde gelecek iken takip eden diğer sayfalar 10,20,30,40,50 şeklinde olacaktır.

- Gerçekçi tavır olarak bize cevap olarak dönen ilk sayfalar gerekeceğinden arama işleminde NEXT butonu linki üzerinden boş döngü ile takip sistemi en rasyonel çözüm olarak benimsedim.


(*) Bu açıklamaları Procedure içerisine yerinde yazdım. Yardımcı olmazsa bildir, daha da detaylandırayım. :idea:

Kod: Tümünü seç

Procedure SahibindenAra( strAranacakKelime: String; iBaslangicSayfa, iToplamOkunacakSayfa:Integer; WebBrowser:TWebBrowser; ListView:TListView );
Const
  Sonuc        = '<TD class=searchResultsSmallThumbnail>';
  Sayfalar     = '<UL class=pageNaviButtons>';
  AktifSayfa   = '<SPAN class=currentPage>';
  SonrakiSayfa = '<A class=prevNextBut href="';
Var
  i, iBasSayfaGeriSayim, iSayfaGeriSayim : Integer;
  strAra, strBlok : String;
  strBaslik, strURL, strImageURL, strIlanID, strFiyat : String;
  boolDongudenCik : Boolean;
begin
  // Standart bir arama Query gönderiyoruz.
  // Bu sadece kılavuz sorgu olacak. İçerik bu kılavuz sorgu üzerinden yönlenecek.
  WebBrowser.Navigate( 'http://www.sahibinden.com/arama?query_text=' + StringReplace( strAranacakKelime, ' ', '+', [rfReplaceAll]) );
  while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
  begin
    Application.ProcessMessages;
    Sleep(1);
  end;
// Şimdi işleme başlıyoruz...
// Döngü içerisinde aşağıdaki bloğa odaklanıyor olucaz...
// (a) Sayfalardan örneğimizde 1/7 sayfada aşağıdaki şekilde NEXT butonu varken...
// (bkz.prevNextBut ifadesi)
    //<UL class=pageNaviButtons>
      //<LI><SPAN class=currentPage>1</SPAN> <INPUT id=currentPageValue type=hidden value=1> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=20">2</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=40">3</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=60">4</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=80">5</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=100">6</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya&pagingOffset=120">7</A> </LI>
      //<LI><A class=prevNextBut href="/arama?query_text=S3+Batarya&pagingOffset=20">Sonraki <SPAN class="pager-arrow last"></SPAN></A></LI>
    //</UL>

// (b) Sayfalardan örneğimizde 7/7 sayfada aşağıdaki şekilde NEXT butonu yok olacaktır...
    //<UL class=pageNaviButtons>
      //<LI><A class=prevNextBut href="/arama?pagingOffset=100&query_text=S3+Batarya"><SPAN class="pager-arrow first"></SPAN>Önceki</A> </LI>
      //<LI><A href="/arama?query_text=S3+Batarya">1</A> </LI>
      //<LI><A href="/arama?pagingOffset=20&query_text=S3+Batarya">2</A> </LI>
      //<LI><A href="/arama?pagingOffset=40&query_text=S3+Batarya">3</A> </LI>
      //<LI><A href="/arama?pagingOffset=60&query_text=S3+Batarya">4</A> </LI>
      //<LI><A href="/arama?pagingOffset=80&query_text=S3+Batarya">5</A> </LI>
      //<LI><A href="/arama?pagingOffset=100&query_text=S3+Batarya">6</A> </LI>
      //<LI><SPAN class=currentPage>7</SPAN> <INPUT id=currentPageValue type=hidden value=7></LI>
    //</UL>


// boolDongudenCik değişkeni WHILE döngüsünü sonlandıracak bir değişkendir.
// Döngü içerisinde birkaç farklı durum oluşabilir.
  //   1. <SPAN class=currentPage> ifadesi hangi sayfada olduğumuzu bize bildirir.
  //      Eğer bu ifade yoksa herhangi bir sayfada DEĞİLİZ analmına gelir.
  //      (!Sayfada mutlak bir sorun vardır sonucuna varabiliriz...!!!)
  //      Döngüden çıkmak üzere Acilen! TRUE olacaktır.
  //   2. (1) nolu normal durumu yakaladıktan sonraki NEXT butonu olduğu sürece
  //      son sayfaya HENÜZ! ulaşılmadı demektir.
  //      Aksi halde son sayfaya ulaşıldığında yine TRUE olacaktır.
  boolDongudenCik := False;

  // Parametre olarek geçilen değerleri döngü limitini belirleyecektir.
  // iBaslangicSayfa örneğin (3) olsun,
  //  * iBasSayfaGeriSayim (3)'den geri sayıp (0) olana kadar
  //    ListView içeriğine doldurma işlemi BAŞLAMAYACAKTIR.
  //    Döngü boş dönecektir.
  if iBaslangicSayfa >= 1
    then iBasSayfaGeriSayim := iBaslangicSayfa
    else iBasSayfaGeriSayim := 1;

  // iToplamOkunacakSayfa örneğin (2) olsun,
  //  * iSayfaGeriSayim (2)'den geri sayıp (0) olana kadar
  //    ListView içeriği DOLDURULUR... Sonra döngüden çıkılır...
  if iToplamOkunacakSayfa > 1
    then iSayfaGeriSayim := iToplamOkunacakSayfa
    else iSayfaGeriSayim := 1;

  while NOT boolDongudenCik do
  begin
    // boolDongudenCik Sonsuza kadar FALSE kalmamalı.
    // Sayfalar sonunda veya MaxSayfa ulaşıldığında TRUE olacak
    strBlok := WebBrowser.OleObject.Document.Body.InnerHTML;
    if Pos( AktifSayfa, strBlok ) <= 0
      then boolDongudenCik := TRUE; // Aktif sayfa yoksa sorun var demektir. Döngüden derhal çıkılsın...

    if iBasSayfaGeriSayim > 0 then Dec(iBasSayfaGeriSayim);

// Takip eden (IF bloğu) içindeki (WHILE bloğu)
// bizim ListView içeriğini doldurduğumuz kısımdır.

    // Sayfada sorun yoksa yani Acil çıkış! durumu yoksa (VE)
    // ilk okunacak sayfaya erişilmediği sürece bu IF bloğuna GİRMESİN.
    // Özetle boş döngü şeklinde dönülsün...
    if (NOT boolDongudenCik) AND (iBasSayfaGeriSayim = 0) then
    begin // ByPass sigortamız...
      // IF içerisine girmişse ilk sayfa numaramıza ulaştık demektir.

      // Şimdi (WHILE) içerisinde bize lazım olan sayfa adedi kadar
      // içeriği ListView'e alıcaz...
      while Pos( Sonuc, strBlok ) > 0 do
      begin
        // PARSE işlemi yapılıyor...

        // strURL
        System.Delete(strBlok, 1, Pos(Sonuc, strBlok) + Length(Sonuc)-1 );
        strAra    := 'href="';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strURL    := Copy(strBlok, 1, Pos('"', strBlok)-1);

        // strBASLIK & strIlanID ikilisi...
        strAra    := 'alt="';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strBaslik := Copy(strBlok, 1, Pos('"', strBlok)-1);

        // strBASLIK içerisinde sondan geriye doğru
        //   strIlanID ile strBASLIK ; # ile ayrılıyor...
        i := Length(strBaslik);
        while (i > 0) AND (strBaslik[i] <> '#') do Dec(i);

        if i > 0
          then begin
                 strIlanID := Copy(strBaslik, i, Length(strBaslik)-i+1);
                 strBaslik := Copy(strBaslik, 1, i-1);
               end
          else strIlanID := '-';

        // strImageURL
        strAra      := 'src="';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strImageURL := Copy(strBlok, 1, Pos('"', strBlok)-1);

        // strFiyat
        strAra      := '<TD class=searchResultsPriceValue>';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strAra      := '<DIV>';
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );
        strFiyat    := Copy(strBlok, 1, Pos('</DIV>', strBlok) -1 );
        // strFiyat'ın var ise Kuruş Hanesi...
        if Pos('<SUP>', strFiyat) > 0 then
        begin
          strFiyat := StringReplace( strFiyat, '<SUP>',  '', [rfReplaceAll] );
          strFiyat := StringReplace( strFiyat, '</SUP>', '', [rfReplaceAll] );
        end;

        // PARSE edilen içerik ListView'e dolduruluyor...
        With ListView.Items.Add do
        begin
          Caption := '';
          SubItems.Add( strBaslik   );
          SubItems.Add( strFiyat    );
          SubItems.Add( strIlanID   );
          SubItems.Add( strImageURL );
          SubItems.Add( strURL      );
        end;
      end;
      DEC(iSayfaGeriSayim);
      // Buradaki TRUE / FALSE durumu
      // - Sayfa Geri Sayımı (0) olmuşsa veya NEXT butonu yok ise
      // - Acil! Çıkış! yapmak üzere TRUE olsun...
      // - Kullanıcı 7 sayfalık sonuç için 100 sayfa sonuç getir demiş olabilir.
      //   olmayan sayfayı getirmeye çalışmayıp olan kadar ile YETİNİLİR.
      boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );
    end; // if

    // Eğer acil çıkış YAPILMAMIŞ ise,
    // NORMAL bir akış içerisinde sonraki sayfa Navigate edilir.
    if not boolDongudenCik then
    begin
      strAra := AktifSayfa;
      System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );

      if Pos(SonrakiSayfa, strBlok) > 0 then
      begin
        strAra := SonrakiSayfa; // Sonraki Sayfa yani NEXT button linki...
        System.Delete(strBlok, 1, Pos(strAra, strBlok) + Length(strAra)-1 );

        strURL := Copy( strBlok, 1, Pos('"', strBlok)-1 );
        strUrl := StringReplace( strUrl, '&', '&', [rfReplaceAll]);
        WebBrowser.Navigate( 'http://www.sahibinden.com' + strURL );
        while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
        begin
          Application.ProcessMessages;
          Sleep(1);
        end;
      end else boolDongudenCik := TRUE;
    end;
  end; // While
  for i := 0 to ListView.Columns.Count - 1 do ListView.Columns[i].Width := -1;
end;
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: web browser içinde arama yapma sorunu

Mesaj gönderen Lord_Ares »

Mrmarman hocam, ellerine sağlık yapıyı ve mantığı çok güzel anlatmışsınız. Çok teşekkürler.
Yeni bir şey daha öğrenmiş oldum

Kod: Tümünü seç

boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );
Bu şekilde değer atamayı bilmiyordum. Genelde şöyle kullandığım için beni şaşırttı. :)

Kod: Tümünü seç

IF (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 ) then boolDongudenCik:=true;
Cevapla