Sanal web browser – HtmlUnit
HtmlUnit java programları için kullanılan headless ( gövdesiz, sanal ) bir web browser. Ne demek gövdesiz?, ortada bir görsel arayüz yok demek, yani tüm browser fonksiyonlarını java kodları ile yapabiliyor olmak demek!..
Örneğin :
- Elma sitesine git
- Benim yerime formu doldur
- Giriş yap
- Veri çek, javascript çalıştır, link aç
- Cookie’ leri gör,ekle
kısacası HtmlUnit ile bir web browser ile yapabileceğimiz hemen hemen herşeyi yapabiliriz. Ayrıca arzu ediyorsak sayfalarımızı birim testine (unit test) ‘de tabi de tutabiliriz. İstiyorsak bir browser’ın imitasyonu (taklitçisi) olarak da kullanabiliriz. (ie, firefox) .
Yükleme ;
Bir maven projesi oluşturduğunuzu varsayarak,
<dependencies> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.9</version> </dependency> </dependencies>
yukarıdaki bağımlılıkları pom.xml dosyanıza ekleyerek, ve projenizi derleyerek, HtmlUnit in bağımlı olduğu jar kütüphanelerini projemize eklemiş oluyoruz.. Kullanım örnekleri ve Açıklamalar ;
public void sayfaCek(){ WebClient istemci= new WebClient(); HtmlPage sayfa= istemci.getPage("http://www.bir-site.com/"); }
WebClient nesnesi, HtmlUnit’ in başlangıç noktasını oluşturuyor ve sanal browser’ ımızı temsil ediyor. Eğer istiyorsak sanal browser’ ımızı firefox yada ie ‘ nin taklitçisi olarak kullanabiliriz.
Herhangi bir web sayfasını açmak için ise getPage metodundan faydalanıyoruz, burada dönen değer tabii ki bir HtmlPage nesnesi. HtmlUnit aslında iki temel fonksiyon için kullanılıyor. Scraping ( sayfadan veri kazımak ) ve Unit test ( birim testi).
HtmlPage sayfa= istemci.getPage("http://www.bir-site.com/"); String yazi= sayfa.asText(); String xml = sayfa.asXml();
Sayfa kaynağının tümüne erişmek için, asText ve asXml metodlarını kullanabiliriz, bunlardan asText metodu, html tag’ leri arasındaki yazıları listelemektedir, asXml ise tüm sayfayı Html tag’ leri ile birlikte listelemektedir.
WebClient istemci = new WebClient(); HtmlPage sayfa = istemci.getPage("http://www.bir-site.com/"); HtmlImage resim = (HtmlImage)sayfa.getHtmlElementById("logo"); System.out.println(resim.getAttribute("src"));
HtmlUnit, sayfa elemanlarına erişmek için iki türlü erişim imkanı sunuyor bunlardan ilki Html DOM, ikincisi ise XPATH , işte buradaki getHtmlElementById ve getAttribute, aslında Html DOM özelliğinden faydalanıyor. getHtmlElementById metoduyla dönen nesne bir HtmlElement nesnesi, bu nesne tüm Html elemanlarının atası konumunda. Bu sebep ile getHtmlElementById metodu ile dönen nesnenin türü ne ise, o sınıfa down-casting (aşağı uyarlama) edilmeli. getAttribute metodu herhangi bir Html elemanının özelliğini döndürmekte, ( ör : <a href=”www.kodedu.com” >kodedu.com</a> , href Html Anchor nesnesinin bir özelliğidir.)
WebClient istemci = new WebClient(); HtmlPage sayfa= istemci.getPage("http://www.bir-site.com/"); HtmlAnchor link= sayfa.getAnchorByText(">> İndir <<"); sayfa= link.click();
getAnchorByText metodu, HtmlAnchor yani bir link nesnesi döndürüyor, click() metodu ise söz konusu linke tıklamamızı sağlıyor. HtmlUnit ile, HtmlPage nesnesine ulaşmanın iki türlü yolu mevcut. İlki getPage metodu ile ,ikincisi ise tıklanabilir bir nesnesinin click metodu aracılığı ile ( HtmlButton, Html Anchor.. )
public void onayFormu() throws Exception { final WebClient istemci= new WebClient(); final HtmlPage sayfa= istemci.getPage("http://www.bir-site.com"); final HtmlForm form = sayfa.getFormByName("form-adı"); final HtmlSubmitInput buton= form.getInputByName("buton-adı"); final HtmlTextInput kullaniciAdi= form.getInputByName("kullanıcı-adı-input"); kullaniciAdi.setValueAttribute("admin"); final HtmlPasswordInput sifre= form.getInputByName("şifre-input"); sifre.setValueAttribute("adminadmin"); HtmlCheckBoxInput tik =form.getInputByName("beni-hatırla"); tik.setChecked(true); final HtmlPage sayfa2= buton.click(); System.out.println(sayfa2.asXml+"n"+sayfa2.asText); istemci.closeAllWindows(); }
getFormByName metodu ile ilgili sayfanın form nesnesini döndürmekteyiz. getInputByName fonksiyonu ile de buton, textfield, checkbox gibi bir Html formuna ait nesnelere erişebilmekteyiz. HtmlUnit ile veri çekebildiğimiz gibi elbette, form nesnelerine veri girişi de yapabiliriz. Örneğin burada setValueAttribute fonksiyonu ile yazı ve şifre alanı bilgilerini doldurmaktayız. Beni hatırla kutusunu da seçili hale getiriyoruz. Ardından buton nesnemizin click olay yordamıyla yeni bir page nesnesi elde etmiş oluyoruz.
final HtmlElement eleman = (HtmlElement)sayfa2.getByXPath("//*[contains(@class,'tablom')]").get(0); final HtmlTable tablo = (HtmlTable)eleman; for (final HtmlTableRow satir : tablo.getRows()) { System.out.println("Satır bulundu.."); for (final HtmlTableCell hucre : satir.getCells()) System.out.println("Hücre bulundu : " + hucre.asText() ); }
XPath, kullanılış amacı XML ve HTML eleman ( element ) ve özelliklerine ( attribute ) kolay bir şekilde erişmek için oluşturulmuş bir ifade dili.. Bu örneğimizde class özelliği tablom olan ( <table class=”tablom” > ……</table> ) bir Html tablo nesnesine erişiyoruz ve mevcut döngülerle hücreler arasında bulunan tüm text içerikleri ekrana bastırıyoruz. Şimdilik bu kadar..
Alternatif olarak : Php için Curl, Ruby ve Perl için Mechanize programları incelenebilir.
5 Comments
Tebrikler.. Elinize sağlık..
Tamda çok lazımken geldi =) Teşekküler.
Bilgi için teşekkür ederim
Çok faydalı oldu teşekkürler
Bilgi için teşekkür ederiz.