Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Web Sitesine Login Olma ve HTML Parse - 2
#1
Not: Bu makale Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.nin devamı olduğu halde okunurluğu kolaylaştırmak adına buradan devam edilmiştir.

Önceki makalede login olduğumuz sayfanın HTML kodlarını elde etmiştik. Şimdi ise HTML içerisinden istediğimiz kısımları elde edeceğiz. Örneğimizde delphican.com'u kullanmıştık. Ana sayfada Son Mesajlar bölümünü almaya çalışalım.

"HTML parse" için bir çok ücretli/ücretsiz çözümler mevcut. Ben yine Delphi dışından bir bileşene/kütüphaneye ihtiyaç duymamak için Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.interface'ini kullanacağım. Bunun için projemize MSHTML unitini eklememiz yeterli. 

Öncelikle bir önceki makaledeki fonksiyonumuzla web sitesine login olup HTML kodlarını alalım:
var
 sonuc_html: string;
begin
  sonuc_html := DoLogin('kullanıcı_adı', 'şifre');
  if sonuc_html = '' then
  begin
    ShowMessage('login başarısız');
    Exit;
  end;

Artık sonuc_html içerisinde Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. sayfasının kaynak kodları var. Bunu parse edebileceğimiz formata dönüştürmeliyiz:
 
  doc: OleVariant;
begin
  doc := coHTMLDocument.Create as IHTMLDocument2;
  doc.write(sonuc_html);
  doc.close;

