Mario

WFN Üye
Konular
622
Mesajlar
622
Çözüm
0
Ticaret Puanı
0
Üyelik
24 Gün
Konum
Zonguldak
Web Sitesi
Var
Alanı
Google Optimiz.
1/1
Konu sahibi
İlk paragrafta ana yanıtı, izlenecek yolu ve ulaşılabilecek sonucu doğrudan ver. Python’da çoğu web sitesinden veri çekmek için sayfayı requests ile indirip HTML içeriğini BeautifulSoup ile ayrıştırabilir, CSS seçicileriyle gerekli alanları bulup dosyaya kaydedebilirsin. Sayfa içeriği JavaScript ile sonradan oluşturuluyorsa requests yalnızca başlangıç HTML’sini getirir; bu durumda sitenin kullandığı veri uç noktasını incelemek veya tarayıcı otomasyonu kullanmak gerekir.

Basit HTML sayfasından veri çekme​


Önce gerekli paketleri kur:

Bash:
python -m pip install requests beautifulsoup4

Aşağıdaki varsayımsal örnekte, bir sayfadaki başlıkları ve bağlantıları alıp veriler.csv dosyasına kaydediyoruz. https://example.com gerçek bir veri kaynağı değil, örnek alan adıdır; kendi sitenin adresiyle değiştirmelisin.

Python:
import csv
import requests
from bs4 import BeautifulSoup

url = "https://example.com"

headers = {
    "User-Agent": "Mozilla/5.0 (compatible; VeriCekmeOrnegi/1.0)"
}

response = requests.get(url, headers=headers, timeout=20)
response.raise_for_status()

soup = BeautifulSoup(response.text, "html.parser")

kayitlar = []

for baslik in soup.select("h2"):
    link = baslik.find("a")
    if link is None:
        continue

    metin = baslik.get_text(" ", strip=True)
    href = link.get("href", "")

    kayitlar.append({
        "baslik": metin,
        "link": href
    })

with open("veriler.csv", "w", newline="", encoding="utf-8-sig") as dosya:
    alanlar = ["baslik", "link"]
    yazici = csv.DictWriter(dosya, fieldnames=alanlar)
    yazici.writeheader()
    yazici.writerows(kayitlar)

print(f"{len(kayitlar)} kayıt veriler.csv dosyasına yazıldı.")

Dosyayı örneğin veri_cek.py adıyla kaydedip aynı klasörde şu komutla çalıştır:

Bash:
python veri_cek.py

Sayfa erişilebiliyorsa kod, HTML içindeki h2 etiketlerini bulur; her başlığın altındaki a etiketinden metni ve bağlantıyı alır. Sonuçta oluşan veriler.csv dosyasını Excel veya benzeri bir programla açabilirsin. Dosya boşsa bu, bağlantının başarısız olduğu anlamına gelmez; sayfada h2 etiketi bulunmuyor, seçici yanlış veya içerik JavaScript ile sonradan yükleniyor olabilir.

HTML seçicisini doğru bulma​


Kodda soup.select("h2") ifadesi, HTML içindeki tüm h2 öğelerini seçer. Gerçek sitede veriler bir sınıf içinde bulunuyorsa seçiciyi buna göre değiştirmen gerekir. Örneğin HTML şu yapıdaysa:

HTML:
<article class="urun">
    <h2 class="baslik">Örnek ürün</h2>
    <span class="fiyat">249 TL</span>
</article>

başlığı ve fiyatı şu şekilde alabilirsin:

Python:
for urun in soup.select("article.urun"):
    baslik = urun.select_one("h2.baslik")
    fiyat = urun.select_one(".fiyat")

    if baslik is None or fiyat is None:
        continue

    print(
        baslik.get_text(" ", strip=True),
        fiyat.get_text(" ", strip=True)
    )

Seçiciyi bulmak için tarayıcıda sayfanın ilgili öğesini inceleyip HTML yapısına bakabilirsin. Ancak yalnızca sınıf adına güvenmek yerine mümkünse veriyi kapsayan daha belirgin bir öğe seç. Site tasarımı değiştiğinde sınıf adları veya HTML yapısı değişebilir; bu nedenle düzenli çalışan bir betikte sonuç sayısını ve beklenen alanların boş olup olmadığını da kontrol et.

Hangi yöntem ne zaman kullanılmalı?​


Her site için aynı araç uygun değildir. Sayfanın veriyi nasıl sunduğunu kontrol ederek yöntemi seç:
DurumUygun yaklaşımDikkat edilmesi gereken
Veri doğrudan HTML içinderequests ve BeautifulSoupDoğru CSS seçicisi kullanılmalı
Veri JSON olarak sunuluyorrequests ile JSON isteğiİstek adresi ve gerekli parametreler incelenmeli
İçerik JavaScript ile oluşuyorVeri uç noktası veya tarayıcı otomasyonuBaşlangıç HTML’sinde veri bulunmayabilir
Sayfada giriş, tıklama veya kaydırma gerekiyorSelenium veya Playwright gibi tarayıcı araçlarıDaha yavaş ve daha fazla kaynak tüketebilir
Önce requests ile indirilen HTML’yi kontrol etmek genellikle daha doğru başlangıçtır. HTML’de aradığın metin yoksa tarayıcıda görünen içerik sunucu tarafından ilk yanıtta gönderilmiyor olabilir. Bu durumda geliştirici araçlarının ağ bölümünde sayfa yüklenirken yapılan istekleri inceleyerek JSON döndüren bir uç nokta olup olmadığını kontrol edebilirsin. Böyle bir uç nokta varsa doğrudan onu kullanmak, tüm tarayıcıyı çalıştırmaktan daha basit olabilir.

İstek ve sonuç kontrolü​


Bir betiğin yalnızca veri döndürmesi, verinin doğru olduğu anlamına gelmez. HTTP durumunu, kayıt sayısını ve zorunlu alanları kontrol et:

Python:
response = requests.get(url, headers=headers, timeout=20)

if response.status_code != 200:
    raise RuntimeError(
        f"Sayfa alınamadı. HTTP durumu: {response.status_code}"
    )

soup = BeautifulSoup(response.text, "html.parser")
items = soup.select("article.urun")

if not items:
    raise RuntimeError(
        "Kayıt bulunamadı. CSS seçicisini veya sayfanın JavaScript ile yüklenip yüklenmediğini kontrol et."
    )

200 yanıtı yalnızca sunucunun isteği kabul edip bir içerik döndürdüğünü gösterir; aradığın verinin bulunduğunu kanıtlamaz. 403 veya 429 gibi yanıtlar erişim kısıtlaması ya da çok sık istek gönderilmesi anlamına gelebilir. Bu durumda istek sıklığını azaltmalı, sitenin kullanım kurallarını ve varsa resmî API seçeneğini kontrol etmelisin; erişim kısıtlamasını aşmaya çalışmak doğru yaklaşım değildir.

JavaScript ile yüklenen veriler​


Tarayıcıda gördüğün kayıtlar response.text içinde yoksa BeautifulSoup bunları kendiliğinden oluşturamaz. Önce indirilen HTML’yi kaydedip gerçekten hangi içeriğin geldiğini doğrulayabilirsin:

Python:
with open("indirilen_sayfa.html", "w", encoding="utf-8") as dosya:
    dosya.write(response.text)

Bu dosyada aradığın veri yoksa iki seçenek vardır: Sayfanın tarayıcı tarafından çağırdığı JSON isteğini bulup requests ile doğrudan istemek veya sayfayı gerçek bir tarayıcıyla açan Selenium ya da Playwright gibi bir araç kullanmak. Tarayıcı otomasyonu, tıklama ve oturum gerektiren işlemleri yapabilir; ancak daha yavaş olduğu için yalnızca gerekli olduğunda tercih edilmelidir.

Güvenli ve sürdürülebilir kullanım​


Çektiğin verinin kullanım hakkını, sitenin koşullarını ve otomatik erişim kurallarını kontrol et. Kişisel verileri gereksiz yere toplama, giriş bilgilerini kodun içine yazma ve çok kısa aralıklarla binlerce istek gönderme. Birden fazla sayfa çekiyorsan istekler arasına makul bekleme süreleri koy, zaman aşımı kullan ve geçici hata durumlarında sınırlı yeniden deneme uygula. Sayfa yapısı değişebileceği için betiğin beklediği alanlar bulunmadığında boş veya hatalı kayıtları sessizce kaydetmek yerine açık bir hata üretmesi, sorunu erken fark etmeni sağlar.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic