Facebook Kamusal Veri Çekme Rehberi: Residential Proxy ve Tarayıcı Otomasyonu

Facebook'un agresif anti-scraping önlemlerine rağmen kamusal sayfa verilerine erişmek için residential proxy ve Playwright otomasyonunu nasıl kullanacağınızı adım adım öğrenin.

Facebook Kamusal Veri Çekme Rehberi: Residential Proxy ve Tarayıcı Otomasyonu

Facebook sayfa verilerini çekmek istiyorsanız, büyük ihtimalle daha ilk istekte duvarla karşılaşmışsınız demektir. Meta, platformunu scraping'e karşı en sıkı korunan sitelerden biri haline getirdi ve Meta v. Bright Data davası, bu konudaki yasal riskleri de net biçimde ortaya koydu. Yine de marka izleme, kamusal veri analizi ve açık kaynak istihbaratı gibi meşru amaçlar için Facebook'un gerçekten kamusal verilerine erişmek mümkün — doğru araçlar ve sınırlar çerçevesinde.

Bu rehber, Facebook kamusal veri çekme sürecinin teknik gerçeklerini, residential proxy kullanımını, Playwright otomasyonunu ve en önemlisi — neyi yapmamanız gerektiğini açıklar.

Yasal Uyarı: Bu rehber yalnızca login gerektirmeyen, kamuya açık verilerin erişimini ele alır. Her platformun Hizmet Şartları'nı (Terms of Service) ve yürürlükteki yasaları (ABD'de CFAA, AB'de GDPR) mutlaka inceleyin. Login gerektiren verilere izinsiz erişim yasa dışı olabilir. Hukuki tavsiye için avukatınıza başvurun.

Facebook Kamusal Veri Çekme: Gerçekte Ne Erişilebilir?

Facebook'un "kamusal" kavramı, beklentinizden çok daha dar olabilir. Login olmadan erişebileceğiniz veriler şunlarla sınırlıdır:

  • Public Page (Sayfa) Postları: İşletme ve marka sayfalarının herkese açık gönderileri, yorumları ve temel metrikleri.
  • Public Etkinlik Sayfaları: Açık etkinliklerin başlığı, konumu, saati, açıklaması ve ev sahibi bilgisi.
  • Marketplace Listelemeleri (bölgeye bağlı): Bazı pazarlarda, giriş yapmadan ürün listelemeleri görülebilir — ancak bu giderek kısıtlanıyor.
  • Public Grup Listelemeleri: Grup adı, üye sayısı ve açıklama; ancak postalar değil.

Erişemeyeceğiniz ve erişmemeniz gerekenler:

  • Kişisel profil bilgileri (login sonrası bile scraping yapılması etik ve yasal açıdan sorunlu)
  • Private veya kapalı grup içerikleri
  • Login sonrası görünen Haber Akışı (News Feed) içerikleri
  • Mesajlar, bildirimler ve diğer kimlik doğrulama gerektiren veriler

Meta'nın Algılama Yığını: Akamai Bot Manager ve Ötesi

Facebook scraping'i zorlaştıran şey sadece bir CAPTCHA değil — çok katmanlı, davranışsal bir algılama sistemi var.

Akamai Bot Manager

Meta, Akamai'nin Bot Manager çözümünü kullanır. Bu sistem şunları izler:

  • IP itibar skoru: Datacenter IP'leri anında işaretlenir. VPN ve bilinen proxy ağları da yüksek risk kategorisindedir.
  • TLS parmak izi (JA3/JA4): İstemcinin TLS el sıkışma parametreleri, gerçek tarayıcı ile kütüphane (requests, aiohttp) arasındaki farkları tespit eder.
  • HTTP/2 çerçeve sıralaması: Gerçek Chrome, HTTP/2 çerçevelerini belirli bir sırada gönderir; çoğu HTTP istemcisi bu sıralamayı taklit etmez.
  • Akamai Sensör Verisi: Sayfa yüklenirken toplanan JavaScript sensör verisi, fare hareketi, tuş vuruşu ve tıklama kalıplarını analiz eder.

Davranışsal Parmak İzi (Behavioral Fingerprinting)

Sadece IP'yi geçmek yetmez. Akamai'nin istemci taraflı JavaScript'i şunları ölçer:

  • Mouse hareketlerinin doğallığı (Bezier eğrileri, hız değişimleri)
  • Sayfada kalma süresi ve scroll davranışı
  • Tıklama aralıklarının insan benzerliği
  • Canvas ve WebGL rendering farkları (tarayıcı kimliği)

Login Duvarı (Login Wall)

2024'ten itibaren Meta, birçok kamusal içeriği bile login duvarı ardına taşımaya başladı. Bir sayfayı ziyaret ettiğinizde, birkaç saniye sonra "Devam etmek için giriş yapın" katmanı görüntüleniyor. Bu, scraping'i teknik olarak değil ama pratik olarak çok zorlaştırıyor.

Neden Sadece Residential Proxy + Tarayıcı Otomasyonu Çalışır?

Ham HTTP istemcileri (requests, axios, curl) Facebook'da neredeyse hiç çalışmaz. Nedenini özetleyelim:

Yaklaşım IP Tipi TLS Parmak İzi Sensör Verisi Başarı Oranı
Ham HTTP (requests/curl) Datacenter ❌ Uyuşmuyor ❌ Yok %0–2
Ham HTTP + Residential Proxy Residential ❌ Uyuşmuyor ❌ Yok %3–8
Selenium + DC Proxy Datacenter ⚠️ Kısmen ⚠️ Zayıf %5–15
Playwright + Residential Proxy Residential ✅ Gerçek tarayıcı ✅ Simüle edilebilir %40–70
Graph API (Uygun kapsamda) %99+ (rate limit dahil)

Residential proxy'ler, gerçek ISP'lerden gelen IP'ler sunduğu için Akamai'nin IP itibar filtresini geçer. Playwright ise tam bir Chromium bağlamı çalıştırdığı için TLS parmak izi ve HTTP/2 davranışı gerçek tarayıcıyla birebir uyuşur. İkisi birleştiğinde, sensör verisini rastgele etkileşimlerle doldurarak en gerçekçi trafiği üretirsiniz.

Facebook residential proxy kullanımı, bu denklemdeki kritik halkadır — datacenter IP'ler anında engellenir.

Uygulama: Playwright ile Facebook Public Sayfa Verisi Çekme

Aşağıdaki örnek, ProxyHat residential proxy üzerinden Facebook'ta kamusal bir sayfayı ziyaret eder, rastgele etkileşimler simüle eder ve post başlıklarını toplar.

Python Playwright Örneği

import asyncio
import random
from playwright.async_api import async_playwright

# ProxyHat residential proxy konfigürasyonu
PROXY_URL = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
TARGET_PAGE = "https://www.facebook.com/Nike/"

async def human_delay(min_s=1.0, max_s=3.5):
    """İnsan benzeri rastgele bekleme"""
    await asyncio.sleep(random.uniform(min_s, max_s))

async def random_scroll(page, iterations=3):
    """Rastgele scroll hareketi"""
    for _ in range(iterations):
        delta = random.randint(200, 600)
        await page.mouse.wheel(0, delta)
        await human_delay(0.5, 1.8)

async def random_mouse_movement(page):
    """Rastgele fare hareketi — Akamai sensör verisi için"""
    viewport = page.viewport_size
    for _ in range(random.randint(3, 7)):
        x = random.randint(100, viewport["width"] - 100)
        y = random.randint(100, viewport["height"] - 100)
        await page.mouse.move(x, y, steps=random.randint(5, 15))
        await human_delay(0.2, 0.8)

async def scrape_facebook_page():
    async with async_playwright() as p:
        # Gerçekçi tarayıcı bağlamı
        browser = await p.chromium.launch(
            headless=True,
            proxy={"server": PROXY_URL},
            args=[
                "--disable-blink-features=AutomationControlled",
                "--no-sandbox",
            ]
        )

        context = await browser.new_context(
            viewport={"width": 1920, "height": 1080},
            user_agent=(
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                "AppleWebKit/537.36 (KHTML, like Gecko) "
                "Chrome/125.0.0.0 Safari/537.36"
            ),
            locale="en-US",
            timezone_id="America/New_York",
        )

        page = await context.new_page()

        # Hedef sayfaya git
        print(f"[→] {TARGET_PAGE} yükleniyor...")
        await page.goto(TARGET_PAGE, wait_until="domcontentloaded", timeout=30000)
        await human_delay(3.0, 6.0)

        # İnsan benzeri etkileşim simülasyonu
        await random_mouse_movement(page)
        await random_scroll(page, iterations=random.randint(2, 4))
        await human_delay(2.0, 4.0)

        # Login duvarını kapat (eğer görürsek)
        try:
            close_btn = page.locator('div[role="dialog"] [aria-label="Close"]')
            if await close_btn.count() > 0:
                await close_btn.first.click()
                await human_delay(1.0, 2.0)
        except Exception:
            pass  # Login duvarı yok, devam et

        # Post başlıklarını topla
        posts = await page.query_selector_all(
            'div[data-ad-preview] message, '
            'div[role="article"] div[dir="auto"] span'
        )

        extracted = []
        for post in posts[:15]:  # İlk 15 post ile sınırla
            text = await post.inner_text()
            if text and len(text) > 10:
                extracted.append(text.strip())

        print(f"[✓] {len(extracted)} post metni bulundu:")
        for i, t in enumerate(extracted, 1):
            print(f"  {i}. {t[:100]}...")

        await browser.close()
        return extracted

if __name__ == "__main__":
    asyncio.run(scrape_facebook_page())

Node.js Playwright Örneği

const { chromium } = require('playwright');

const PROXY_URL = 'http://user-country-US:PASSWORD@gate.proxyhat.com:8080';
const TARGET_PAGE = 'https://www.facebook.com/Nike/';

function humanDelay(minMs = 1000, maxMs = 3500) {
  const ms = Math.random() * (maxMs - minMs) + minMs;
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function randomScroll(page, iterations = 3) {
  for (let i = 0; i < iterations; i++) {
    const delta = Math.floor(Math.random() * 400) + 200;
    await page.mouse.wheel(0, delta);
    await humanDelay(500, 1800);
  }
}

(async () => {
  const browser = await chromium.launch({
    headless: true,
    proxy: { server: PROXY_URL },
    args: ['--disable-blink-features=AutomationControlled'],
  });

  const context = await browser.newContext({
    viewport: { width: 1920, height: 1080 },
    userAgent:
      'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ' +
      'AppleWebKit/537.36 (KHTML, like Gecko) ' +
      'Chrome/125.0.0.0 Safari/537.36',
    locale: 'en-US',
    timezoneId: 'America/New_York',
  });

  const page = await context.newPage();
  await page.goto(TARGET_PAGE, { waitUntil: 'domcontentloaded', timeout: 30000 });
  await humanDelay(3000, 6000);
  await randomScroll(page);
  await humanDelay(2000, 4000);

  const posts = await page.$$eval(
    'div[role="article"] div[dir="auto"] span',
    elements => elements
      .map(el => el.innerText.trim())
      .filter(t => t.length > 10)
      .slice(0, 15)
  );

  console.log(`[✓] ${posts.length} post bulundu`);
  posts.forEach((t, i) => console.log(`  ${i + 1}. ${t.slice(0, 100)}`));

  await browser.close();
})();

Temel Test: curl ile Proxy Doğrulama

ProxyHat bağlantınızı test etmek için hızlı bir curl komutu:

curl -x http://user-country-US:PASSWORD@gate.proxyhat.com:8080 \
  -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/125.0.0.0" \
  -s -o /dev/null -w "%{http_code}" \
  https://www.facebook.com/Nike/

Beklenen sonuç: 200 veya 301. Eğer 403 alırsanız, bu normaldir — ham HTTP ile Facebook sizi engeller. Bu test sadece proxy'nizin çalıştığını doğrular.

Rate Limit ve Parmak İzi Riskleri

Residential proxy ve tarayıcı otomasyonu kullansanız bile, dikkat etmeniz gereken kritik noktalar var:

Rate Limit Stratejileri

  • Aynı IP ile dakikada 3'ten fazla sayfa yüklemeyin. Akamai, hızlı ardışık istekleri anında işaretler.
  • IP rotasyonu kullanın. ProxyHat'ta user-country-US formatıyla her istekte yeni IP alabilirsiniz (per-request rotation). Aynı oturumda kalmanız gerekiyorsa, sticky session kullanın: user-country-US-session-abc123
  • İstekler arası rastgele bekleme ekleyin. Sabit 5 saniye değil, 3–8 saniye arası rastgele dağılım.
  • Günlük hacim sınırlayın. Tek bir scraping hedefi için günde 500–1000 sayfa, sürdürülebilir bir üst sınırdır.

Parmak İzi Riskleri

  • Viewport tutarlılığı: Her oturumda farklı viewport boyutu kullanmayın; bu şüpheli görünür. Birkaç gerçekçi profil tanımlayın ve rastgele seçin.
  • Timezone uyumu: IP'nin coğrafi konumu ile tarayıcı timezone'ı uyuşmalı. ABD IP'si ile İstanbul timezone kullanmayın.
  • WebGL ve Canvas: Playwright varsayılan olarak gerçek GPU rendering yapar, bu bir avantajdır. Headless modda bazı farklar ortaya çıkabilir; --use-gl=angle argümanını deneyin.
  • Automation bayrakları: navigator.webdriver değerinin true dönmemesi için --disable-blink-features=AutomationControlled bayrağını mutlaka ekleyin.

Kapsam Sınırları: Nereye Kadar Gidebilirsiniz?

Bu bölüm, teknikten daha önemlidir. Yanlış sınırlar, yasal soruşturma anlamına gelebilir.

Asla Yapmamanız Gerekenler

  • Login otomasyonu yapmayın. Kullanıcı adı ve şifre ile otomatik giriş yapmak, CFAA kapsamında "yetkisiz erişim" sayılabilir. Meta v. Bright Data davası bu noktayı netleştirdi.
  • Private veri kazımayın. Kapalı gruplar, kişisel mesajlar, arkadaş listeleri — bunların hiçbiri "kamusal" değildir.
  • Credentials paylaşmayın. Başkasının hesabını kullanarak scraping yapmak, hem sizin hem hesap sahibinin sorumluluğundadır.
  • Veriyi yeniden satmayın. Toplanan kamusal veriyi ticari ürün olarak satmak, GDPR ve diğer veri koruma yasaları altında ayrı bir sorumluluk doğurur.

Güvenli Sınırlar

  • Sadece login gerektirmeyen sayfalara erişin.
  • Kamusal sayfa postalarını, etkinlik bilgilerini ve public grup listelemelerini toplayın.
  • Veriyi iç analiz, marka izleme veya trend analizi için kullanın — üçüncü tarıka satmayın.
  • robots.txt kurallarını kontrol edin. Facebook'un robots.txt'i scraping'i yasaklasa da, kamusal veriye erişim ayrı bir yasal çerçevede değerlendirilir — yine de dikkatli olun.
  • Veri minimizasyonu ilkesini uygulayın: ihtiyacınız olandan fazlasını toplamayın.

Graph API: Kimlik Doğrulama Gerektiren Veriler İçin Tek Doğru Yaklaşım

Eğer login sonrası verilere ihtiyacınız varsa, scraping asla doğru yaklaşım değildir. Meta'nın Graph API'si bu ihtiyacı karşılamak için tasarlanmıştır.

Graph API'nin Avantajları

  • Yasal ve şeffaf: Meta'nın kendi onaylı erişim mekanizması.
  • Yapılandırılmış veri: JSON formatında, tutarlı alan adları ve tipler.
  • Rate limit'leri net: Uygulama başına saatlik ve günlük sınırlar açıkça belgelenir.
  • Sürdürülebilir: Anti-bot güncellemeleri sizi etkilemez.

Graph API'nin Sınırları

  • Uygulama onayı (App Review) süreci uzun ve katıdır.
  • Bazı veri kategorileri (arkadaş listesi, özel içerikler) artık API'den de kaldırılmıştır.
  • Rate limit'ler düşük olabilir: özellikle yeni uygulamalar için.
  • Veri erişim izinleri (permissions) giderek daralıyor.

Ne Zaman Graph API Kullanmalısınız?

Senaryo Scraping (Residential Proxy) Graph API
Kamusal sayfa postalarını toplama ✅ Uygun (login gerektirmeyen) ✅ Daha kararlı
Etkinlik bilgilerini çekme ✅ Uygun (public etkinlikler) ✅ Daha güvenilir
Reklam kütüphane verisi ⚠️ Karmaşık ✅ Ad Library API mevcut
Private grup içerikleri ❌ Yasal risk ⚠️ Sınırlı erişim
Kullanıcı profilleri ❌ Yasal risk ❌ API'den de kaldırıldı
Yorum ve etkileşim metrikleri ⚠️ Kısmen mümkün ✅ Page metrics API

Özet: Kimlik doğrulama gerektiren her türlü veri için Graph API'yi kullanın. Scraping, yalnızca API'nin kapsamadığı veya erişim vermediği kamusal veriler için son çare olmalıdır.

Etkili Scraping İçin Proxy Seçimi

Facebook scraping için proxy seçerken dikkat etmeniz gerekenler:

  • IP havuzu büyüklüğü: ProxyHat, geniş residential IP havuzu sunar — aynı IP'nin tekrar etme olasılığı düşüktür.
  • Coğrafi hedefleme: user-country-US veya user-country-DE-city-berlin formatıyla IP'nin konumunu kontrol edebilirsiniz. Facebook, coğrafi uyuşmazlığı tespit edebilir.
  • Oturum tutarlılığı: Bir sayfada birden fazla istek yapacaksanız, sticky session kullanın: user-country-US-session-abc123. Her istekte IP değişirse, Akamai bunu tespit eder.
  • SOCKS5 desteği: Bazı otomasyon araçları SOCKS5 gerektirir. ProxyHat SOCKS5 desteği sunar: socks5://user-country-US:PASSWORD@gate.proxyhat.com:1080

Daha fazla proxy lokasyonu ve detay için ProxyHat lokasyon sayfasını inceleyebilirsiniz.

Etik Scraping ve Resmi API'lerin Tercihi

Web scraping, güçlü bir araçtır — ama güç araçları sorumlu kullanım gerektirir. İşte her projenin başında kendinize sormanız gereken sorular:

  1. Bu veri gerçekten kamusal mi? Login olmadan erişebiliyor musunuz? Erişemiyorsanız, scraping yapmayın.
  2. Resmi bir API mevcut mu? Facebook Graph API, Ad Library API ve Instagram Graph API gibi seçenekleri mutlaka kontrol edin.
  3. Veri minimizasyonu uyguluyor musunuz? Her şeyi değil, sadece ihtiyacınız olanı toplayın.
  4. Veriyi nasıl saklıyorsunuz? GDPR kapsamında kişisel veri varsa, uygun güvenlik önlemleri alın ve saklama süresini sınırlayın.
  5. Hukuki danışmanız var mı? Özellikle ABD'de CFAA, AB'de GDPR kapsamında riskler taşıyorsunuz. Bir avukata danışmadan büyük ölçekli scraping projesi başlatmayın.

Resmi API'ler her zaman ilk tercihiniz olmalıdır. Scraping, API'nin kapsamadığı dar bir boşluk için — ve yalnızca kamusal verilerle — son çare olarak kullanılmalıdır. Bu yaklaşım hem yasal risklerinizi minimize eder hem de uzun vadeli veri erişim garantisi sağlar.

ProxyHat'ın proxy planları ve web scraping kullanım senaryoları hakkında daha fazla bilgi alabilirsiniz. SERP izleme ve arama motoru verisi çekme için SERP tracking sayfamıza da göz atın.

Temel Çıkarımlar

  • Sadece kamusal veriye erişin: Login gerektirmeyen sayfa postları, etkinlikler ve public grup listelemeleri.
  • Residential proxy zorunludur: Datacenter IP'ler anında engellenir. ProxyHat residential proxy'leri, gate.proxyhat.com:8080 üzerinden coğrafi hedefleme ile kullanılabilir.
  • Tarayıcı otomasyonu şart: Ham HTTP istemcileri çalışmaz. Playwright + residential proxy, en iyi başarı oranını sunar.
  • İnsan benzeri davranış simüle edin: Rastgele scroll, fare hareketi ve bekleme süreleri Akamai sensör verisini aşmak için kritiktir.
  • Login otomasyonu yapmayın: CFAA ve Meta v. Bright Data davası, yetkisiz erişimin yasal sonuçlarını netleştirdi.
  • Graph API'yi tercih edin: Kimlik doğrulama gerektiren veriler için scraping değil, resmi API kullanın.
  • Hukuk danışmanına başvurun: Her büyük ölçekli veri toplama projesi öncesinde yasal uyumluluk kontrolü yapın.

Facebook sayfa scraping projeniz için residential proxy'ye mi ihtiyacınız var? ProxyHat planlarını inceleyin ve dakikalar içinde başlayın.

Başlamaya hazır mısınız?

148+ ülkede 50M+ konut IP'sine AI destekli filtreleme ile erişin.

Fiyatlandırmayı GörüntüleKonut Proxy'leri
← Bloga Dön