doc değişkenini tıpkı bir webbrowser gibi düşünebiliriz. İçerisinde body'i, tag'ları vs. olan ve bunlara erişebileceğimiz bir değişken. Örneğin bu sayfa içindeki tüm tablo satırlarına(HTML'deki TR) şu şekilde kolayca erişebiliriz:
  satirlar: OleVariant;
//...
  satirlar := doc.body.all.tags('TR');
Bu bize bir Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.verir. İçerisinde html elemenlerinin bulunduğu bir liste. Bir döngü içerisinde bu liste içinde dolaşıp istediğimiz satırlar(TR) ile ilgilenebiliriz. 

Ana sayfadaki Son Mesajlar bölümüne bakarsanız orada 5 kolon olduğunu görürsünüz. Bu kolonlara da yukarıdakine benzer yöntemle şöyle ulaşabiliriz:
  kolonlar: OleVariant;
//...
  kolonlar:= satirlar.item(i).all.tags('TD');
Ben bu kolonlardan sadece 3 tanesini; Konu, Yazar, Forum kolonlarını alıp bunları ListView içerisinde göstermeyi seçtim. 
Son Mesajlar'ın html kodlarına baktığımızda TR taglarının class'larının "trow1 smalltext" olduğunu görürüz. Bundan faydalanarak sayfanın diğer kısımlarında bulunan TR'lerden bizim işimize yarayanları ayırt edebileceğiz.
Aslında gereksiz yere çok uzattım sanırım Sad  Kodlar benden daha iyi anlatacaktır:
procedure TFrmMain.btnLoginClick(Sender: TObject);
var
  doc: OleVariant;
  satir, satirlar, kolonlar: OleVariant;
  i,j: Integer;
  sonuc_html, icerik: string;
  ilk_satir: Boolean;
  aItem: TListItem;
begin
  sonuc_html := DoLogin('kullanıcı_adı', 'şifre');
  if sonuc_html = '' then
  begin
    ShowMessage('login başarısız');
    Exit;
  end;

  doc := coHTMLDocument.Create as IHTMLDocument2;
  doc.write(sonuc_html);
  doc.close;

  ListView1.Clear;
  ilk_satir := True;

  ListView1.Items.BeginUpdate;
  try
    satirlar := doc.body.all.tags('TR');
    for i := 0 to satirlar.length - 1 do
    begin
      satir := satirlar.item(i);
      if satir.className = 'trow1 smalltext' then  // sadece ilgili satırlara bak
      begin
        if ilk_satir then // ilk satırı atlıyoruz
        begin
          ilk_satir := False;
          Continue;
        end;
        kolonlar := satir.all.tags('TD');  // satır içindeki tüm kolonlar

        aItem := ListView1.Items.Add;
        for j := 0 to kolonlar.length-1 do
        begin
          icerik := kolonlar.item(j).innerText;
          case j of
            0: aItem.Caption := icerik; // konu sütunu
            2: aItem.SubItems.Add(icerik); // yazar sütunu
            4: aItem.SubItems.Add(icerik); // forum sütunu
          end;
        end;
      end;
    end;
  finally
    ListView1.Items.EndUpdate;
  end;
end;

Bahsetmem gereken küçük bir nokta: "trow1 smalltext" sınıfına sahip TR taglarinden ilkinin Son Mesajlar bölümündeki başlıklar olması sebebiyle yukarıdaki kodda bunun kontrolü yapılmıştır.

Örnek ekran çıktısı:

ZOzJj3.png

Dipçe: Bir ekleme daha yapıp, kaynak kodları tabi ki paylaşacağım Wink
There's no place like 127.0.0.1
WWW
Cevapla
#2
Teşekkürler hocam
Ekran çıktısı yerine "ZOzJj3.png" gibi bir metin görünüyor.
Cevapla
#3
(11-11-2017, Saat: 19:57)frmman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Teşekkürler hocam
Ekran çıktısı  yerine "ZOzJj3.png" gibi bir metin görünüyor.

Bende normal görünüyor.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#4
Bende de normal Huh
There's no place like 127.0.0.1
WWW
Cevapla
#5
Örnek projede biraz daha ekleme yaptım:
Son Mesaj'ları listelerken okunmamış olanları vurgulamak istedim. Ayrıca mesajların link'lerini de parse ettim ki çift tıklandığında ilgili web sayfası açılsın.

Son durumdaki ekran görüntüsü:

screenshot.png

Projenin kaynak kodlarına GitHub üzerinden ulaşabilirsiniz.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
There's no place like 127.0.0.1
WWW
Cevapla
#6
Faydalı bir makale olmuş teşekkürler.
Cevapla
#7
Teşekkürler.
Cevapla
#8
Öncelikle makalenin 1. kısmı 404 hatası veriyor bilginize. (benim arşivde duruyor ama haberdar edeyim dedim)

Merak ettiğim bir husus var, IdHTTP metodunun, web sayfasıyla yada metodun çalıştığı bilgisayarla ilişkisi nedir? Biliyorum tam ifade edemedim, şöyle açayım:
Hali hazırda TWebBrowser ile çalışan bir uygulamam var, sanalda denediğim windows 10 da sıkıntı çıkarmaya başladı ve geçenlerde Microsoft'un Chrome tabanlı bir tarayıcı çıkaracağını okudum, yani iexplorer dolayısı ile TWebBrowser'in geleceği soru işareti (diye düşünüyorum). Şimdiden önlemimi alıp uygulama mı baştan yazmak istiyorum ama "windows 12" çıktığında IdHTTP fonksiyonlarının Microsoft'un kararı ile çalışmama yada revize edilme ihtimali var mı yoksa işletim sisteminden bağımsız yapılar mı? Tabi ki işletim sistemi ile alakası var da Microsoft'un keyfine göre hareket edebileceği bir yapı mı? Web'in alt yapısını bilmiyorum ama web teknolojileri çok hızlı değişiyor/gelişiyor...

Çok eskiden, delphi ile internetten döviz kurlarını çeken bir fonksiyonun artık "bu" metodla çekilemeyeceğini, yeni yaklaşımın "böyle" olması gerektiğini anlatan bir konu incelediğimi çok net hatırlıyorum. Bir defa yazıp 100 sene kullanılacak bir uygulama yok ama ben yine de merak ettim. Teşekkürler.
Cevapla
#9
@Fesih ARSLAN

   
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#10
(08-02-2019, Saat: 10:09)Hayati Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Öncelikle makalenin 1. kısmı 404 hatası veriyor bilginize. (benim arşivde duruyor ama haberdar edeyim dedim)
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.



(08-02-2019, Saat: 10:09)Hayati Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merak ettiğim bir husus var, IdHTTP metodunun, web sayfasıyla yada metodun çalıştığı bilgisayarla ilişkisi nedir? Biliyorum tam ifade edemedim, şöyle açayım:
Hali hazırda TWebBrowser ile çalışan bir uygulamam var, sanalda denediğim windows 10 da sıkıntı çıkarmaya başladı ve geçenlerde Microsoft'un Chrome tabanlı bir tarayıcı çıkaracağını okudum, yani iexplorer dolayısı ile TWebBrowser'in geleceği soru işareti (diye düşünüyorum).

Aslında soruda 2 farklı bileşenden söz edilmiş: TIdHttp ve TWebBrowser.
TIdHttp'den başlayalım. Indy bileşen paket içinde. Indy bileşenleri Delphi ile sürekli güncellenen ve şimdilik güncellenmeye devam edecek gibi görünen bileşenlerdir. FMX'e hemen destek vermesi de bunun göstergesidir.
TWebBrowser'da işler biraz daha farklı. Bu aslında bir MS ActiveX bileşenidir. Dolayısıyla MS ne ölçüde izin verirse(özellik olarak) onları kullanabilirsiniz. TWebBrowser varsayılan olarak IE7 modunda çalışıyor yanlış hatırlamıyorsam Sad Malum IE7 oldukça eski. TWebBrowser'ın bu çalışma modunu registry'den değiştirebiliyoruz. (Dilerseniz bunun nasıl yapıldığını araştırabilirsiniz)
TWebBrowser'a alternatif olarak şunu kullanabilirsiniz:
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
There's no place like 127.0.0.1
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Fluent HTML uparlayan 9 1.963 11-06-2019, Saat: 22:57
Son Yorum: ahmetb
  Web Sitesine Login Olma ve HTML Parse SimaWB 14 3.721 29-01-2019, Saat: 16:39
Son Yorum: Bay_Y
  XML Parse ve RSS SimaWB 5 1.415 14-12-2017, Saat: 14:10
Son Yorum: uparlayan
  TWebBrowser Lafınızı Dinlesin, HTML 5'ten anlasın uparlayan 13 2.469 14-11-2017, Saat: 21:10
Son Yorum: uparlayan
  Tüm Platformlar için (cross-platform) HTML Dosyası Oluşturma Fesih ARSLAN 0 1.681 21-10-2016, Saat: 11:53
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi