[Rehber] Instagram & X (Twitter) Veri Kazıma: Oturum Yönetimi (Session/Cookie) ve Rate Limit Stratejileri
#1

Sosyal Medya & İçerik Kazıma projelerinde en sık karşılaşılan problem, platformların (Instagram, X/Twitter, TikTok vb.) anonim ziyaretçilere içerik göstermeyi kısıtlaması ve oturum açıldığında ise agresif bot tespit algoritmalarıyla hesapları askıya almasıdır.

Bu rehberde, Puppeteer veya Playwright kullanırken oturumları (Cookies/Storage) tek seferde dışa aktarıp her döngüde yeniden giriş yapmadan oturumu ayağa kaldırma mimarisini ve ban yememek için uygulamanız gereken temel kuralları paylaşıyorum.



1. Neden Sürekli Kullanıcı Adı / Şifre ile Giriş Yapmamalıyız?

Her scraping işlemi başladığında login formunu doldurmak şu riskleri doğurur:
  • Aynı IP veya parmak izinden gelen sık login istekleri doğrudan 2FA / SMS Doğrulaması veya Hesap Kilitleme tetikler.
  • Login sayfalarındaki Cloudflare, Arkose Labs veya reCAPTCHA gibi bot koruma duvarlarına takılma olasılığınız katlanarak artar.
  • Süreç gereksiz yere 10-15 saniye uzar ve kaynak tüketimi artar.

Doğru Yaklaşım: Oturumu bir kez manuel (veya yarı otomatik) açmak, tarayıcı çerezlerini (`cookies.json`) diske kaydetmek ve tüm veri kazıma işlemlerinde bu çerezleri sayfaya enjekte ederek doğrudan hedef profile/içeriğe gitmektir.



2. Node.js & Puppeteer ile Cookie Tabanlı Oturum ve Kazıma Mimarisi

Aşağıdaki hazır kod, önceden kaydedilmiş bir oturum dosyası (`session_cookies.json`) varsa doğrudan onu yükler; yoksa oturum açmanız için tarayıcıyı bekletip çerezleri otomatik olarak kaydeder.

Kod:
const puppeteer = require('puppeteer'); const fs = require('fs'); const path = require('path'); const COOKIE_DOSYASI = path.join(__dirname, 'session_cookies.json'); const HEDEF_URL = 'https://www.instagram.com/explore/'; // İnsansı rastgele bekleme fonksiyonu (ms) const bekle = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); async function scrapingBaslat() {   const browser = await puppeteer.launch({     headless: false, // İlk çalıştırmada manuel oturum için görünür mod önerilir     args: [       '--no-sandbox',       '--disable-setuid-sandbox',       '--disable-blink-features=AutomationControlled' // WebDriver izini gizleme     ]   });   const page = await browser.newPage();   // Gerçekçi bir User-Agent tanımlayalım   await page.setUserAgent(     'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'   );   // 1. ADIM: Kayıtlı çerez var mı kontrol et   if (fs.existsSync(COOKIE_DOSYASI)) {     console.log('[+] Mevcut oturum çerezleri bulundu, yükleniyor...');     const cookiesJson = fs.readFileSync(COOKIE_DOSYASI, 'utf-8');     const cookies = JSON.parse(cookiesJson);     await page.setCookie(...cookies);   } else {     console.log('[!] Çerez dosyası bulunamadı. Lütfen açılan tarayıcıda manuel giriş yapın.');     await page.goto('https://www.instagram.com/accounts/login/', { waitUntil: 'networkidle2' });     // Kullanıcının manuel giriş yapıp ana akışa düşmesini bekliyoruz (Maksimum 2 dakika)     await page.waitForNavigation({ waitUntil: 'networkidle2', timeout: 120000 });     // Giriş tamamlandıktan sonra güncel çerezleri diske kaydediyoruz     const guncelCerezler = await page.cookies();     fs.writeFileSync(COOKIE_DOSYASI, JSON.stringify(guncelCerezler, null, 2));     console.log('[+] Oturum başarıyla kaydedildi -> session_cookies.json');   }   // 2. ADIM: Hedef sayfaya doğrudan git   console.log(`[+] Hedefe gidiliyor: ${HEDEF_URL}`);   await page.goto(HEDEF_URL, { waitUntil: 'domcontentloaded' });   // İnsansı gecikme verelim   await bekle(3000 + Math.random() * 2000);   // 3. ADIM: İçerik Kazıma Örneği (Görseller veya Post Metinleri)   const veriler = await page.evaluate(() => {     const sonuclar = [];     // Sayfadaki gönderi bağlantılarını toplayalım     const linkler = document.querySelectorAll('a[href*="/p/"]');     linkler.forEach((a) => {       sonuclar.push({         postUrl: a.href,         img: a.querySelector('img') ? a.querySelector('img').src : null       });     });     return sonuclar;   });   console.log(`[+] Toplam ${veriler.length} adet gönderi bağlantısı yakalandı.`);   console.log(veriler.slice(0, 5)); // İlk 5 veriyi konsola yazdır   await browser.close(); } scrapingBaslat().catch(console.error);



3. Sosyal Medya Kazırken Ban Yememek İçin Altın Kurallar

  1. Scroll (Kaydırma) Hızını İnsansı Yapın: Sayfanın dibine tek seferde `window.scrollTo(0, 999999)` şeklinde inmek %100 bot sinyalidir. Küçük adımlarla (`scrollBy(0, 400)`), aralara 400-800 ms rastgele gecikmeler koyarak kaydırın.
  2. DOM Yerine Network / XHR İsteklerini Dinleyin: Çoğu platform içerikleri arkada JSON API'ları üzerinden çeker (GraphQL / REST). DOM'daki sürekli değişen rastgele CSS sınıflarını (örneğin `.x1lliihq`) parse etmek yerine `page.on('response', ...)` kullanarak doğrudan gelen temiz JSON verisini yakalamak kodu kırılmalara karşı ölümsüz yapar.
  3. Mobil Endpoint Stratejisi: Masaüstü arayüzler ağır JavaScript ve bot korumaları içerir. Mobil User-Agent ve mobil endpoint'ler (örneğin `m.facebook.com` veya `mbasic`) çok daha hafif DOM ve daha toleranslı rate limit sunar.
  4. Residential (Konut) Proxy Kullanımı: Veri merkezi (Datacenter / AWS / DigitalOcean) IP'leri doğrudan işaretlenir. Ciddi hacimli taramalarda döngü başına IP değiştiren döner konut proxyleri kullanmak şarttır.

Sizin sosyal medya projelerinde en sık karşılaştığınız bot engeli hangisi? Karşılaştığınız özel bir selector veya rate limit senaryosu varsa konu altında tartışalım.
Bul
Cevapla


Bu Konudaki Yorumlar
[Rehber] Instagram & X (Twitter) Veri Kazıma: Oturum Yönetimi (Session/Cookie) ve Rate Limit Stratejileri - Yazar: admin - 2 saat önce

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi