Kullanım alanı

Web Scraping için Rotating Proxy

Büyük ölçekli veri toplama işlerinde IP rotasyonu ile istek dağıtımı ve daha dengeli bağlantı yönetimi.

Web scraping projelerinde tek IP üzerinden yoğun istek göndermek hızla engellenmeye veya hız sınırına takılmaya yol açabilir. Rotating proxy, her istekte veya oturumda farklı IP kullanarak trafiği dağıtır.

Hacim odaklı işlerde datacenter rotating genelde daha ekonomiktir. Hedef sitelerin residential IP beklediği senaryolarda residential veya mobile rotating değerlendirilir.

Meşru kullanım şarttır: yalnızca erişim hakkınız olan veya kamuya açık verileri, hedef sitenin koşullarına ve yürürlükteki hukuka uygun şekilde toplayın.

Web Scraping rehberi

Web scraping için rotating proxy seçiminde ürünü proje değil hedef site belirler: datacenter trafiğine toleranslı hedeflerde IPv4 Datacenter, bölgeye göre içerik değiştiren veya datacenter ağlarına hassas hedeflerde IPv4 Residential, IPv6 erişilebilir sürekli işlerde port bazlı IPv6 ürünler, yalnız mobil ağa özgü içerikte Mobile öne çıkar. Rotasyon modu, eşzamanlılık, geri çekilme ve bütçe de hedefe göre ayarlanır.

Web scraping için rotating proxy seçiminde ilk soru: hedef neyi kabul ediyor?

Scraping projelerinde proxy kararı çoğu zaman yanlış uçtan başlar. Ekip önce bütçeye ya da tanıdık bir ürün adına bakar, hedefin bu seçime nasıl tepki verdiğini ise canlıda öğrenir. Oysa web scraping için rotating proxy seçerken asıl girdi hedef sitenin kendisidir. Aynı projede bir hedef datacenter adreslerinden gelen isteklere hiç tepki vermezken bir başkası aynı trafiği ilk dakikalarda yavaşlatabilir; biri her sayfayı bağımsız sunarken diğeri sayfalar arasında oturum bekler. Tek bir ürünü bütün hedeflere zorlamak ya gereksiz maliyet ya da gereksiz hata üretir.

Bu rehber bu yüzden ürünlerden değil, hedefin dört özelliğinden yola çıkar. Ağ toleransı: hedef datacenter, konut ve mobil adreslere farklı davranıyor mu? Durum ihtiyacı: bir sayfa önceki yanıttan kalan çerez, belirteç veya imleç olmadan açılıyor mu? Adres ailesi: hedef IPv6 üzerinden aynı içeriği veriyor mu? Coğrafi duyarlılık: içerik ziyaretçinin ülkesine göre değişiyor mu? Bu dört soru yanıtlandığında ürün, rotasyon modu, eşzamanlılık tavanı ve bütçe büyük ölçüde kendiliğinden belirlenir.

RotatingProxy kataloğunda beş rotating ürün bulunur: IPv4 Datacenter, IPv4 Residential, Mobile, IPv6 Datacenter ve IPv6 Residential. İlk üçü GB bazlı ve süre sınırı olmayan paketlerle, son ikisi port bazlı aylık paketlerle satılır; beşi de HTTP, HTTPS ve SOCKS5 protokollerini destekler. Sonraki bölümler önce hedefi tanımayı, ardından ürünü, rotasyonu, hızı, hata politikasını ve maliyeti sırasıyla ele alır. En sonda hukuki çerçeve, sık görülen sorunlar ve canlı öncesi bir gözden geçirme listesi yer alır.

Proxy almadan önce hedefi tanımak: altı adımlık keşif

Keşif birkaç saatlik bir iştir ve ürün seçimindeki tahmini ölçüme çevirir. Amaç hedefi yormak değil, nasıl çalıştığını küçük bir örnekle anlamaktır. Aşağıdaki adımları her hedef için ayrı uygulayın ve sonuçları basit bir tabloda tutun; sonraki bölümlerdeki bütün kararlar bu tabloya dayanır.

  1. Kuralları okuyun. robots.txt dosyasını ve kullanım koşullarını inceleyin, sitenin resmi bir API ya da veri dışa aktarma seçeneği sunup sunmadığına bakın. Resmi bir kanal varsa çoğu zaman scraping’den daha ucuz, daha kararlı ve hukuken daha temizdir.
  2. Sayfa türlerini listeleyin: liste, detay, arama sonucu, sayfalandırılmış kategori gibi. Her tür için gerçekten ihtiyaç duyduğunuz alanları yazın. İhtiyaç dışı alanları toplamamak hem trafiği hem de hukuki riski azaltır.
  3. Durum ihtiyacını belirleyin. Bir detay sayfası doğrudan adresiyle açılabiliyorsa durumsuzdur. İkinci sayfaya geçmek için önceki yanıttaki bir imleç, çerez veya form belirteci gerekiyorsa o akış durumludur ve oturum bazlı rotasyon ister.
  4. Adres ailesini kontrol edin. Alan adının DNS kayıtlarında AAAA kaydı var mı? Varsa IPv6 üzerinden gelen yanıt IPv4 yanıtıyla aynı içeriği veriyor mu? Kaydın varlığı tek başına yetmez; içerik eşitliğini birkaç farklı sayfada karşılaştırın.
  5. Coğrafi farkı ölçün. Aynı sayfayı iki farklı ülkeden açtığınızda dil, para birimi, stok ya da içerik değişiyor mu? Değişiyorsa ülke, verinin bir parçasıdır ve rotasyon her istekte ülke değiştirmemelidir.
  6. Ağ toleransını küçük bir örneklemle deneyin. Birkaç düzine isteği önce datacenter, sonra residential çıkışla ve düşük hızda gönderin. Durum kodlarını, yanıt boyutlarını ve beklenen alanların gelip gelmediğini kaydedin; 200 kodu dönüp içi boş olan ya da doğrulama sayfası gösteren yanıtları ayrıca sayın.

Altıncı adımın amacı hedefin sınırını zorlamak değil, ilk izlenimi almaktır. Datacenter çıkışla beklenen alanlar eksiksiz geliyorsa en ekonomik seçenekle başlayabilirsiniz. Yanıtlar ağ türüne göre belirgin biçimde ayrışıyorsa bu farkı not edin; ürün kararı tam olarak bu farka dayanır. Birkaç düzine isteklik bir keşif için katalogdaki “Karşılama 1+1” etiketli 2 GB’lık giriş paketleri yeterlidir: IPv4 Datacenter’da 1 dolar, IPv4 Residential’da 2,5 dolar, Mobile’da 4 dolardır. Bunlar kampanya paketleridir; koşullarını sipariş adımında kontrol edin.

Keşif tablosunu bir kez doldurup unutmayın. Siteler altyapılarını, koruma katmanlarını ve sayfa yapılarını zaman içinde değiştirir. Uzun soluklu projelerde her hedef için birkaç ayda bir ya da hata oranında belirgin bir sıçrama gördüğünüzde keşfi tekrarlamak, ürün ve hız kararlarını güncel tutar.

Beş rotating ürünü hedef tiplerine eşlemek

Keşif tablosu hazırsa hedefleri tiplere ayırabilirsiniz. Aşağıdaki eşleştirme bir başlangıç noktasıdır ve her hedefin gerçek davranışı pilotta doğrulanmalıdır. Geçiş sinyali sütunu, ilk seçimin ne zaman gözden geçirilmesi gerektiğini gösterir.

Hedef tipine göre ilk ürün ve geçiş sinyali
Hedef tipiİlk denemeGeçiş sinyaliSonraki adım
Açık katalog, doküman veya kamu verisi; ağ türüne tepki yokIPv4 Datacenter (GB bazlı)Datacenter çıkışta beklenen alanlar eksik ya da bölgesel içerik yanlış geliyor (403 veya doğrulama sayfası değil)Koşullar otomatik erişime izin veriyorsa o hedefi IPv4 Residential’la yeniden ölçün; 403 veya doğrulama sayfası görüyorsanız durun ve nedeni inceleyin
İçeriği ülkeye göre değişen site (dil, para birimi, stok)IPv4 Residential, ülke sabitÜlke sabit olduğu hâlde kayıtlar karışık geliyorAkışın oturum ihtiyacını yeniden kontrol edin
Datacenter çıkışta bölgesel ya da eksik içerik sunan, otomatik erişime koşullarında izin veren hedefIPv4 ResidentialResidential çıkışta da 403 veya doğrulama sayfası görülüyorDurun, hızı ve kapsamı düşürün, resmi veri kanalı arayın
IPv6 üzerinden aynı içeriği veren, sürekli taranan hedefIPv6 Datacenter (port, aylık)IPv6 yanıtları eksik ya da IPv4 yanıtından farklıIPv4 Datacenter veya IPv6 Residential
İçeriği yalnız mobil operatör ağında farklılaşan hedefMobile (LTE/5G, GB bazlı)Mobil ve residential yanıtlar aynı çıkıyorIPv4 Residential’a dönün, mobil maliyetine gerek yok

IPv4 Datacenter katalogda istek başına veya oturum bazlı rotasyonla tanımlanır ve paketleri 2 GB’tan 1.000 GB’a kadar uzanır. Hedef datacenter trafiğine tepki vermiyorsa en düşük birim maliyet bu üründedir; bu yüzden her hedefte ilk deneme olarak kalmalı ve yalnız ölçülmüş bir sorun varsa bırakılmalıdır. “Residential daha garanti olur” düşüncesiyle hedefleri baştan pahalı ürüne taşımak, 100 GB kademesinde aynı veriyi iki katı maliyetle toplamak anlamına gelir.

IPv4 Residential ve Mobile, sticky ve rotating oturum seçenekleriyle gelir. Residential, coğrafi doğruluk ve hassas hedefler için asıl çalışma atıdır. Mobile ise scraping’de nadiren ilk tercihtir: LTE/5G taşıyıcı adresleri ancak hedef içeriği gerçekten mobil ağa göre değiştiriyorsa ek değer üretir. 100 GB kademesinde Mobile 225 dolar, Residential 120 dolar, Datacenter 60 dolardır; mobil farkı ölçmeden mobil ürüne geçmek bütçeyi hızla eritir.

IPv6 Datacenter ve IPv6 Residential oturum yapılandırmalı rotasyonla çalışır ve port bazlı aylık faturalanır. Lokasyon listeleri IPv4 ürünlerin 180’i aşan ülke kapsamından dardır: IPv6 Datacenter için Almanya, ABD, Hollanda, Birleşik Krallık, Türkiye, Fransa, Kanada ve Polonya; IPv6 Residential için bunlara ek olarak Avusturya listelenir. Hedefiniz bu ülkelerden birinden erişim gerektiriyorsa ve IPv6 üzerinden aynı içeriği veriyorsa port modeli sürekli işlerde güçlü bir seçenektir; aksi hâlde IPv4 ürünlerde kalın.

İstek başına rotasyon mu, oturum bazlı rotasyon mu?

Rotasyon modunu ürün değil iş birimi belirler. İş birimi, hedefin gözünde tutarlı görünmesi gereken en küçük istek grubudur. Doğrudan açılan bir detay sayfası tek istekten oluşan bir iş birimidir. Bir arama sorgusunun ilk beş sonuç sayfası ise tek bir iş birimidir, çünkü üçüncü sayfanın isteği ikinci sayfadan gelen bir imlece ya da çereze dayanır. Kural basittir: iş birimi içinde çıkış adresi sabit kalmalı, iş birimleri arasında değişebilir.

HTTPS hedeflerde proxy yalnız CONNECT tünelini görür; bu yüzden istek başına rotasyon pratikte bağlantı başına çalışır ve istemci tüneli yeniden kullandıkça çıkış adresi değişmez. İstek başına rotasyon durumsuz işlerin varsayılanıdır. Yük havuza en geniş biçimde dağılır, tek bir adres hedefte iz biriktirmez ve bir isteğin başarısız olması diğerlerini etkilemez. Oturum bazlı rotasyon ise durumlu akışlar içindir: oturum boyunca aynı çıkış adresi kullanılır, akış bittiğinde ya da bir hata oturumu bozduğunda yeni oturum açılır. Bir oturumun ne kadar süre aynı adreste kalabileceği ve oturum kimliğinin bağlantıya nasıl iletildiği ürüne göre değişebilir; bunları panelde ve ürün dokümanında kontrol edin, varsayımla kod yazmayın.

İş birimine göre rotasyon modu
İş birimiÖnerilen modGerekçeYanlış seçimin belirtisi
Doğrudan adresle açılan detay sayfasıİstek başınaÖnceki isteğe bağımlılık yok; yük en geniş biçimde dağılırOturumda tutulursa tek adres gereksiz yere yoğunlaşır
İmleçli ya da çerezli sayfalandırmaOturum bazlıSonraki sayfa önceki yanıttaki durumu isterİkinci sayfadan sonra boş liste, tekrar eden kayıt veya başa dönme
Filtre ya da arama formu gönderip sonucu okumaOturum bazlıForm belirteci ve çerez aynı istemciye bağlıdırGeçersiz belirteç hatası, yönlendirme döngüsü
Ülkeye göre değişen fiyat ya da içerikİstek başına, ülke sabitAdres değişebilir ama ülke değişmemelidirAynı kayıtta farklı para birimi veya dil
Uzun süre aynı kimlikle çalışan izinli bir hesapRotating yerine static IPHesap güvenliği adres değişimini şüpheli bulabilirSık doğrulama istekleri, oturum düşmesi

Oturum bazlı rotasyonda en sık yapılan hata oturumu gereğinden uzun tutmaktır. Oturum, iş birimiyle birlikte doğmalı ve onunla birlikte kapanmalıdır. Beş sayfalık bir sayfalandırmayı bitiren işçi, bir sonraki aramaya aynı oturumla devam ederse yükü yine tek adrese yığar ve istek başına rotasyonun sağladığı dağılımı kaybeder. Tersi de sorundur: bir akışın ortasında hata alan işçi yalnız o isteği değil bütün iş birimini baştan, yeni bir oturumla tekrarlamalıdır; yarım kalmış bir akışa farklı bir adresten devam etmek çoğu zaman tutarsız veri üretir.

Rotasyonu kendi bağlantınızda gözlemlemek

Kod yazmaya başlamadan önce rotasyonun sizin bağlantınızda nasıl davrandığını görün. Aşağıdaki komutlar aynı uç noktaya art arda istek gönderir. HEDEF_URL yerine istemcinin çıkış adresini düz metin olarak döndüren bir test uç noktası kullanın. İstek başına rotasyonda adreslerin değişmesi, oturum bazlı ayarda ise oturum boyunca aynı kalması beklenir.

curl ile çıkış adresi gözlemi (bağlantı bilgileri panelden alınır)
# İstek başına rotasyon: her curl çağrısı yeni bir bağlantı açar.
# HEDEF_URL yerine çıkış adresini düz metin döndüren bir test uç noktası yazın.
for i in 1 2 3 4 5; do
  curl -s --max-time 20 -x "http://KULLANICI:ŞİFRE@GATEWAY:PORT" "HEDEF_URL"; echo
done

# Aynı deneme SOCKS5 ile; socks5h alan adının proxy tarafında çözülmesini sağlar.
curl -s --max-time 20 -x "socks5h://KULLANICI:ŞİFRE@GATEWAY:PORT" "HEDEF_URL"; echo

# Oturum bazlı ayarda beş yanıtın aynı adresi göstermesi beklenir.
# Oturum kimliğinin nasıl verildiğini panelde kontrol edin; burada varsayılmamıştır.

İstek başına modda adresler değişmiyorsa en sık neden istemcinin bağlantıyı yeniden kullanmasıdır; hata tablosunda bu durum ayrıca ele alınır. Test uç noktasını yalnız doğrulama için kullanın ve bu yanıtları üretim kayıtlarına karıştırmayın.

Eşzamanlılık: hızı hedef belirler, IP sayısı değil

Rotating proxy hakkındaki en yaygın yanlış okuma şudur: her istek başka bir adresten gidiyorsa hedefe istediğim kadar hızlı gidebilirim. Hedefin kapasitesi, sunucu yükü ve hız sınırları çıkış adreslerinizin sayısıyla artmaz. Pek çok site hız sınırını yalnız IP adresine göre değil; oturuma, çereze, istek örüntüsüne ve toplam yüke göre uygular. Bu yüzden eşzamanlılık iki ayrı tavanla yönetilir: hedef başına tavan ve toplam tavan.

Hedef başına tavan, tek bir alan adına aynı anda açık olabilecek istek sayısıdır ve hedefin kaldırabileceği yükü temsil eder. Küçük ve orta ölçekli sitelerde bu sayıyı tek haneli tutmak, yanıt süreleri uzadığında ise düşürmek iyi bir başlangıçtır. Toplam tavan ise sizin altyapınızın, bant genişliğinizin ve proxy paketinizin sınırıdır. Port bazlı IPv6 ürünlerde katalog, port sayısının eşzamanlı oturum kapasitenizi belirlediğini söyler; bir portun kaç eşzamanlı bağlantı taşıdığını panelde kontrol edin ve toplam tavanı bu değerin altında tutun. GB bazlı IPv4 ürünlerde de varsa eşzamanlı bağlantı koşulunu sipariş adımında ya da panelde doğrulayın.

Kaç işçiye ihtiyacınız olduğunu kabaca bulmak için hedeflediğiniz istek hızını ortalama yanıt süresiyle çarpın. Örneğin bir hedeften saniyede 2 sayfa almak istiyor ve yanıtların ortalama 1,5 saniye sürdüğünü ölçtüyseniz (ikisi de varsayım) yaklaşık 3 eşzamanlı isteğe ihtiyacınız vardır. Yanıt süresi yükle birlikte uzuyorsa bu bir uyarıdır: işçi eklemek hızı artırmaz, yalnız hedefin üzerindeki baskıyı artırır.

Güvenli bir hız bulmanın en pratik yolu kademeli artıştır. Hedef başına tek eşzamanlı istekle başlayın, birkaç dakika boyunca durum kodlarını ve yanıt sürelerini izleyin, sorun yoksa tavanı bir artırın. 429, 503 veya yanıt süresinde belirgin bir yükselme gördüğünüz ilk kademede durun ve bir önceki kademeye dönün. Bulduğunuz değer o hedefin çalışma tavanıdır. Bunu yapılandırmada hedefe özel saklayın, çünkü bir hedef için güvenli olan hız başka bir hedefi rahatsız edebilir. Mümkünse taramaları hedefin yoğun saatleri dışına planlayın; aynı veri, sitenin sakin olduğu saatlerde hem daha az hata hem de daha az yeniden deneme ile toplanır.

Yeniden deneme ve geri çekilme: her yanıt aynı tepkiyi hak etmez

Rotating proxy ile yeniden deneme yazmak kolaydır ve bu kolaylık tehlikelidir. Her hatada yeni adresle tekrar dene diyen bir döngü, geçici bir sorunu çözerken kalıcı bir sorunu büyütür. Hedefin açıkça reddettiği bir isteği farklı adreslerden tekrar tekrar göndermek hem kotayı yakar hem de bütün trafiğinizi hedefin gözünde şüpheli hâle getirir. Doğru politika önce yanıtı sınıflandırır, sonra o sınıfa uygun tek bir davranış seçer.

Yanıt sınıfına göre yeniden deneme kararı
YanıtOlası anlamYeniden dene?Davranış
429 Too Many RequestsHedefin hız sınırı aşıldıEvet, bekleyerekRetry-After başlığına uyun, yoksa üstel bekleyin; hedef başına tavanı düşürün
503 Service UnavailableHedef geçici olarak yük altındaEvet, bekleyerekRetry-After varsa uyun; art arda geliyorsa hedefi bir süre durdurun
500, 502, 504Hedefte ya da aradaki katmanda geçici hataSınırlı sayıdaKısa üstel bekleme; tekrarlıyorsa iş birimini kuyruğun sonuna alın
Zaman aşımı, bağlantı sıfırlanmasıAğ yolu veya çıkış adresi kaynaklı sorunEvetİstek başına modda yeni bağlantı yeni adres demektir; oturumda iş birimini yeni oturumla baştan alın
407 Proxy Authentication RequiredProxy kimlik bilgisi hatalı ya da yetkisizHayırKimlik bilgisini veya IP whitelist ayarını düzeltin, bütün döngüyü durdurun
403 ForbiddenPolitika kararı ya da erişim yasağıHayırİsteği bırakın, hedefi incelemeye alın; adres değiştirerek zorlamayın
404, 410Sayfa yok ya da kaldırılmışHayırKaydı kuyruktan çıkarın, kaynak listenizi güncelleyin
200 ama beklenen alan yokYumuşak engel, doğrulama sayfası ya da istemci tarafında oluşan içerikHayır, önce teşhisYanıtı örnekleyip inceleyin; doğrulama sayfasıysa hızı düşürün, içerik betikle geliyorsa yöntemi gözden geçirin

Bekleme süresi için üstel geri çekilmeyi rastgelelikle birlikte kullanın: her denemede üst sınırı ikiye katlayın ve gerçek bekleme süresini sıfır ile bu üst sınır arasında rastgele seçin. Rastgelelik, aynı anda başarısız olan çok sayıda işçinin aynı anda tekrar denemesini, yani hedefe dalga hâlinde yüklenmesini önler. Retry-After başlığı varsa hesapladığınız değerden önce gelir; hedef ne kadar beklemenizi istiyorsa o kadar bekleyin.

İki sınır daha ekleyin. Birincisi yeniden deneme bütçesidir: toplam isteklerin belirli bir oranından fazlası yeniden deneme olamaz. Bu oran aşıldığında sorun tek tek isteklerde değil, hızda ya da hedefin tutumundadır ve daha fazla deneme yalnız GB harcar. İkincisi hedef başına devre kesicidir: kısa sürede art arda hata alan hedef bir süre tamamen durdurulur, bekleme bitince tek bir istekle yeniden yoklanır; o istek de başarısız olursa devre yeniden açılır. Aşağıdaki Node.js iskeleti bu kuralları bir araya getirir. Node’un yerleşik fetch işlevi tek başına proxy ayarı almaz; bu örnekte fetch ve ProxyAgent birlikte undici paketinden içe aktarılır, bu yüzden paketi projenize eklemeniz gerekir. İstek başına rotasyon gerekiyorsa bağlantı yeniden kullanımını kapatın ya da iş birimi başına yeni bir ProxyAgent oluşturun, çünkü ProxyAgent aynı hedef için açtığı tüneli yeniden kullanabilir.

Node.js ve undici ile yanıt sınıflandırma, Retry-After, yeniden deneme bütçesi ve devre kesici
import { fetch, ProxyAgent } from 'undici'

const agent = new ProxyAgent('http://KULLANICI:ŞİFRE@GATEWAY:PORT')
const RETRYABLE = new Set([429, 500, 502, 503, 504])
const MAX_ATTEMPTS = 4
const BASE_MS = 1000
const CAP_MS = 60000
const RETRY_BUDGET = 0.1          // varsayım: isteklerin en fazla yüzde 10u tekrar
const BREAK_AFTER = 5             // devreyi açan art arda hata sayısı
const COOLDOWN_MS = 10 * 60000    // devrenin açık kalma süresi

const stats = { requests: 0, retries: 0, bytes: 0 }
const breakers = new Map()        // host -> { fails, openUntil }
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))

function backoff(attempt, retryAfter) {
  const seconds = Number(retryAfter)
  if (retryAfter && Number.isFinite(seconds)) return seconds * 1000
  const ceiling = Math.min(CAP_MS, BASE_MS * 2 ** attempt)
  return Math.random() * ceiling  // tam rastgele bekleme
}

function breakerFor(host) {
  if (!breakers.has(host)) breakers.set(host, { fails: 0, openUntil: 0 })
  return breakers.get(host)
}

export async function getPage(url, mustContain) {
  const b = breakerFor(new URL(url).host)
  if (Date.now() < b.openUntil) return { url, outcome: 'devre-acik' }

  for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
    if (attempt > 0) {
      const overBudget = stats.requests >= 100 &&
        stats.retries >= stats.requests * RETRY_BUDGET
      if (overBudget) return { url, outcome: 'butce-asildi' }
      stats.retries++
    }
    stats.requests++

    let res
    try {
      res = await fetch(url, {
        dispatcher: agent,
        headers: { 'user-agent': 'OrnekVeriToplayici/1.0 (iletisim adresiniz)' },
        signal: AbortSignal.timeout(30000),
      })
    } catch {
      await sleep(backoff(attempt))
      continue                      // ağ hatası: yeni bağlantıyla tekrar
    }

    if (res.status === 407) throw new Error('Proxy kimlik bilgisi hatalı, döngü durduruldu')
    if ([403, 404, 410].includes(res.status)) {
      await res.body?.cancel()
      return { url, outcome: 'birak-' + res.status }
    }
    if (RETRYABLE.has(res.status)) {
      const wait = backoff(attempt, res.headers.get('retry-after'))
      await res.body?.cancel()
      b.fails++
      if (b.fails >= BREAK_AFTER) {
        b.openUntil = Date.now() + COOLDOWN_MS
        return { url, outcome: 'devre-kesildi' }
      }
      await sleep(wait)
      continue
    }

    const body = await res.text()
    stats.bytes += Buffer.byteLength(body)  // açılmış boyut: faturayla aynı değil, eğilim içindir
    b.fails = 0
    if (mustContain && !body.includes(mustContain)) {
      return { url, outcome: 'yumusak-engel-suphesi' }
    }
    return { url, outcome: 'ok', body }
  }
  return { url, outcome: 'deneme-bitti' }
}

İskelette üç bilinçli tercih var. İlki, 403 ve 404 asla yeniden denenmez; 407 ise bütün işi durdurur, çünkü kimlik bilgisi hatası her istekte aynen tekrar edecektir. İkincisi, beklenen bir metin parçası yanıtta yoksa istek başarılı sayılmaz; bu kontrol, 200 kodlu yumuşak engellerin veri setinize sessizce boş kayıt olarak girmesini önler. Üçüncüsü, sayaçtaki bayt değeri açılmış içeriğin boyutudur. Proxy tarafında ölçülen trafik sıkıştırma, başlıklar ve şifreleme katmanı nedeniyle bundan farklıdır; sayaç fatura tahmini için değil, hedef bazında eğilimi izlemek içindir.

Scrapy’de hedefe göre ürün, nezaket ve yeniden deneme

Python tarafında çalışan ekipler aynı ilkelerin çoğunu Scrapy’nin yerleşik ayarlarıyla kurabilir. Aşağıdaki örnekteki asıl fikir, ürün seçiminin kodun içine gömülmemesi ve hedef bazında bir tabloda durmasıdır. Küçük bir ara katman, isteğin gittiği alan adına bakarak hangi ürünün bağlantı bilgisinin kullanılacağına karar verir. Kimlik bilgisi proxy adresinin içine yazıldığında Scrapy’nin yerleşik proxy ara katmanı yetkilendirme başlığını kendisi ekler.

Scrapy ayarları ve hedef bazında proxy seçen ara katman
# settings.py
ROBOTSTXT_OBEY = True
USER_AGENT = "OrnekVeriToplayici/1.0 (+iletisim adresiniz)"

CONCURRENT_REQUESTS = 16               # varsayım: toplam tavan
CONCURRENT_REQUESTS_PER_DOMAIN = 2     # varsayım: hedef başına tavan
DOWNLOAD_DELAY = 1.0                   # aynı hedefe ardışık istekler arası taban bekleme

AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 2.0
AUTOTHROTTLE_MAX_DELAY = 60.0
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0

RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]   # 403 bilerek listede yok
DOWNLOAD_TIMEOUT = 30

DOWNLOADER_MIDDLEWARES = {
    "proje.middlewares.HedefeGoreProxy": 350,  # yerleşik proxy katmanından (750) önce çalışır
}

# middlewares.py
from scrapy.utils.httpobj import urlparse_cached

# Her ürünün bağlantı bilgisi kendi panelinden alınır.
HEDEF_URUN = {
    "katalog.example": "http://KULLANICI:ŞİFRE@GATEWAY:PORT",    # IPv4 Datacenter
    "bolgesel.example": "http://KULLANICI:ŞİFRE@GATEWAY:PORT",   # IPv4 Residential, ülke sabit
}


class HedefeGoreProxy:
    def process_request(self, request, spider):
        if "proxy" in request.meta:
            return None
        proxy = HEDEF_URUN.get(urlparse_cached(request).hostname)
        if proxy:
            request.meta["proxy"] = proxy
        return None

Bu yapıda bir hedefi datacenter’dan residential’a taşımak tek satırlık bir değişikliktir ve diğer hedefleri etkilemez; senaryo bölümünde bunun maliyete etkisi görülecek. Tabloda olmayan bir alan adına giden istek proxy kullanmadan çıkar; bunu istemiyorsanız varsayılan bir ürün tanımlayın ya da tanımsız hedefe giden isteği reddedin. AutoThrottle yanıt sürelerine bakarak beklemeyi kendisi ayarlar ve hedef başına tavanla birlikte hızın hedefe göre şekillenmesini sağlar.

Yerleşik yeniden deneme ara katmanının Retry-After başlığını dikkate alıp almadığını kullandığınız Scrapy sürümünün dokümantasyonundan doğrulayın; 429’un sık görüldüğü hedeflerde bu başlığı okuyan küçük bir ara katman eklemek ya da hedef başına tavanı düşürmek gerekebilir. RETRY_HTTP_CODES listesinde 403’ün olmaması bilinçlidir ve listeye eklenmemelidir. Ayrıca ayrıştırma aşamasında beklenen alan yoksa öğeyi üretmek yerine uyarı kaydı bırakın; böylece yumuşak engeller veri setine değil günlüğe düşer.

GB mi port mu: faturalama modelini iş yüküne göre seçmek

RotatingProxy kataloğunda iki faturalama modeli var ve ikisi farklı şeyleri ölçer. GB modeli aktardığınız veriyi sayar; işin ne kadar sürdüğü önemli değildir ve IPv4 paketlerinde süre sınırı olmadığı için kullanılmayan kota bir sonraki taramaya kalır. Port modeli ise zamanı ve kanalı sayar: katalogda paketler GB yerine port ve aylık süreyle fiyatlanır, port sayısı eşzamanlı kanal kapasitesini belirler. Port başına bir trafik koşulu olup olmadığını sipariş adımında ve panelde kontrol edin; aşağıdaki karşılaştırmalar trafik sınırı olmadığını varsayar. Scraping iş yükleri doğaları gereği bu iki modelden birine daha yakındır.

Katalog fiyatlarından türetilen birim maliyetler (USD)
ÜrünFaturalamaGiriş paketiOrta kademeEn büyük paketBirim maliyet aralığı
IPv4 DatacenterGB, süre sınırı yok2 GB, 1 USD100 GB, 60 USD1.000 GB, 500 USDGB başına 0,50 ile 0,60 arası
IPv4 ResidentialGB, süre sınırı yok2 GB, 2,5 USD100 GB, 120 USD1.000 GB, 900 USDGB başına 0,90 ile 1,25 arası
MobileGB, süre sınırı yok2 GB, 4 USD100 GB, 225 USD1.000 GB, 2.100 USDGB başına 2,00 ile 2,50 arası
IPv6 DatacenterPort, aylık1 port, 29 USD5 port, 80 USD10 port, 175 USDPort başına aylık 16 ile 29 arası
IPv6 ResidentialPort, aylık1 port, 29 USD5 port, 80 USD10 port, 175 USDPort başına aylık 16 ile 29 arası

Tablodan iki pratik sonuç çıkar. Birincisi, GB modelinde ürünler arasındaki fark paketler arasındaki farktan büyüktür: 100 GB kademesinde Residential, Datacenter’ın iki katı; Mobile ise 3,75 katıdır. Doğru ürünü seçmek, aynı ürünün daha büyük paketini almaktan daha fazla tasarruf sağlar. İkincisi, port modelinde 5 portluk paket port başına en düşük fiyatı verir (aylık 16 dolar); 10 portluk paket port başına 17,5 dolara gelir. On kanala ihtiyacınız varsa iki adet 5 portluk paket ile tek bir 10 portluk paket arasındaki fiyat ve yönetim farkını sipariş adımında karşılaştırın.

Hangi modelin ucuz olduğunu aylık trafik belirler; aşağıdaki başabaş hesapları port paketinde trafik sınırı olmadığı varsayımına dayanır. 5 portluk IPv6 Datacenter paketi aylık 80 dolardır; bu tutar IPv4 Datacenter’ın GB başına 0,60 dolarlık fiyatıyla yaklaşık 133 GB’a karşılık gelir. Yani IPv6 üzerinden erişilebilen bir hedefte aylık trafiğiniz düzenli olarak bu düzeyin üzerindeyse ve 5 portun kanal kapasitesi işinize yetiyorsa port modeli öne geçer. Karşılaştırmayı residential tarafında yaparsanız eşik düşer: 80 dolar, GB başına 1,20 dolarla yaklaşık 67 GB eder. Trafik düzensizse, örneğin ayda bir yapılan büyük bir tarama söz konusuysa, süre sınırı olmayan GB paketleri boşta geçen haftalar için ödeme yapmamanızı sağlar.

Senaryo: üç hedef grubu, üç ürün ve aylık bütçe

Bir pazar araştırma ekibinin aylık veri toplama planını düşünelim. Ekip üç grup hedeften yalnız kamuya açık sayfaları topluyor ve her grup keşif adımlarında farklı bir profil çıkardı. Grup A, datacenter trafiğine tepki vermeyen teknik doküman ve ürün kataloğu siteleri. Grup B, Almanya ve Türkiye ziyaretçilerine farklı içerik gösteren ve datacenter çıkışta eksik veri veren bölgesel siteler. Grup C, IPv6 üzerinden aynı içeriği veren ve gün boyu sürekli izlenen tek bir büyük hedef. Sayfa sayıları, yanıt boyutları ve yeniden deneme payları tamamen varsayımdır; hesapta 1 GB = 1.000.000 KB alınmıştır. Fiyatlar RotatingProxy kataloğundandır.

Senaryo: varsayımlar ve katalog fiyatlarıyla aylık hesap
KalemGrup A: toleranslı kataloglarGrup B: iki ülkede bölgesel içerikGrup C: IPv6 erişilebilir sürekli hedef
Aylık sayfa (varsayım)400.00060.000 (ülke başına 30.000)2.000.000
Ortalama yanıt boyutu (varsayım)90 KB300 KB70 KB
Ham trafik36 GB18 GB140 GB
Yeniden deneme payı (varsayım)%10, toplam 39,6 GB%15, toplam 20,7 GB%5, toplam 147 GB
ÜrünIPv4 DatacenterIPv4 Residential, Almanya ve TürkiyeIPv6 Datacenter
Paket50 GB20 GB + 10 GB5 port, aylık
Aylık tutar30 USD24 + 12 = 36 USD80 USD
NotArtan yaklaşık 10,4 GB sonraki aya kalırArtan yaklaşık 9,3 GB sonraki aya kalırGB modeliyle 100 GB + 50 GB = 90 USD olurdu; port paketinde trafik sınırı olmadığı varsayılmıştır, sipariş adımında doğrulayın

Grup C için kapasiteyi de kontrol edelim. Ayda 2 milyon istek, 30 günlük bir ayda saniyede ortalama 0,77 isteğe denk gelir. Ortalama yanıt süresi 2 saniye ise (varsayım) bu hız yaklaşık 2 eşzamanlı istekle karşılanır. 5 portun bu yükü taşıyıp taşımadığını port başına bağlantı koşulunu panelde okuyarak doğrulayın; yük gün içinde eşit dağılmıyorsa hesabı ortalamaya göre değil en yoğun saate göre yapın.

Karma planın aylık toplamı 30 + 36 + 80 = 146 USD’dir. Aynı 207,3 GB’lık trafiğin tamamı IPv4 Residential’a verilseydi 200 GB ve 10 GB paketlerle 240 + 12 = 252 USD ödenecekti. Hedef bazında ürün seçimi bu senaryoda aylık 106 USD, yani yaklaşık yüzde 42 tasarruf sağlıyor. Fark ürünlerin kalitesinden değil, her hedefe yetecek kadar ürün verilmesinden geliyor; bütün trafiği tek bir ürüne zorlamak ya bu farkı ödemek ya da Grup B’de eksik veri kabul etmek demektir.

Plan canlıda değişecektir ve hedef bazında yapı bu değişikliği ucuzlatır. Grup A’daki dört hedeften birinde (varsayım: trafiğin dörtte biri) datacenter çıkışta eksik veri görülmeye başlarsa ve koşullar izin veriyorsa yalnız o hedefi residential’a taşımak yeterlidir. Bu yaklaşık 9,9 GB residential’da 11,88 USD, datacenter’da 5,94 USD tutar; fark aylık 6 USD civarındadır. Bütün grubu taşımak ise 39,6 GB için 47,52 USD’ye mal olur ve sorunu olmayan üç hedefin maliyetini de ikiye katlar. Grup C’nin hedefi IPv6 üzerinden içerik vermeyi bırakırsa port paketini bir sonraki dönemde yenilemeyip trafiği IPv4 Datacenter’a döndürürsünüz; tablodaki karşılaştırmaya göre bu aylık yaklaşık 10 USD fark demektir.

Hukuki çerçeve: robots.txt, kullanım koşulları ve kişisel veri

Teknik olarak erişilebilen her veri toplanabilir veri değildir. Hukuki çerçeve ülkeden ülkeye değişir ve bu bölüm hukuki danışmanlığın yerine geçmez; ancak meşru bir scraping projesinin üzerinde durduğu birkaç sabit nokta vardır. Bunları proje başında yazılı hâle getirmek, ileride bir site sahibinden ya da müşteriden gelen soruya hazırlıklı olmanızı sağlar.

  • robots.txt: Robots Exclusion Protocol, RFC 9309 ile standartlaştırılmıştır. Dosya bir erişim yetkilendirme mekanizması değil, site sahibinin tarayıcılardan beklentisini bildiren bir metindir; ona uymak meşruiyetin ilk göstergesidir. Crawl-delay gibi yönergeler standardın parçası değildir, ama site sahibinin hız beklentisini gösterdiği için dikkate alınmalıdır.
  • Kullanım koşulları: Pek çok site otomatik erişimi koşullarında sınırlar ya da yasaklar. Koşulları kabul ettiğiniz bir hesapla giriş yapıp veri toplamak, kamuya açık bir sayfayı ziyaret etmekten farklı bir hukuki durum yaratır.
  • Kişisel veri: Türkiye’de 6698 sayılı Kişisel Verilerin Korunması Kanunu, AB’deki hedeflerde ise GDPR kişisel verilerin işlenmesini düzenler. Ad, e-posta, telefon, kullanıcı adı veya profil bilgisi gibi alanlara ihtiyacınız yoksa toplamayın; gerekiyorsa hukuki dayanağı, saklama süresini ve silme sürecini önceden belirleyin.
  • Fikri haklar: Metinler, görseller ve derlenmiş veri tabanları telif ve veri tabanı haklarıyla korunabilir. Fiyat, stok durumu veya teknik özellik gibi olgusal veriyi toplamak ile içeriği olduğu gibi yeniden yayımlamak aynı risk düzeyinde değildir.
  • Teknik önlemler: CAPTCHA, giriş duvarı veya bot korumasını aşmak, sistem sahibinin açıkça koyduğu bir sınırı ihlal etmektir ve duruma göre yetkisiz erişim boyutuna varabilir; Türk Ceza Kanunu bilişim sistemine hukuka aykırı girmeyi suç olarak düzenler.
  • Kendinizi tanıtın: User-Agent başlığında toplayıcınızın adını ve size ulaşılabilecek bir iletişim bilgisini verin. Site sahibi bir sorun gördüğünde sizi doğrudan engellemek yerine size yazabilir.

Hata → neden → çözüm: rotasyonlu toplamada sık görülen sorunlar

Aşağıdaki sorunlar genel bağlantı hatalarından çok rotasyonun kendisinden ya da ürün ile hedef arasındaki uyumsuzluktan doğar. Önce belirtiyi bulun, nedeni küçük bir testle doğrulayın, sonra çözümü uygulayın. Birden fazla ayarı aynı anda değiştirmek, hangisinin işe yaradığını gizler ve bir sonraki sorunda aynı belirsizliği yeniden yaşatır.

