Bloga geri dön

Parsersız Boş Alanlar: Proxy İle İlgisi Yok, Tasarım Kaymasını Düzeltme Yöntemleri

Parsers boş döndü, proxy değiştiriyorsunuz - ama sorun site tasarımındaydı. Beş dakikada ban ile tasarım kayması arasındaki farkı nasıl ayırt edeceğimizi, Scrapling'in adaptif seçicilerinin nasıl çalıştığını (SQLite'da öğe izi ve benzerlik araması 2,46 ms içinde) ve neden referansın verileri topladığınız aynı coğrafyadan alınması gerektiğini inceleyelim.

📅5 Eylül 2026
Parsersız Boş Alanlar: Proxy İle İlgisi Yok, Tasarım Kaymasını Düzeltme Yöntemleri

Parsers altı aydır çalışıyordu, ancak bugün veritabanına boş satırlar girdi. İlk düşünce - yasaklandık, proxy değiştirmeliyiz. Havuzunuzu değiştiriyorsunuz, IP kalitesini artırıyorsunuz, veri merkezi yerine konut IP'leri için ödeme yapıyorsunuz - ama alanlar yine de boş. Çünkü sorun engellemede değil: site yeni bir tasarıma geçti ve CSS seçiciniz artık hiçbir şeye yapışmıyor.

Bu en pahalı arıza türüdür çünkü sessizdir. Yasak hemen görünür: 403, CAPTCHA, yönlendirme. Tasarım kayması hiçbir şeyi düşürmez - HTTP 200, sayfa alındı, trafik ödendi, ama çıkışta None. Birbirinden ayırmayı ve her yeniden tasarımdan sonra seçicileri manuel olarak yeniden yazmayı nasıl bırakacağınızı beş dakikada inceleyelim.

Bunun kimlere ihtiyacı var

Bir parser'ı bir sprintten daha uzun süre canlı tutanlar için bir kılavuz: rakip fiyatlarının izlenmesi, yorumların toplanması, iş ilanlarının bir araya getirilmesi, günlük analiz verileri. Eğer bir script'i bir kez çalıştırıp atıyorsanız - tasarım kayması sizi ilgilendirmiyor. Eğer script aylarca cron ile çalışıyorsa, bu sizin destek için ana gider kaleminizdir.

Problemin ölçeği uydurma değil. GroupBWT analistlerine göre, yönetilmeyen yapısal değişiklikler, büyük projelerde scraper'ların destek maliyetlerinin yaklaşık %40–60'ını oluşturuyor. Belirli sektörlerde %10–15'lik bir kısım haftada bir onarım gerektiriyor - DOM kaymaları, parmak izi ve uç noktaların throttling'i nedeniyle. Yani, seçicilerin onarımı, anti-bot geçişi ile maliyet açısından rekabet ediyor, ancak ona ayrılan dikkat kat kat daha az.

Arka planda durum pek iç açıcı değil: Apify'nin "Web Scraping Durumu 2026" raporuna göre, %65,8 katılımcı proxy kullanımını artırdı, %58,3 proxy maliyetlerinde yıllık artış bildirdi ve %62'den fazlası, esasen botlara karşı artan koruma nedeniyle genel altyapı maliyetlerinde artış yaşadı. Bu bağlamda, ödediğiniz trafiği, hiçbir şey elde edemediğiniz sayfalara harcamak - iki kat üzücü.

Adım 1. Yasak ile tasarım kaymasını ayırt etmek

Tanı koyma birkaç dakika alır ve kesinlikle sırayla yapılmalıdır - aksi takdirde yanlış arızayı "onarabilirsiniz".

  1. Cevap koduna ve gövde boyutuna bakın. 403, 429, 503, kontrol sayfasına yönlendirme veya 2–5 KB'lık bir gövde - bu anti-bot. HTTP 200 ve 200–800 KB'lık tam sayfa - site sizi kabul etti, sorun proxy'de değil.
  2. Ham HTML'yi diske kaydedin ve gözlerinizle açın. Hata ayıklayıcıda değil, tarayıcıda. Eğer ürün/yorum/fiyat yerindeyse ama parser onları göremiyorsa - bu tasarım kaymasıdır.
  3. Dosya içinde arama yaparak gerekli metni bulun. HTML'de var ama seçicinizle erişilemiyor - işaretleme değişti. Hiç yoksa - içerik bir script ile yükleniyor, bir tarayıcı motoruna ihtiyacınız var, HTTP isteğine değil.
  4. Önceki başarılı çıkış ile karşılaştırın. Aynı URL'nin eski ve yeni HTML'sini karşılaştırın: genellikle yeni bir sarmalayıcı sınıf, taşınan bir blok veya id'nin data-* ile değiştirilmesi hemen görünür.
  5. Site başka bir sayfa versiyonu verip vermediğini kontrol edin. Bu ayrı bir konu, çünkü burada proxy yine de bir rol oynuyor.

Üçüncü noktadan sonra tanı "işaretleme kaydı gitti" ise, proxy değiştirmek anlamsızdır. Seçicinin bozulduğunda bile öğeyi bulabilen bir parser'a ihtiyacınız var.

Adım 2. Adaptif seçiciler nedir

Fikir basit: .product-card > h3.title satırına sıkı sıkıya bağlanmak yerine, kütüphane bir kez gerekli öğenin "portresini" kaydeder ve bir sonraki çalıştırmada sayfadaki bu portreye en çok benzeyen öğeyi arar.

Bu en pratik şekilde Scrapling içinde uygulanmıştır - Karim Shoaer'in açık Python çerçevesi. Proje Ekim 2024'te piyasaya sürüldü ve Eylül 2026'ya kadar GitHub'da 78.000'den fazla yıldız topladı; yazım anında son sürüm - v0.4.15, 23 Ağustos 2026, günlük olarak güncellemeler yapılıyor. Python 3.10+ gereklidir.

Adaptif arama mekanizması şu şekilde çalışır. auto_save=True ile bir seçici çağırdığınızda, Scrapling öğenin parmak izini kaydeder:

  • etiket adı, metin ve tüm nitelikler ile değerleri;
  • komşu etiketlerin adları;
  • öğeye giden yol - yalnızca etiket adlarıyla;
  • ebeveynin etiketi, nitelikleri ve metni.

Parmak izi yerel SQLite veritabanına kaydedilir ve "alan + kimlik" çifti ile anahtarlanır. Alan, sayfanın URL'sinden alınır (veya adaptive_domain parametresi ile belirlenir), varsayılan kimlik ise seçici satırının kendisidir - ya da identifier= ile kendi kimliğinizi geçirebilirsiniz.

Tasarım değiştiğinde ve normal seçici boş döndüğünde, adaptive=True ile çağrı kaydedilen parmak izini alır ve sayfadaki tüm öğeleri üzerinden geçirir, benzerlik için bulanık bir değerlendirme yapar - niteliklerin sırasına kadar. En yüksek eşleşmeye sahip öğe döner.

Bu ucuzdur. Projenin resmi benchmarklarına göre, parsel alma süresi 1,99 ms iken, Parsel/Scrapy için 2,01 ms, PyQuery için 22,93 ms, Selectolax için 80,57 ms ve BeautifulSoup ile lxml için 1541 ms'dir. Benzer öğenin adaptif araması ise 2,46 ms iken, AutoScraper için 13,3 ms'dir. Yani, yeniden tasarıma karşı sigorta, ağ gecikmesinin yüzlerce milisaniye olduğu bir ortamda isteğe yaklaşık iki milisaniye ekler.

Adım 3. Kurulum ve etkinleştirme

Kurulum, bir tarayıcıya ihtiyaç duyup duymadığınıza bağlıdır:

  1. pip install scrapling - sadece parser, ağ kısmı olmadan. HTML'yi kendi kodunuzla alıyorsanız yeterlidir.
  2. pip install "scrapling[fetchers]", ardından scrapling install - fetcher'ları ekler ve bağımlılıklarla birlikte tarayıcıları indirir.
  3. Ayrıca: [ai] - MCP sunucusu, [rag] - RAG için sarfiyat, [shell] - etkileşimli konsol, [all] - hepsi bir arada. Hazır bir imaj pyd4vinci/scrapling bulunmaktadır.

Sonra - iki geçiş. İlk geçiş canlı çalışma tasarımında parmak izini kaydeder, ikincisi ise yeniden tasarımı atlatmayı öğrenir:

  1. Referans geçişi. adaptive=True ile bir Selector nesnesi oluşturun ve mutlaka url geçirin - aksi takdirde alan "default" anahtarına kayar ve farklı sitelerin parmak izleri karışır. Gerekli seçiciyi auto_save=True ile çağırın.
  2. Savaş geçişi. Aynı seçici, ancak adaptive=True ile. Tasarım sağlam kaldığı sürece normal yol çalışacaktır. Kırıldığında - benzerlik araması devreye girecektir.
  3. Farklılıkları kaydedin. Normal seçici boş döndüğünde ve adaptif bir şey bulduğunda - bu "site taşındı" sinyalidir, bunu izleme sisteminde görmek gerekir, sessizce yutulmamalıdır.

Yeniden yazma ile ilgili önemli bir detay: kaydetme birikmez. Aynı "alan + kimlik" çifti için tekrar auto_save önceki parmak izini siler. Bu nedenle, referans, önceden doğru bir sayfadan alınmalıdır, tüm URL havuzunda bir döngüde değil.

Adım 4. Proxy: nerede hala bir rol oynuyorlar

Tasarım kaymasının proxy ile ilgili olmadığını söyleyerek başladık. Bu doğru, ama bunun diğer yarısı maliyetlidir.

Site, proxy çıkışı nedeniyle size farklı bir işaretleme verebilir. Yerel ayar, dil ve ülke sayfa şablonunu değiştirir: blokların sırası, sınıflar, fiyat ve tarih formatları farklıdır. Bu bir hipotez değil - Scrapling'in kendisinde gösterişli bir düzeltme var: 0.4.12 sürümünde StealthyFetcher'dan zorunlu yerel en-US kaldırıldı, çünkü dayatılan yerel gerçek coğrafyayla çelişiyordu ve davranışı bozuyordu. Buradan çıkan çalışma kuralı: referans parmak izini veri topladığınız aynı coğrafyadan alın. Alman IP'si ile alınan bir parmak izi, Brezilya'dan alınan bir sayfa ile daha az eşleşecek ve "site tasarımını değiştirdi" yanlış alarmı alacaksınız.

Pratik sonuçlar:

  • Eğer havuz çok ulusluysa - parmak izlerini adaptive_domain ile ayırın, oraya "alan + ülke" gibi bir anahtar belirleyin. Aksi takdirde, SQLite'daki bir kayıt sürekli olarak farklı coğrafyaların sürümleri ile üzerine yazılır.
  • Uzun senaryolar için tüm görev boyunca tek bir ülke ve tek bir oturum tutun. Bunu nasıl yapacağınız, sticky oturumlar ve ne zaman kullanılacağı konulu makalede detaylıca açıklanmıştır.
  • A/B testleri ve kademeli dağıtımlar, aynı alan adında iki canlı tasarım sunar. Burada adaptif arama özellikle faydalıdır: her iki dalda da öğeyi çıkarır, oysa katı bir seçici, isteklerin yarısında rastgele boş dönecektir.

Scrapling'de proxy ayarlamak her seviyede mümkündür. Hızlı HTTP istekleri için Fetcher ve AsyncFetcher'da proxies parametresi vardır. Oturumlar için ProxyRotator vardır, bir adres listesi alır - bu FetcherSession'da yerleştirilir. Tarayıcı tabanlı DynamicSession ve StealthySession oturum düzeyinde proxy alır, böylece IP, senaryo ortasında değişmez.

Havuz ve sinirleri koruyan bir başka şey, 0.4.12 sürümünde ortaya çıktı - AutoThrottle: kütüphane, sunucunun yanıtlarına göre istekler arasındaki gecikmeleri otomatik olarak ayarlar, engelleme durumunda gecikmeyi iki katına çıkarır ve Retry-After başlığını dikkate alır. Bu, dikkatli bir toplama ile naif yeniden denemelerle yasakları artırma arasındaki farkı yaratan davranıştır.

Tuzağa düşme noktaları

  • SQLite parmak izlerini git ile gönderin. Bu, belgelerde açıkça uyarılır. Ayrıca, kişisel verilerin bulunduğu sayfalarda auto_save kullanmayın - parmak izine öğenin metni ve nitelikleri dahil olur.
  • Adaptif arama, izleme yerine geçmez. "En benzer" öğeyi döndürür, ancak en benzer her zaman doğru değildir. Eğer site indirimli fiyatı ve indirimli olmayan fiyatı yer değiştirirse, benzerlik yüksek olur ama veriler yanlıştır. Değer aralıkları ve boş alanların oranı için kontrolleri sürdürün.
  • Sessiz arıza, gürültülü olandan daha pahalıdır. Seçici sessizce None döndürdüğünde, pipeline sayfalar arasında dolaşmaya devam eder ve ödenmiş trafiği yakar. Verilerin çıkarılmadığı bir gigabaytın gerçek maliyeti hakkında ayrı bir inceleme var - neden GB başına proxy fiyatı yanlıştır.
  • Parmak izi yaşlanır. Onaylanmış bir yeniden tasarımdan sonra referansı yeniden çekin, aksi takdirde sitenin bir sonraki düzenlemesi, artık eski portre olarak kabul edilecektir ve doğruluk düşecektir.
  • HTML'de içerik yoksa - adaptiflik yardımcı olmaz, bir tarayıcı fetişine ihtiyacınız var. 0.4.15 sürümünde tarayıcı sekmeleri istekler arasında yeniden kullanılmaya başlandı ve close_pages() yöntemi onları zorla kapatır; burada headless modda takılmaları düzeltildi ve Turnstile çözümü tarayıcı yerel ayarına bağlı kalmadı.

Böyle bir görev için hangi tür proxy alınmalı

Seçim, parser'dan değil, hedef siteden kaynaklanır:

  • Veri merkezi proxy'leri - ciddi bir anti-bot olmayan siteler için: belgeler, devlet kayıtları, açık dizinler, RSS ve CSV akışları (sonuncusu için 0.4.13'te XMLFeedSpider ve CSVFeedSpider ile otomatik gzip açma eklendi). Ucuz ve hızlıdır, burada işaretlemenin istikrarı genellikle daha yüksektir.
  • Konut proxy'leri - pazar yerleri, toplayıcılar ve coğrafyaya göre sonuçları kişiselleştiren her şey için. Burada referans almak ve verileri tek bir ülkeden toplamak kritik öneme sahiptir, aksi takdirde arızayı değil, kendi coğrafyanızı onarırsınız.
  • Mobil proxy'ler - site mobil şablonu veriyorsa ve olduğu gibi parsel almanız gerekiyorsa veya IP'ye güven, gigabayt başına maliyetten daha önemliyse.

Kısaca

Boş alanlar iki farklı tanı ile farklı tedavi gerektirir. Öncelikle cevap kodunu ve ham HTML'yi kontrol edin: eğer sayfa tam olarak geldiyse, proxy değiştirmeye gerek yok, işaretleme kaymış. Scrapling'in adaptif seçicileri, bu tür arızaları istek başına birkaç milisaniyede kapatır - çalışma tasarımında parmak izini kaydedin, savaşta adaptive=True açın ve tetiklenme anlarını yeniden tasarım sinyali olarak kaydedin. Ve coğrafyayı sabit tutun: "ani yeniden tasarımlar"ın yarısı pratikte, ülke çıkışının değişmesi nedeniyle gelen başka bir dil sürümü olmaktadır.

Eğer sabit bir coğrafya ve öngörülebilir bir oturum, parser'ınızın eksik olduğu şeyse, ProxyCove konut proxy'lerine göz atın: ülke seçimi, yapışkan oturumlar ve gerçekten kullanılan trafik için ödeme.