Konuyu Paylaş : facebook gplus twitter

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 Giriş yap veya Üye Olnin 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 Giriş yap veya Üye Olinterface'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 Giriş yap veya Üye Ol 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 Giriş yap veya Üye Olverir. İç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 Giriş yap veya Üye OlTeş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 Giriş yap veya Üye Ol
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

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Web Sitesine Login Olma ve HTML Parse SimaWB 11 1.318 28-05-2018, Saat: 22:08
Son Yorum: quiet1day
  XML Parse ve RSS SimaWB 5 654 14-12-2017, Saat: 14:10
Son Yorum: uparlayan
  TWebBrowser Lafınızı Dinlesin, HTML 5'ten anlasın uparlayan 13 1.257 14-11-2017, Saat: 21:10
Son Yorum: uparlayan
  Tüm Platformlar için (cross-platform) HTML Dosyası Oluşturma Fesih ARSLAN 0 1.176 21-10-2016, Saat: 11:53
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi