Ön Hazırlık ve Ortam Kurulumu
Java projenizde Jsoup kullanmaya başlamak için öncelikle bağımlılıkları yönetmeniz gerekir. 2026 yılı itibarıyla Maven veya Gradle gibi modern paket yöneticileri standarttır. Eğer bir Maven projesi üzerinde çalışıyorsanız, pom.xml dosyanıza aşağıdaki bağımlılığı ekleyerek kütüphaneyi projenize dahil edebilirsiniz.
org.jsoup
jsoup
1.18.1
Bu bağımlılığı ekledikten sonra projenizi güncelleyin. Jsoup, herhangi bir ek dış kütüphaneye ihtiyaç duymadan doğrudan Java standart kütüphaneleriyle uyumlu çalışır. Kurulumun başarılı olduğunu doğrulamak için projenizde basit bir bağlantı testi yapabilirsiniz.
Jsoup ile İlk Veri Çekme İşlemi
Bir web sitesinden veri çekmenin ilk adımı, ilgili URL'ye bir HTTP GET isteği göndermek ve dönen HTML içeriğini bir Document nesnesine dönüştürmektir. Jsoup, Jsoup.connect() metodu ile bu süreci oldukça basitleştirir.
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class ScrapingBasics {
public static void main(String[] args) throws Exception {
String url = "https://example.com";
Document doc = Jsoup.connect(url).get();
System.out.println("Sayfa Başlığı: " + doc.title());
}
}
Yukarıdaki kod, belirtilen URL'ye bağlanır ve sayfanın başlık etiketini (title) konsola yazdırır. get() metodu, bağlantı başarılı olduğu sürece tüm HTML yapısını belleğe alır.
CSS Seçicileri Kullanarak Veri Ayıklama
Web scraping işlemlerinde en sık kullanılan yöntem CSS seçicileridir. Jsoup, jQuery benzeri bir sözdizimi kullanarak HTML elemanlarına erişmenizi sağlar. Belirli bir sınıf (class), kimlik (id) veya etiket ismine göre verileri filtreleyebilirsiniz.
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;
// Sayfadaki tüm başlıkları (h1) çekmek
Elements basliklar = doc.select("h1");
for (Element baslik : basliklar) {
System.out.println("Bulunan Başlık: " + baslik.text());
}
// Belirli bir class ismine sahip elemanları çekmek
Elements urunler = doc.select(".product-name");
for (Element urun : urunler) {
System.out.println("Ürün Adı: " + urun.text());
}
select() metodu her zaman bir Elements koleksiyonu döner. Eğer tek bir eleman arıyorsanız selectFirst() metodunu kullanmak performans ve kod okunabilirliği açısından daha verimlidir.
Bağlantı ve Güvenlik Ayarları
Web siteleri, bot trafiğini engellemek için genellikle User-Agent kontrolü yapar. Eğer bir tarayıcı gibi görünmezseniz, siteler bağlantınızı reddedebilir. Ayrıca, büyük verilerle çalışırken zaman aşımı (timeout) sürelerini ayarlamak önemlidir.
Document doc = Jsoup.connect("https://example.com")
.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
.timeout(5000) // 5 saniye zaman aşımı
.referrer("http://www.google.com")
.get();
Kritik Güvenlik Uyarısı: Web scraping yaparken hedef sitenin
robots.txtdosyasını mutlaka kontrol edin. İzinsiz veri çekmek, sitenin kullanım koşullarını ihlal edebilir ve yasal sorumluluk doğurabilir. Ayrıca, kişisel verileri (KVKK kapsamında) izinsiz toplamak suç teşkil eder.
Veri Çıkarma Yöntemlerinin Karşılaştırılması
Aşağıdaki tablo, Jsoup ile veri çekme yöntemlerinin avantajlarını ve kullanım senaryolarını özetlemektedir.
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| CSS Selectors | Hızlı ve okunabilir | Karmaşık dinamik yapılarda yetersiz |
| DOM Traversal | Hiyerarşik yapıya tam hakimiyet | Kod karmaşıklığı yüksek |
| Regex (Düzenli İfadeler) | Çok spesifik metin eşleme | HTML yapısı değişince kırılır |
Dinamik İçerik ve Sınırlamalar
Jsoup, statik HTML sayfalarını ayrıştırmak için mükemmeldir. Ancak, JavaScript ile yüklenen (React, Vue, Angular gibi) içerikleri Jsoup ile doğrudan çekemezsiniz. Çünkü Jsoup bir tarayıcı motoru çalıştırmaz, sadece ham HTML'i okur. Eğer sayfa içeriği JavaScript ile yükleniyorsa, Selenium veya Playwright gibi tarayıcı otomasyon araçları ile Jsoup'u birlikte kullanmanız gerekir.
// Jsoup ile dinamik içeriği çekemezsiniz, ancak
// Selenium'dan gelen HTML'i Jsoup'a verebilirsiniz.
String html = driver.getPageSource();
Document doc = Jsoup.parse(html);
String veri = doc.select("#dynamic-data").text();
Sıkça Sorulan Sorular
Jsoup neden JavaScript çalıştırmıyor?
Jsoup bir HTML ayrıştırıcıdır, tarayıcı değildir. JavaScript motoru (V8 gibi) içermediği için sayfadaki scriptleri çalıştırmaz ve sadece sunucudan gelen ilk yanıtı işler.
Web scraping yaparken IP engellenmesini nasıl önlerim?
İstekler arasında Thread.sleep() kullanarak bekleme süreleri ekleyebilir veya bir proxy servisi kullanarak IP adresinizi rotasyona sokabilirsiniz.
Jsoup ile form gönderip giriş yapabilir miyim?
Evet, Jsoup.connect(url).data("user", "ad").post() yöntemiyle form verisi gönderebilirsiniz, ancak oturum yönetimi (cookie) için execute() metodunu kullanarak çerezleri manuel yönetmeniz gerekebilir.
En çok hangi durumlarda Jsoup hata verir?
Genellikle ağ bağlantısı hataları, 403 Forbidden (erişim engeli) veya HTML yapısının beklenmedik şekilde değişmesi durumlarında hata alınır. Hata yönetimi (try-catch) blokları kullanmak şarttır.
Jsoup ile büyük dosyaları nasıl indiririm?
Jsoup küçük HTML dosyaları için optimize edilmiştir. Çok büyük dosyalar için Java'nın java.net.http.HttpClient sınıfını kullanmanız daha performanslı olacaktır.
Yasal Sorumluluk Reddi: Bu makaledeki bilgiler yalnızca eğitim amaçlıdır. Web scraping işlemleri sırasında hedef sitenin hizmet şartlarına uymak, sunucuyu aşırı yüklemekten kaçınmak ve telif haklarına saygı göstermek kullanıcının sorumluluğundadır. Yazılımın kötüye kullanımından doğabilecek hukuki sorunlardan yazar sorumlu tutulamaz.
Jsoup ile Veri İşleme ve Veritabanı Entegrasyonu
Web scraping projelerinde en kritik aşama, çekilen verilerin ham halinden kurtarılıp anlamlı bir yapıya dönüştürülmesidir. Jsoup ile elde ettiğiniz Elements koleksiyonlarını doğrudan bir veritabanına aktarmadan önce, veriyi temizlemek (data cleaning) ve doğrulamak (validation) projenizin sürdürülebilirliği için şarttır.
Aşağıdaki örnek, bir haber sitesinden çekilen başlık ve link verilerini bir List yapısında toplayıp, basit bir veritabanı kayıt simülasyonu gerçekleştirmektedir:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.ArrayList;
import java.util.List;
public class DataProcessor {
public static void main(String[] args) throws Exception {
Document doc = Jsoup.connect("https://haber-sitesi.com").get();
Elements articles = doc.select("h2.article-title");
List dataList = new ArrayList();
for (Element article : articles) {
String title = article.text();
String url = article.select("a").attr("abs:href");
if (!title.isEmpty() && !url.isEmpty()) {
dataList.add(new Article(title, url));
}
}
// Veritabanı katmanına gönder
saveToDatabase(dataList);
}
private static void saveToDatabase(List data) {
data.forEach(item -> System.out.println("Kaydediliyor: " + item.getTitle()));
}
}
Scraping Projelerinde Performans Optimizasyonu
Büyük ölçekli veri toplama işlemlerinde, her bir sayfa için ayrı bir bağlantı açmak ciddi performans kayıplarına ve hedef sunucunun sizi "bot" olarak algılayıp engellemesine neden olur. Performansı artırmak ve sunucu kaynaklarını verimli kullanmak için şu stratejileri uygulayabilirsiniz:
- Bağlantı Havuzu (Connection Pooling): Jsoup'un kendi bağlantı yönetimini kullanmak yerine, HTTP istemcisi olarak Apache HttpClient veya OkHttp ile entegrasyon sağlayarak bağlantıları yeniden kullanın.
- Paralel İşleme: Java'nın
ExecutorServiceveyaParallel Streamsyapısını kullanarak aynı anda birden fazla sayfayı işleyin. Ancak, hedef siteninrobots.txtdosyasını dikkate alarak istek hızınızı sınırlayın. - Önbellekleme (Caching): Daha önce çektiğiniz ve değişme ihtimali düşük olan sayfaları yerel diskinizde veya Redis gibi bir bellekte saklayarak tekrar istek atmaktan kaçının.
Paralel İstek Yönetimi Örneği
Aşağıdaki kod bloğu, CompletableFuture kullanarak birden fazla URL'yi eş zamanlı olarak nasıl işleyebileceğinizi göstermektedir:
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class ParallelScraper {
public static void main(String[] args) {
List urls = Arrays.asList("url1", "url2", "url3");
List futures = urls.stream()
.map(url -> CompletableFuture.runAsync(() -> {
try {
Document doc = Jsoup.connect(url).get();
System.out.println("Başlık: " + doc.title());
} catch (Exception e) {
System.err.println("Hata: " + url);
}
}))
.toList();
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}
}
Bu yöntemle, tek bir thread üzerinde beklemek yerine, I/O işlemlerini asenkron hale getirerek scraping süresini %70'e varan oranlarda kısaltabilirsiniz. Unutmayın, çok hızlı istekler sunucu tarafından "DDoS saldırısı" olarak algılanabilir; bu nedenle istekler arasına Thread.sleep() gibi gecikmeler eklemek her zaman güvenli bir yaklaşımdır.
Sonuç
Java ile Jsoup kullanarak web scraping yapmak, veriye dayalı projeler geliştirmek için en hızlı ve etkili yoldur. Bu rehberde, kütüphanenin kurulumundan CSS seçicilerine, güvenlik ayarlarından dinamik içerik yönetimine kadar temel taşları öğrendiniz. Bir sonraki adım olarak, çektiğiniz verileri bir veritabanına (PostgreSQL veya MongoDB) kaydetmeyi ve verileri düzenli aralıklarla çekecek bir "scheduler" (zamanlayıcı) mekanizması kurmayı deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz