Web scraping
Kısaca: Bir betikle web sitelerinden verileri otomatik olarak çıkarmak — ya ham HTML’den ya da varsa resmî bir API üzerinden.
Biraz daha ayrıntılı: Kendi API’si olmayan basit sayfalar için HTTP istekleri + bir HTML ayrıştırıcı yeterlidir (Python: requests + BeautifulSoup; Node.js: fetch/axios + cheerio). Sayfa oluşturmak için JavaScript’e ihtiyaç duyuyorsa (birçok modern yönetim arayüzü) bu artık yetmez — o zaman Playwright veya Puppeteer gibi gerçek bir (başsız) tarayıcıya ihtiyacın olur. Girişle korunan sayfalar: oturum çerezini/belirtecini giriş formu üzerinden bir kez al, sonra yeniden kullan. Resmî bir API varsa neredeyse her zaman daha iyi seçimdir (daha kararlı, kullanım şartları riski yok) — scraping genellikle yalnızca yedektir.
Bizim bağlamımız: Kısa bir yan konu olarak gündeme geldi — Emzett projesinden bağımsız olarak, ev ağındaki kendi cihazlarını/hizmetlerini (yönlendirici, NAS, akıllı ev) veya platformlardaki kendi hesaplarını otomatik olarak nasıl sorgulayabileceğine dair genel bir soru.
Ayrıntılı
Bir scraping projesinin ne kadar iş olacağına genellikle iki teknik engel karar verir. Birincisi: statik ve dinamik HTML. Sunucu tüm içeriğiyle birlikte eksiksiz HTML’i doğrudan teslim ediyorsa (Kaynağı Görüntüle, tarayıcıda da gördüğün metni gösterir), basit bir HTTP isteği yeterlidir. Sayfa içeriğini yalnızca tarayıcıda JavaScript ile birleştiriyorsa (Kaynağı Görüntüle yalnızca boş bir iskelet gösterir), scraper bitmiş içeriğe ulaşmak için gerçekten bir tarayıcı çalıştırmak zorundadır — belirgin biçimde daha yavaş ve daha kaynak yoğun.
İkincisi: scraping karşıtı önlemler. Birçok site otomatik erişimi eksik/alışılmadık tarayıcı başlıkları, fazla düzenli istek aralıkları veya eksik fare davranışı gibi örüntülerden tanır ve engeller (çoğu zaman CAPTCHA’larla ya da sessizce yanlış veri sunarak). Hukuken scraping gri bir alandadır: herkese açık verileri okumak genellikle serbesttir, ancak kullanım şartları bunu açıkça yasaklayabilir ve agresif scraping (kısa sürede çok istek) sunucu kapasitesine saldırı sayılabilir — varsa resmî bir API’yi tercih etmek için bir neden daha.
import requests
from bs4 import BeautifulSoup
response = requests.get(url, headers={"User-Agent": "..."})
soup = BeautifulSoup(response.text, "html.parser")robots.txt ve görgü kuralları
Çoğu web sitesi /robots.txt altında, otomatik programların (tarayıcıların/scraper’ların) hangi alanları ziyaret edebileceğini ve edemeyeceğini belirten makine tarafından okunabilir kurallar yayımlar — doğrudan hukuken bağlayıcı değildir ama saygın scraper’ların uyması gereken, site işletmecisinden net bir sinyaldir. Adil scraping ayrıca şunları içerir: istekleri yapay olarak geciktirmek (aynı anda onlarca paralel istek göndermemek), normal bir tarayıcı gibi davranmak yerine dürüst bir User-Agent başlığı ayarlamak ve veriler tekrar tekrar gerektiğinde aynı sayfayı sürekli çekmek yerine önbelleğe almak.
Gerçek bir tarayıcı ne zaman değer
Playwright/Puppeteer, gerçek (genellikle görünmez, “başsız”) bir tarayıcıyı uzaktan kontrol eder — bu onları düz bir HTTP isteğinden belirgin biçimde daha yavaş ve daha kaynak aç yapar, ancak karşılığında JavaScript ağırlıklı sayfaları, gerçek formlarla girişleri ve düz bir HTML ayrıştırıcının hiç yeniden üretemeyeceği kaydırma veya tıklama gibi etkileşimleri ele alabilirler:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto(url)
page.wait_for_selector(".content") # JS içeriği oluşturana kadar bekle
html = page.content()