geri

RSS desteği olmayan bir web sitesinden içerik nasıl çekilir?

17/05/2011

Bu yazıda anlatılanlar yalnızca bilgilendirme amaçlıdır. Örnekte kullanılan tubitak.gov.tr sitesinden çekilen içerik TÜBİTAK'a aittir. Bazı siteler bilgi verilmeden içerik çekilmesini yasaklamış olabilir. Burada anlatılan bilgileri kullanarak gerçekleştirilen uygulamalardan doğacak sonuçlar için sorumluluk kabul edilmez.

RSS desteği web sitesi içeriğini XML gibi düzgün bir biçime dönüştürdüğünden, içeriği bir uygulama aracılığıyla çekerek anlamlandırmak oldukça kolaydır. Bu desteğin olmadığı durumlarda ise içeriğin çekilmesi güçleşir. Örnek olarak tubitak.gov.tr site içeriği için RSS desteği sağlasa da arama sonuçları için bu desteği vermemektedir. Bu yazımda istenilen kelimeyi tubitak.gov.tr sitesinde arayarak dönen sonuçları işleyen küçük bir uygulamanın nasıl yazılacağını anlatacağım.

İşe önce tubitak.gov.tr sitesinde bir arama yaparak başlayalım. "burs" kelimesini aradığımızda dönen sonuç aşağıdaki görüntüdeki gibi oluyor.

Dönen sayfanın html koduna bakarsak arama sonuçları class özelliği divContentItem ya da divContentItemAlt olan alt alta divler şeklinde listeleniyor. En altta bulunan divShowAllItems içerisinde ise sayfalama bağlantıları bulunuyor.

Bir tane div seçip içinde kullanılan html koduna göz atalım.

Görüldüğü gibi içiçe iki tablo mevcut. İlk tablo tek bir satırdan oluşuyor ve tdContentText sınıfından olan td içerisindeki tablonun içinde ihtiyaç duyduğumuz başlık, açıklama ve tarih bilgileri yer alıyor. Şimdi bir de sayfalama bölümüne göz atalım.

En altta bulunan ve texti "Sonraki Sayfa" olan bağlantı ile bir sonraki arama sonucu sayfasına ulaşılabiliyor. Bu bilgiler ışığında arama sonuçlarını işleyecek bir uygulama yazalım. HTML parse işlemleri için küçük fakat çok kullanışlı olan jsoup kütüphanesini kullanacağız.

 1 public class Bocuk {
 2   private static final String domain = "http://tubitak.gov.tr/";
 3   private static final String searchPath = "detailedsearch.do?query=";
 4   private static int index = 1;
 5 
 6   public static void main(String[] args) throws IOException, ParseException {
 7     String path = searchPath + "burs";
 8     do {
 9       path = parseSearchResults(path.replaceFirst("\\.\\.", ""));
10     } while (path != null);
11   }
12 
13   public static Document parseURL(final URL url, final int timeOut, int retryAttempts) {
14     Document doc = null;
15     do {
16       try {
17         doc = Jsoup.parse(url, timeOut);
18       } catch (Exception ex) {
19         doc = null;
20       }
21     } while (doc == null && (retryAttempts-- > 0));
22 
23     return doc;
24   }
25 
26   public static String parseSearchResults(String path) throws IOException, ParseException {
27     URL url = new URL(domain + path);
28     Document doc = parseURL(url, 15000, 4);
29     if (doc == null) {
30       return null;
31     }
32    
33     Elements icerikDivler = doc.getElementsByClass("divContentItem");
34     icerikDivler.addAll(doc.getElementsByClass("divContentItemAlt"));
35 
36     for (Element icerikDiv : icerikDivler) {
37       System.out.println("******************************************");
38       Elements satirlar = icerikDiv.getElementsByClass("tdContentText").first().getElementsByTag("tr");
39       Element baslik = satirlar.get(0).getElementsByTag("a").first();
40       System.out.println("baslik: " + baslik.ownText());
41       Element aciklama = satirlar.get(1).getElementsByTag("a").first();
42       System.out.println("aciklama: " + aciklama.ownText());
43       Element tarih = satirlar.get(2).getElementsByTag("td").first();
44       System.out.println("tarih: " + tarih.ownText());
45       System.out.println("******************************************\n");
46     }
47 
48     Elements navigation = doc.getElementsByClass("divShowAllItems");
49     if (navigation == null || navigation.isEmpty()) {
50       return null;
51     }
52     Element next = navigation.first().getElementsContainingOwnText("Sonraki Sayfa").first();
53     if (next == null) {
54       return null;
55     }
56 
57     String nextURL = next.attr("href");
58     System.out.println("nextURL: " + nextURL);
59     return nextURL;
60   }
61 }

Uygulamayı çalıştırdığımızda aşağıdaki çıktıyı elde ediyoruz. "burs" anahtar kelimesini değiştirerek farklı aramalar da yapılabilir.

******************************************
baslik: ESA Burs Programı
aciklama: TÜBİTAK ve ESA arasında imzalanan "Türkiye Hükümeti ve Avrupa Uzay Ajansı Arasında Dış Uzayın Barışçıl Amaçlarla İncelenmesi ve Kullanılması Konusunda İşbirliği Anlaşması" çerçevesinde burs verilecektir.
tarih: 05.07.2010
******************************************

******************************************
baslik: Burs Ödemelerine İlişkin Duyuru
aciklama: 
tarih: 09.04.2010
******************************************

******************************************
baslik: TÜBİTAK-DFG Bilimsel Değişim Burs Programı
aciklama: TÜBİTAK-DFG Bilimsel Değişim Burs Programı 2009 yılı 1. dönem destekleri belli oldu.
tarih: 23.02.2009
******************************************

******************************************
baslik: TÜBİTAK Yurt İçi Doktora Burs Programı
aciklama: TÜBİTAK Yurt İçi Doktora Burs Programı doğrudan bursiyerlik başvurularının sonuçları açıklandı.
tarih: 29.04.2011
******************************************

******************************************
baslik: TÜBİTAK Burs ve Destek Miktarları 2008 Yılında Arttırıldı...
aciklama: 
tarih: 04.01.2008
******************************************

******************************************
baslik: 2228 Burs Programı Hakkında Duyuru...
aciklama: 2228 - Son Sınıf Lisans Öğrencileri İçin Yurt İçi Lisansüstü (Yüksek Lisans/Doktora) Burs Programı 2008 yılı lisansüstü burs tahsis edilen adaylar belli oldu.
tarih: 07.05.2008
******************************************

******************************************
baslik: BİDEB BURS VE DESTEK PROGRAMLARI
aciklama: 
tarih: 08.04.2011
******************************************

******************************************
baslik: TÜBİTAK Yurt İçi Yüksek Lisans Burs Programı
aciklama: TÜBİTAK Yurt İçi Yüksek Lisans Burs Programı doğrudan bursiyerlik başvurularının sonuçları açıklandı.
tarih: 05.05.2011
******************************************

******************************************
baslik: TÜBİTAK Yüksek Lisans ve Doktora Burs Programları
aciklama: TÜBİTAK - BİDEB Yurt İçi Yüksek Lisans ve Doktora Burs Programları Kapsamında 2010 Yılı Bursiyerleri Belli Oldu
tarih: 28.12.2010
******************************************

******************************************
baslik: Son Sınıf Lisans Öğrencileri Lisansüstü Burs Programı
aciklama: TÜBİTAK-2228 Son Sınıf Lisans Öğrencileri için Lisansüstü (Yüksek Lisans/Doktora) Burs Programı başvuruları alınmaya başlandı.
tarih: 04.04.2011
******************************************

nextURL: /ara/burs/0/1/index.htm;jsessionid=F053F7EEB69D10FA5E4DDD6E409EE33B

Umarım verdiğim örnek faydalı olmuştur.

Follow me on Twitter

yorumlar Disqus aracılığıyla sunulmaktadır