requests ve BeautifulSoup ile Haber Başlığı Toplayıcı

Bu projede bir haber sitesinden başlıkları çekerek listeleyecek bir Python programı yazacağız. İki kütüphane kullanacağız: requests web sayfasını indirmek için, BeautifulSoup ise HTML'den veri çıkarmak için.

İlk olarak gerekli kütüphaneleri yükle:

1pip install requests beautifulsoup4

Şimdi adım adım ilerleyelim.

Adım 1: Sayfayı İndir

requests kütüphanesi ile bir web sayfasına istek göndeririz. Örneğin BBC News'in ana sayfasını alalım:

1import requests
2from bs4 import BeautifulSoup
3
4url = 'https://www.bbc.com/news'
5response = requests.get(url)
6print(response.status_code) # 200 ise başarılı

Adım 2: HTML'i Ayrıştır

İndirilen HTML içeriğini BeautifulSoup ile işleyelim:

1soup = BeautifulSoup(response.content, 'html.parser')

Adım 3: Başlıkları Bul ve Çıkar

Haber başlıkları genellikle belirli etiketlerde saklanır. Tarayıcının geliştirici araçlarıyla (F12) hangi etiketin kullanıldığını kontrol et. BBC News örneğinde h2 ve h3 etiketleri kullanılır:

1basliklar = []
2
3# h2 ve h3 etiketlerini ara
4for baslik in soup.find_all(['h2', 'h3']):
5metin = baslik.get_text(strip=True)
6if metin and len(metin) > 5: # Boş veya çok kısa başlıkları filtrele
7basliklar.append(metin)
8
9# İlk 10 başlığı yazdır
10for i, baslik in enumerate(basliklar[:10], 1):
11print(f"{i}. {baslik}")

Tam Proje Kodu

Tüm işlemi bir dosyada birleştirelim:

1import requests
2from bs4 import BeautifulSoup
3import time
4from datetime import datetime
5
6def haberler_cek(url):
7try:
8response = requests.get(url, timeout=5)
9response.raise_for_status()
10
11soup = BeautifulSoup(response.content, 'html.parser')
12basliklar = []
13
14for baslik in soup.find_all(['h2', 'h3', 'h1']):
15metin = baslik.get_text(strip=True)
16if metin and len(metin) > 10:
17basliklar.append(metin)
18
19return basliklar[:15]
20
21except requests.exceptions.RequestException as e:
22print(f"Hata: {e}")
23return []
24
25# Çalıştır
26url = 'https://www.bbc.com/news'
27basliklar = haberler_cek(url)
28
29print(f"\n{datetime.now().strftime('%d.%m.%Y %H:%M')} - BBC News Başlıkları\n")
30for i, baslik in enumerate(basliklar, 1):
31print(f"{i}. {baslik}")
32
33# Dosyaya kaydet
34with open('haberler.txt', 'w', encoding='utf-8') as f:
35f.write(f"Tarih: {datetime.now()}\n\n")
36for baslik in basliklar:
37f.write(f"- {baslik}\n")
38
39print("\nHaberler haberler.txt dosyasına kaydedildi.")

Çıktı Örneği:

125.01.2025 14:32 - BBC News Başlıkları
2
31. Ukraine war: Russia launches major assault
42. Gaza ceasefire talks continue
53. Tech stocks surge on AI optimism...
6
7Haberler haberler.txt dosyasına kaydedildi.

İpuçları:

Farklı siteler farklı HTML yapılarına sahiptir. Hangi etiketlerin başlık içerdiğini anlamak için tarayıcıda sağ tıkla "Öğeyi İncele" yap. User-Agent ekleyerek bazı sitelerden daha kolay veri çekebilirsin: headers = {'User-Agent': 'Mozilla/5.0'} sonra requests.get(url, headers=headers) kullan.

konu hakkında tepkinizi verebilirsiniz