← Bloga geri dön

CV Veri Setleri için Görüntü Parselleme: Ne Kadar Trafiğe İhtiyacınız Var ve Hangi Proxy'leri Seçmelisiniz

CV modelleri için binlerce görüntü toplamak üzere gerçekçi trafik miktarını, hangi proxy'lerin kullanılacağını ve engellenmeyen bir parser yazma yöntemlerini inceliyoruz.

📅1 Kasım 2026

Bilgisayarla görme modeli eğitimi için binlerce görüntü toplamak, genellikle iki sorunla karşılaşan bir görevdir: veri kaynağından (Google Görseller, Pinterest, pazar yerleri, stok siteleri) gelen engellemeler ve beklenmedik yüksek trafik tüketimi. Bir IP hızla yasaklanır ve proxy trafiği için fatura, veri setinin etiketlenmesinin maliyetini aşabilir. Bu yazıda, engellemeler nedeniyle veri kaybı yaşamayan bir görüntü ayrıştırıcısının nasıl tasarlanacağını ve trafik bütçesinin nasıl hesaplanacağını inceleyeceğiz.

CV için görüntü toplarken neden proxy kullanmalıyız

Bilgisayarla görme için veri setleri genellikle tek bir kaynaktan toplanmaz. Genellikle bu, görüntü arama sonuçları, pazar yerlerinde ürün kartları, stok fotoğraflar, sosyal medya ve açık API'lerin bir kombinasyonudur. Bu kaynakların neredeyse tamamı, bir IP'den gelen istek sayısına sınırlamalar getirir: Google Görseller, ardışık birkaç yüz istekten sonra CAPTCHA gösterirken, Pinterest API'ye geçici olarak erişimi engeller ve Wildberries ile Ozon, şüpheli etkinlik durumunda boş kartlar verir veya kontrol sayfasına yönlendirir.

Proxy olmadan, bir adresten günde birkaç yüz veya binlerce görüntü toplama sınırına ulaşırsınız. Eğer 50.000–500.000 görüntüden oluşan bir veri setine ihtiyacınız varsa (bu, genellikle sınıflandırma ve tespit görevlerinde konvolüsyonel ağlar ve transformerlar için gereken miktardır), dağıtılmış bir IP havuzu olmadan bunu makul bir sürede toplamak fiziksel olarak mümkün değildir — ya sürekli engellerle karşılaşacaksınız ya da günün saatine ve coğrafi konuma bağlı olarak oldukça kaydırılmış bir örneklem elde edeceksiniz.

İkinci neden, verilerin coğrafi çeşitliliğidir. Model, nesneleri çekim bölgesinden bağımsız olarak eşit derecede iyi tanımalıdır (örneğin, farklı ülkelerdeki trafik işaretleri veya yerel pazar yerlerindeki ürünler), bu nedenle ayrıştırıcının farklı ülkelerden IP'lerle bağlanması gerekir. Tek bir veri merkezi ile tek bir çıkış IP'si bu çeşitliliği sağlamaz.

Veri seti için gerçek trafik ne kadar

Görüntü toplarken trafik tüketimi genellikle göz ardı edilir. Sorun, yalnızca resimlerin boyutunda değil — HTML sayfaları, JS paketleri, önizlemeler, izleme pikselleri ve CSS de proxy üzerinden geçer, eğer ayrıştırıcı gerekli URL'ler için özel olarak ayarlanmamışsa.

İçerik Türü Ortalama Boyut 10.000 adet için Trafik
Önizleme/thumbnail (150–300 px) 15–40 KB ~250 MB
Orta çözünürlüklü fotoğraf (800–1200 px) 80–200 KB ~1,4 GB
Yüksek çözünürlüklü fotoğraf (2000+ px) 400 KB – 1,5 MB ~9,5 GB
Ürün kartı HTML sayfası (resimsiz) 150–400 KB ~2,7 GB

Pratikte, eğer 100.000 orta çözünürlüklü görüntü topluyorsanız ve ürün kartlarıyla birlikte (etiketleme için — kategoriler, kutular, özellikler) toplam trafik tüketimi genellikle 25–45 GB aralığında kalır. Küçük nesnelerin tespiti için yüksek çözünürlüklü görüntülere ihtiyaç varsa — aynı 100.000 parça için 80–150 GB hesaplayın. Bu rakamları proxy tarifinizi seçerken önceden dikkate almak önemlidir, sonradan değil.

Datacenter, residential ve mobile: hangisini seçmeli

Görüntü toplarken üç parametre önemlidir: hız, trafik maliyeti ve engellemelere karşı dayanıklılık. Bu parametreler, farklı proxy türleri arasında büyük farklılıklar gösterir.

Parametre Datacenter Residential Mobile
Hız Yüksek Orta Düşük-orta
Engellemelere karşı dayanıklılık Düşük Yüksek Çok yüksek
Trafik maliyeti Düşük Orta-yüksek Yüksek
Uygun olduğu yerler Açık API'ler, sıkı koruma olmayan stoklar Google Görseller, Pinterest, pazar yerleri Sert anti-bot koruması olan sosyal medya

Çoğu görüntü toplama görevi için en iyi dengeyi residential proxy'ler sağlar — IP'ler normal kullanıcılar gibi görünür, bu nedenle pazar yerleri ve görüntü arama motorlarının anti-bot sistemleri daha nadir CAPTCHA tetikler. Eğer kaynak, açık bir stok fotoğraf veya sıkı limitleri olmayan bir API ise, daha hızlı ve GB başına daha düşük fiyatla büyük trafik hacimlerini geçirebilen datacenter proxy'leri kullanmak daha ucuzdur. Mobil uygulamalardan veya gelişmiş anti-bot koruması olan sosyal medyadan görüntü toplamak için en iyi seçenek mobil proxy'lerdir — bunlar gerçek telefon operatörlerinin IP'lerini kullanır ve neredeyse hiç engellenmez.

Proxy döngüsü ile requests üzerinde temel ayrıştırıcı

Başlamak için, her istek için veya belirli bir istek sayısından sonra proxy döngüsü ile basit bir senkron script yeterlidir. Aşağıda, içerik türünü kontrol eden ve dosya boyutunu sınırlayan bir URL listesi üzerinden görüntü indirme örneği verilmiştir, böylece yanlışlıkla yanlış formatta ağır bir dosya indirilmez.

import requests
import itertools
import hashlib
import os

PROXIES = [
    "http://user:[email protected]:10000",
    "http://user:[email protected]:10000",
    "http://user:[email protected]:10000",
]
proxy_cycle = itertools.cycle(PROXIES)

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    "Accept": "image/avif,image/webp,image/*,*/*;q=0.8",
}

def download_image(url, save_dir="dataset", max_size_mb=10, timeout=15):
    proxy = next(proxy_cycle)
    proxies = {"http": proxy, "https": proxy}
    try:
        resp = requests.get(url, headers=HEADERS, proxies=proxies, timeout=timeout, stream=True)
        resp.raise_for_status()

        content_type = resp.headers.get("Content-Type", "")
        if "image" not in content_type:
            return None

        content_length = int(resp.headers.get("Content-Length", 0))
        if content_length > max_size_mb * 1024 * 1024:
            return None

        file_hash = hashlib.md5(url.encode()).hexdigest()
        ext = content_type.split("/")[-1].split(";")[0]
        filepath = os.path.join(save_dir, f"{file_hash}.{ext}")

        os.makedirs(save_dir, exist_ok=True)
        with open(filepath, "wb") as f:
            for chunk in resp.iter_content(chunk_size=8192):
                f.write(chunk)

        return filepath
    except requests.exceptions.RequestException as e:
        print(f"{url} üzerinden {proxy} ile hata: {e}")
        return None

Anahtar nokta, yanıt gövdesini indirmeden önce Content-Length kontrolüdür. Bu, aşırı ağır dosyaları tam yüklemeden önce ayıklayarak trafiği tasarruf ettirir. Proxy döngüsü itertools.cycle ile IP'ler arasında yükü eşit şekilde dağıtarak belirli bir adresin yasaklanma riskini azaltır.

aiohttp ile asenkron toplama

requests üzerinde senkron bir script birkaç bin görüntü için iyi bir seçimdir, ancak 50.000 dosyadan fazla veri setleri için asenkronluk gereklidir — aksi takdirde toplama günler sürecektir. aiohttp, eşzamanlılık sınırlaması için bir semafor ile birlikte, proxy havuzunu aşırı yüklemeden on binlerce eşzamanlı görev için çalışan bir seçenektir.

import asyncio
import aiohttp
import itertools

PROXIES = [
    "http://user:[email protected]:10000",
    "http://user:[email protected]:10000",
]
proxy_cycle = itertools.cycle(PROXIES)
sem = asyncio.Semaphore(50)  # eşzamanlı istek sınırı

async def fetch_image(session, url, idx):
    proxy = next(proxy_cycle)
    async with sem:
        try:
            async with session.get(url, proxy=proxy, timeout=15) as resp:
                if resp.status != 200:
                    return
                content_type = resp.headers.get("Content-Type", "")
                if "image" not in content_type:
                    return
                data = await resp.read()
                with open(f"dataset/{idx}.jpg", "wb") as f:
                    f.write(data)
        except Exception as e:
            print(f"{url} üzerinde hata: {e}")

async def main(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_image(session, url, i) for i, url in enumerate(urls)]
        await asyncio.gather(*tasks)

# asyncio.run(main(url_list))

50 eşzamanlı bağlantı için semafor — başlangıç noktasıdır. Eğer residential proxy'ler hata 429 ve zaman aşımı olmadan yükü kaldırıyorsa, 100–150'ye kadar yavaşça artırabilirsiniz. Anahtar, başarısız isteklerin yüzdesini izlemektir: eğer %5–7'nin üzerine çıkıyorsa, eşzamanlılığı azaltmak daha iyidir, proxy havuzunu sonsuz bir şekilde artırmak yerine.

Scrapy + proxy middleware ile ölçeklenebilir toplama

Üretim ortamında veri setleri toplamak için yerleşik bir kuyruk, yeniden denemeler ve URL'lerin deduplikasyonu ile Scrapy kullanmak daha uygundur. Bu, görüntüleri otomatik olarak indirir, geçerliliklerini PIL ile kontrol eder ve farklı boyutlarda önizlemeler oluşturabilir.

# settings.py
ITEM_PIPELINES = {
    'scrapy.pipelines.images.ImagesPipeline': 1,
}
IMAGES_STORE = 'dataset_images'
IMAGES_MIN_HEIGHT = 200
IMAGES_MIN_WIDTH = 200

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.ProxyRotationMiddleware': 350,
}

CONCURRENT_REQUESTS = 32
DOWNLOAD_DELAY = 0.5
RETRY_TIMES = 3
# middlewares.py
import random

class ProxyRotationMiddleware:
    PROXIES = [
        "http://user:[email protected]:10000",
        "http://user:[email protected]:10000",
        "http://user:[email protected]:10000",
    ]

    def process_request(self, request, spider):
        request.meta['proxy'] = random.choice(self.PROXIES)

IMAGES_MIN_HEIGHT ve IMAGES_MIN_WIDTH parametreleri, veri setini kirleten ve trafiği gereksiz yere harcayan küçük simgeleri ve sprite'ları otomatik olarak ayıklar. DOWNLOAD_DELAY 0.5 saniye, bir proxy üzerinden isteklerin sıklığını azaltarak, Pinterest gibi sıkı anti-fraud izleme kaynaklarında CAPTCHA oranını düşürür.

Trafik tüketimini nasıl azaltırız

Proxy üzerinden trafik genellikle hacme göre ücretlendirilir, bu nedenle herhangi bir optimizasyon doğrudan bütçeyi tasarruf ettirir. İşte etkili yöntemler:

  • Özgün yerine önizleme isteyin, eğer eğitim için 512–1024 px çözünürlüğü yeterliyse — çoğu kaynak, gerekli boyuttaki görüntüyü ayrı bir URL veya sorgu parametresi ile verir.
  • Gövde indirilmeden önce Content-Length ile filtreleyin — HEAD isteği veya akış GET başlıklarını okumak, aşırı ağır dosyaları yükleme trafiği harcamadan ayıklamanıza olanak tanır.
  • İlgili kaynakların indirilmesini devre dışı bırakın, eğer ayrıştırıcı headless tarayıcı ile çalışıyorsa: CSS, fontlar ve izleme scriptlerini engelleyerek yalnızca HTML ve gerekli görüntüleri bırakın.
  • URL'leri istekte bulunmadan önce deduplikasyon yapın, indirdikten sonra değil — ürün kartlarındaki (örneğin, Wildberries'de) aynı görüntüleri tekrar indirmeye gerek yoktur.
  • Yanıtların yerel önbelleğini kullanın ayrıştırıcıyı hata ayıklama sırasında tekrar çalıştırırken, her test kodu çalıştırmasında proxy üzerinden trafik geçirmemek için.

Sık karşılaşılan hatalar, 403 ve rate limit

Büyük hacimlerde görüntü toplarken, ayrıştırıcı kaçınılmaz olarak 403, 429 yanıtları ve kontrol sayfalarına geçici yönlendirmelerle karşılaşacaktır. Bu kodların doğru işlenmesi, hem trafiği hem de proxy havuzunu tasarruf ettirir.

Kod/Belirti Sebep Ne yapmalı
403 Yasaklı IP kaynak tarafından kara listeye alındı Proxy döngüsü, User-Agent değiştirin
429 Çok Fazla İstek Dakikada istek limiti aşıldı DOWNLOAD_DELAY'yi artırın, eşzamanlılığı azaltın
CAPTCHA yönlendirmesi Davranış analizi botu şüphelendi Residential/mobil IP'lere geçin
Boş Content-Length Chunked yanıt veya resim yerine taklit İndirilen baytların gerçek boyutunu kontrol edin

Her proxy için başarılı isteklerin oranını ayrı olarak günlüğe kaydetmek önemlidir. Eğer belirli bir IP, diğerlerinden daha sık 403 hatası veriyorsa — onu otomatik olarak döngüden çıkarın, tüm havuzun genel blok istatistiklerini etkilemesini beklemeden.

Proxy trafiği için bütçe hesaplaması

Toplama işlemine başlamadan önce, trafik hacmini önceden tahmin etmek faydalıdır, sonradan hesaplamak yerine. Formül basit: görüntü sayısı × dosya ortalama boyutu × dolaylı maliyet katsayısı (HTML, başlıklar, hata nedeniyle tekrar istekler — genellikle 1.3–1.6).

Orta çözünürlüklü (~150 KB) 200.000 görüntü için veri seti hesaplaması örneği: 200.000 × 150 KB = 30 GB temiz görüntü ağırlığı. HTML sayfaları ve geçici engellemeler nedeniyle tekrar istekler (katsayı 1.5) göz önüne alındığında, toplam tüketim — yaklaşık 45 GB. Eğer bazı kaynaklar, anti-bot koruması nedeniyle mobil IP'ler gerektiriyorsa, bunu proxy havuzuna ayrı olarak eklemelisiniz, çünkü mobil IP'lerdeki trafik genellikle residential veya datacenter'dan daha pahalıdır.

İyi bir uygulama, 1.000–2.000 görüntüden oluşan bir pilot parti toplamak, gerçek trafik tüketimini ve hata yüzdesini ölçmek ve ardından planlanan veri seti hacmine ekstrapolasyonda bulunmaktır. Bu, belirli bir kaynağın özelliklerini dikkate alarak, teorik hesaplamalardan daha doğrudur.

Sonuç

Bilgisayarla görme modellerinin eğitimi için görüntü toplamak, veri mühendisliği ve ağ altyapısının doğru yönetimi arasında bir görevdir. Doğru ayrıştırıcı mimarisi (asenkronluk, Content-Length ile filtreleme, URL deduplikasyonu) trafik tasarrufu sağlar, iyi bir proxy seçimi ise gerekli veri seti hacmini günler içinde mi yoksa sürekli engellemelerle haftalar içinde mi toplayacağınızı belirler.

Eğer veri kaynakları gelişmiş anti-bot koruması kullanıyorsa — görüntü arama motorları, pazar yerleri, sosyal medya — residential proxy'lerle başlayın: bunlar, yasaklara karşı dayanıklılık ve trafik maliyeti arasında en iyi dengeyi sağlar. Açık API'ler ve sıkı limitleri olmayan stoklar için datacenter proxy'leri ile tasarruf etmek mantıklıdır, en korunaklı mobil uygulamalar için ise mobil proxy'leri kullanarak toplamanın en zor kısmını gerçekleştirin.