Rotasyonlu scraping’de belirti, olası neden ve çözüm
BelirtiOlası nedenÇözüm
Sayfalandırmada ikinci sayfadan sonra liste boş geliyor ya da başa dönüyorDurumlu akış istek başına rotasyonla çalışıyor; imleç veya çerez yeni adreste geçersiz kalıyorAkışı tek iş birimi sayıp oturum bazlı rotasyona alın, akış bitince oturumu kapatın
Aynı kayıt farklı para birimi veya dille geliyorÜlke seçimi sabitlenmemiş, havuz farklı ülkelerden adres veriyorÜlkeyi panelde veya bağlantı ayarında sabitleyin, ülkeyi kayda ayrı bir alan olarak yazın
İstek başına rotasyon seçili ama çıkış adresi değişmiyorİstemci aynı bağlantıyı yeniden kullanıyor (keep-alive, bağlantı havuzu)İş birimi başına yeni bağlantı açın ya da bağlantı havuzunu buna göre ayarlayın; curl testiyle doğrulayın
Bütün isteklerde 407Kullanıcı adı veya şifre hatalı, şifre değişmiş ya da IP whitelist’te sunucunun adresi yokBilgileri panelden yeniden alın, whitelist kullanıyorsanız sunucunun güncel çıkış adresini ekleyin, yeniden denemeyi durdurun
SOCKS5 ayarında bağlantı hemen kopuyorİstemci HTTP proxy bekliyor ya da protokol ile uç nokta karışmışProtokolü ve uç noktayı eşleştirin; alan adının proxy tarafında çözülmesini istiyorsanız socks5h kullanın
IPv6 üründe bağlantı kuruluyor ama hedefe ulaşılamıyorHedefin AAAA kaydı yok ya da istemci alan adını kendi tarafında çözüp IPv4 adresi gönderiyor (düz socks5 kullanımı)AAAA kaydını kontrol edin, SOCKS5’te socks5h kullanın; hedef IPv6 desteklemiyorsa IPv4 ürüne taşıyın
IPv6 çıkışta yanıt geliyor ama içerik IPv4’tekinden farklıHedef IPv6 ziyaretçilere farklı ya da eksik içerik sunuyorKeşifteki adres ailesi karşılaştırmasını tekrarlayın, içerik eşit değilse hedefi IPv4 ürüne taşıyın
Kota beklenenden hızlı bitiyorSınırsız yeniden deneme, görsel ve betik indirme, sıkıştırmanın kapalı olmasıYeniden deneme bütçesi koyun, yalnız gereken içeriği isteyin, sıkıştırmayı açın, bayt sayacını hedef bazında izleyin
200 yanıtlar boş kayıt üretiyorYumuşak engel ya da içeriğin tarayıcıda betikle oluşmasıBeklenen alan kontrolü ekleyin; doğrulama sayfasıysa hızı düşürün, içerik betikle geliyorsa sitenin sunduğu veri kaynağını ve koşullarını inceleyin
Mobile üründe zaman aşımları sıkTaşıyıcı ağlarda gecikme daha değişken olabilirZaman aşımını hedefe göre uzatın, eşzamanlılığı düşürün; mobil fark gerekmiyorsa residential’a dönün

Tablodaki sorunların çoğu canlıda değil, pilotta yakalanabilir. Pilot sırasında her hedef için durum kodu dağılımını, beklenen alan oranını ve bayt tüketimini ayrı ayrı kaydederseniz bu belirtilerin hangisinin hangi hedefte ortaya çıktığını ilk günden görürsünüz. Toplam başarı oranına bakmak sorunu gizler: dokuz sorunsuz hedef, onuncu hedefteki tamamen boş verinin üzerini örtebilir.

Canlıya almadan önce gözden geçirme listesi

  • Her hedef için keşif kaydı var: robots.txt ve koşullar okundu; durum ihtiyacı, adres ailesi, coğrafi fark ve ağ toleransı yazıldı.
  • Hedef ile ürün eşleşmesi yapılandırmada hedef bazında tanımlı; bütün trafik tek ürüne zorlanmıyor ve tanımsız hedefe ne olacağı belli.
  • Her akışın iş birimi belirlendi; durumlu akışlar oturum bazlı, durumsuz istekler istek başına rotasyonla çalışıyor.
  • Ülkeye duyarlı hedeflerde ülke sabit ve kayıtlarda ülke alanı tutuluyor.
  • Hedef başına ve toplam eşzamanlılık tavanı kademeli artışla bulundu; port bazlı üründe toplam tavan port kapasitesinin altında.
  • Yeniden deneme yalnız 429, 5xx ve ağ hatalarında yapılıyor; 403, 404 ve 407 tekrar edilmiyor; Retry-After dikkate alınıyor.
  • Yeniden deneme bütçesi ve hedef başına devre kesici tanımlı; eşik aşıldığında ekibe uyarı gidiyor.
  • Beklenen alan kontrolü var; boş ya da doğrulama sayfası olan 200 yanıtlar veri setine girmiyor.
  • GB tüketimi hedef bazında izleniyor; aylık tahmin ile gerçekleşen arasındaki fark düzenli olarak gözden geçiriliyor.
  • Kişisel veri alanları toplanmıyor ya da hukuki dayanak, saklama süresi ve silme süreci belirlenmiş.
  • User-Agent toplayıcının adını ve iletişim bilgisini taşıyor; site sahibinden gelen bir talebe kimin yanıt vereceği belli.

Listenin amacı işi yavaşlatmak değil, sorunları canlıda değil pilotta yakalamaktır. Maddelerin çoğu bir kez kurulur ve sonra kendiliğinden çalışır: hedef tablosu, hata sınıflandırması, devre kesici ve bayt sayacı yerinde olduğunda yeni bir hedef eklemek, keşif adımlarını uygulayıp tabloya bir satır eklemekten ibarettir. Ürün değiştirme kararı da aynı kayıtlardan çıkar; tahminle değil, hedef bazında ölçülen hata oranı ve GB tüketimiyle verilir.

İlgili rehberler

Doğru rotasyonu seçin

Ürünleri karşılaştırın, küçük bir paketle deneyin ve ölçtükten sonra ölçekleyin.