web browser içinde arama yapma sorunu
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
web browser içinde arama yapma sorunu
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..
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..
Re: web browser içinde arama yapma sorunu
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
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
Re: web browser içinde arama yapma sorunu
Tesekkurler hocam hemen inceliyorum
Saygilarimla
Saygilarimla
Re: web browser içinde arama yapma sorunu
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.
- Ö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;
Re: web browser içinde arama yapma sorunu
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.
saygılarımla
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
Re: web browser içinde arama yapma sorunu
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
Re: web browser içinde arama yapma sorunu
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ı :

- 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;

- Dosya ekleri
-
- SahibindenCOM.rar
- Proje örneği kaynak kodları
- (11.44 KiB) 146 kere indirildi
Re: web browser içinde arama yapma sorunu
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.
Re: web browser içinde arama yapma sorunu
- 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.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.
- Başarılar.
Re: web browser içinde arama yapma sorunu
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
)))
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..

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 );
Tabi yukarıda belirttiğim gibi imkanınız varsa ..
Çok teşekkürler..
Re: web browser içinde arama yapma sorunu
Rica ederim,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)))
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ı.Kod: Tümünü seç
boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );
Tabi yukarıda belirttiğim gibi imkanınız varsa ..
Çok teşekkürler..
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 );
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>
- Ö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.

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;
Re: web browser içinde arama yapma sorunu
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
Bu şekilde değer atamayı bilmiyordum. Genelde şöyle kullandığım için beni şaşırttı.
Yeni bir şey daha öğrenmiş oldum
Kod: Tümünü seç
boolDongudenCik := (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 );

Kod: Tümünü seç
IF (iSayfaGeriSayim <= 0) OR ( Pos(SonrakiSayfa, strBlok) <= 0 ) then boolDongudenCik:=true;