Crawlee İncelemesi: Quotes to Scrape, HTTP’de 0 ve Chromium’da 10 Sonuç Verdi

Son güncelleme: August 17, 2026
Crawlee İncelemesi: Quotes to Scrape, HTTP’de 0 ve Chromium’da 10 Sonuç Verdi
AI Özeti

Crawlee’yi faydalı kılan şey, tarama orkestrasyonunun hem HTTP ayrıştırmayı hem de tarayıcı yürütmeyi desteklemesidir. Bu nedenle aynı URL, seçilen crawler ve hazır olma koşuluna göre farklı sonuçlar üretebilir. Herkese açık Quotes to Scrape JS sayfasında, CheerioCrawler .quote öğesini bekledikten sonra 0 hedef alıntı bulurken PlaywrightCrawler 10 sonuç verdi. Tarama akışı benzer olsa da bu, yalnızca sınıf değiştirerek yapılan tek satırlık bir geçiş değildi: Cheerio handler’ı $ kullanırken, Playwright handler’ı page, açık bir bekleme ve tarayıcı tarafı veri çıkarımı kullandı. Crawlee, HTTP ve tarayıcı yürütme arasında ortak tarama orkestrasyonu isteyen Node veya TypeScript ekipleri için güçlü bir adaydır.

Crawlee’yi işe yarar kılan şey, tarama orkestrasyonunun hem HTTP ayrıştırmayı hem de tarayıcı çalıştırmayı desteklemesi. Bu sayede aynı URL, seçilen tarayıcıya ve hazır olma koşuluna göre farklı sonuçlar verebilir.

Herkese açık Quotes to Scrape JS sayfasında, .quote öğesi beklenmeden önce CheerioCrawler 0 hedef alıntı bulurken PlaywrightCrawler 10 alıntı buldu. Tarama yaşam döngüsü benzerdi, ama bu, sınıfı tek satırda değiştirip devam etmek gibi bir durum değildi: Cheerio işleyicisi $ kullanırken, Playwright işleyicisi page, açık bir bekleme ve tarayıcı tarafında veri çıkarma kullandı.

Crawlee tam olarak nedir?

Crawlee (apify/crawlee projesi, sürüm 3.17.0), Node.js ve TypeScript için bir web scraping ve tarayıcı otomasyonu kütüphanesidir. Cheerio veya JSDOM destekli HTTP tarama ve Playwright veya Puppeteer destekli tarayıcı tabanlı taramayı destekler. Proje Apache-2.0 lisansı altındadır; dağıtımınız için bildirim ve atıf yükümlülüklerini inceleyin.

Burada önemli olan zihinsel model, “sayfayı getir” ile “sayfayı oku” işini ayırmaktır. Bir yol ham HTML indirir ve JavaScript çalıştırmaz. Diğer yol Chromium başlatır ve sayfanın betiklerini çalıştırabilir; ancak yine de uygun bir hazır olma koşuluna ihtiyaç duyar ve etkileşim gerektiren, tembel yüklenen, shadow DOM içeren, API hatalı çalışan veya bot engeline takılan içerikleri kaçırabilir. Crawlee, bu yollar boyunca eşleşen yaşam döngüsü kavramları sunar; birbirinin yerine geçebilen DOM ilkeleri değil.

Herhangi bir seçici yazmadan önce anlaşılması gereken kısım tam da bu; çünkü bu iki motor arasındaki seçim, scraper’ınızın belirli bir sitede veri döndürüp döndürmeyeceğini belirler.

Temel özellikler: iki motor, tek API yüzeyi

Crawlee two engines one API

CheerioCrawler HTML’i indirir ve Cheerio ile ayrıştırır; PlaywrightCrawler Chromium’u yönetir ve ekran görüntüsü alabilir. İkisi de requestHandler kullanır, run() metodunu sunar ve kuyruklar ile bağlantı keşfi gibi tarama kavramlarını paylaşır. Ancak handler bağlamları farklıdır: test edilen Cheerio yolunda çıkarım $ üzerinden yapıldı; tarayıcı yolunda ise page, waitForSelector ve $$eval kullanıldı. Kuyruk ve yaşam döngüsü altyapısı tanıdık kalabilir, fakat veri çıkarma kodu bir adaptöre ya da yeniden yazıma ihtiyaç duyabilir.

Bunun altında Crawlee, gerçek bir tarama işinin ihtiyaç duyduğu altyapıyı sağlar. RequestQueue, ziyaret edilecek URL sınırını yönetir, yinelenenleri ayıklar ve neyin tamamlandığını takip eder. enqueueLinks, yeni URL’leri keşfeder ve kuyruğa ekler (seçici ve aynı alan adı filtreleriyle), böylece tarama kendi kendine genişleyebilir. Dataset, dışa aktarma için taradığınız kayıtları toplar. Varsayılan olarak Crawlee bunların hepsini diskte yerel storage/ dizinine yazar — bu, yeniden başlatma için kullanışlıdır; ama ilk kez siz istemediğiniz halde proje içinde bir storage/ klasörü görünce biraz can sıkabilir (benim test düzeneğim bunu temiz tutmak için depolamayı geçici dizine yönlendirdi ve kalıcılığı devre dışı bıraktı).

Bu parçaların tek başına çok özel bir yanı yok. Asıl nokta, bunların iki motor arasında da ortak olması; böylece ister HTTP üzerinden ister tarayıcıyla tarama yapın, kuyruk, bağlantı keşfi ve veri kümesi aynı şekilde çalışır. Tek bir API öğrenip iki farklı çekme stratejisi elde edersiniz.

Kurulum: tarayıcı ayrıca yüklenir

Test edilen kurulumda, paketler yüklendikten sonra bir Chromium yürütülebilir dosyası bulunmuyordu.

Crawlee setup install weight

npm install crawlee playwright bende sorunsuz kuruldu — 85 paket, 0 güvenlik açığı, drama yok. Burada durup bir CheerioCrawler çalıştırırsanız her şey çalışır; çünkü HTTP tarama için tarayıcı gerekmez.

Bu ortamda Chromium’un ayrıca npx playwright install chromium ile kurulması gerekiyordu; bu olmadan PlaywrightCrawler başlatılamadı. Gözlemlenen tarayıcı yükü yaklaşık 82 MiB idi, ancak orijinal notlar bunun aktarım boyutu mu yoksa disk üzerindeki boyut mu olduğunu korumuyor. Bu, makineye özgü bir kurulum gözlemidir; sabit bir ürün özelliği değildir. Belgelendirme yolları ve paket davranışları değişebilir, bu yüzden bu makale eksikliğin evrensel ya da kalıcı biçimde belgelenmemiş olduğunu iddia etmiyor.

Test edilen kurulumu iki adım olarak planlayın: önce Node paketlerini yükleyin, sonra Playwright yolunun kullandığı tarayıcıyı kurun. Dağıtım yapacağınız sürüm ve platform için güncel Crawlee ve Playwright kurulum talimatlarını tekrar kontrol edin.

Uygulamalı test: aynı sayfa, iki çok farklı cevap

Crawlee Cheerio 0 vs Playwright 8/8

Temel test, aynı JavaScript ile render edilen örnek sayfayı iki tarayıcıdan da geçirdi. URL ve hedef alanlar ortaktı; çıkarım ilkeleri ortak değildi.

Yerel örnekte CheerioCrawler, ham HTML’de bulunmadıkları için 0 hedef kart döndürdü. PlaywrightCrawler #dynamic-products article.product-card öğesini bekledikten sonra beklenen 8 kartın tamamını döndürdü ve bir ekran görüntüsü aldı. Bu sonuç, o bekleme sonrasında seçilen alanlar için örnek seviyesinde tamlığı gösterir; ancak bu, bir tarayıcının her olası sayfa durumunu göreceği anlamına gelmez. Ham dosyalar ve ekran görüntüsü benchmark deposunda yer alıyor.

Crawlee public Quotes JS ten

Herkese açık Quotes to Scrape JS sayfasında, CheerioCrawler 0 hedef alıntı buldu; PlaywrightCrawler ise çıkarmadan önce .quote öğesini bekledi ve 10 sonuç aldı. Bu, halka açık bir hedefte HTTP ile tarayıcı arasındaki aynı sınırı doğruluyor; ancak crawler sınıfı, handler bağlamı, bekleme koşulu ve çıkarım ilkesi iki tarafta da farklı.

Buradan çıkarılacak faydalı sonuç daha dardır: HTTP yolundan sonra gerekli alanları doğrulayın ve ham yanıt bunları içermiyorsa tarayıcı tabanlı bir crawler’a yükseltin. Tarayıcı işleyicisi de bu alanlara bağlı bir koşulu beklemelidir.

HTTP yolu, kontrollü statik katalog ve makale örneklerinde beklenen tüm kayıtları üretti, doğrudan bir JSON yanıtından beklenen sekiz öğenin tamamını çözdü, 11 sayfalık sınırlı bir grafiği gezdi ve bir 500 yanıtını failedRequestHandler’a yönlendirdi. Bunlar tek bir doğruluk puanı değil, ayrı yetenek kontrolleridir. Halk açık Books to Scrape sayfasında, yapılandırılmış seçici bir smoke test olarak 20 ürün döndürdü.

TestMotorSonuç
Statik çıkarım: katalog + sayfalamaCheerioCrawlerbeklenen 12 ürünün 12/12’si
Makale çıkarımıCheerioCrawlerbaşlık + 3/3 paragraf
Aktarım: doğrudan JSON yanıtıCheerioCrawlerbeklenen 8 ürünün 8/8’i
Gezinme: dahili bağlantı grafiğiCheerioCrawler11 sayfa, derinlikler {0:1, 1:3, 2:7}
Hata yönlendirme: HTTP 500CheerioCrawlerdurum hata işleyicisine ulaştı
Render: yerel örnekCheerioCrawlerham HTML’de 0 hedef kart
Render: yerel örnekPlaywrightCrawlerhedef seçici beklemesinden sonra 8/8
Render: Quotes JSCheerioCrawlerham HTML’de 0 hedef alıntı
Render: Quotes JSPlaywrightCrawlerhedef seçici beklemesinden sonra 10

Tam süreler ve test bazlı sayılar results/crawlee-test-summary.json dosyasında yer alıyor.

Şimdi dürüst kısıtlar: tek makine, tek çalıştırma ile yapılan bir denemenin sınırları vardır ve aksiymiş gibi davranmayacağım. Bunlar benchmark değil, süre ölçümü — tek makine, her test için bir çalıştırma; bu yüzden tarayıcı yolunun sayfa başına daha yüksek maliyetini “sub-second Cheerio çalıştırmalarına göre anlamlı biçimde daha yavaş” olarak değerlendirin, yayınlanmış kesin bir sayı olarak değil. Ayrıca bu geçişte test etmediğim birçok şey var: proxy rotasyonu, oturum havuzları, yüzlerce-binlerce sayfalık büyük ölçekli çalıştırmalar, RequestQueue kalıcılığı ve çökme sonrası devam, Puppeteer motoru ve Dataset/KeyValueStore dışa aktarma kullanım kolaylığı (burada dışa aktarmaları elle yazdım). İki motorlu hikâyeyi ve örnek düzeyindeki doğruluğu teyit edebilirim. Ölçek veya engel aşma davranışı için garanti veremem; bu yüzden vermiyorum.

Neyin ortak olduğu, neyin değişmesi gerektiği

Crawlee one-line engine switch

Ortak yüzey, tarama orkestrasyonudur. Her iki crawler sınıfı da bir requestHandler kabul eder ve run() sunar. Kuyruklar, istek meta verileri, bağlantı keşfi, hata kancaları ve depolama kavramları iki yürütme yoluna da tutarlı şekilde uygulanabilir. Bu da bir hedef tarayıcı gerektirdiğinde ekibin yeniden öğrenmesi gereken altyapı miktarını azaltır.

Sayfa erişim yüzeyi ise ortak değildir. Bir CheerioCrawler handler’ı $ gibi Cheerio odaklı erişim alır ve tarayıcı olmadan yanıt gövdesiyle çalışabilir. Test edilen PlaywrightCrawler handler’ı page alır; bir seçiciyi bekler ve tarayıcı DOM’u üzerinde değerlendirme yapar. Her iki handler aynı kayıt şemasını üretebilse de, ona farklı API’lerle ulaşırlar. Yeniden kullanılabilir bir adaptör bu farkın bir kısmını gizleyebilir, ancak bu test düzeneği böyle bir şey uygulamadı veya göstermedi.

Bu ayrım tahminler açısından önemlidir. Tarayıcı sınıfını değiştirmek kuyruk, veri kümesi ve URL politikasını koruyabilir; yine de seçiciler, hazır olma kontrolleri, ekran görüntüleri, etkileşim adımları ve hata işleme değişebilir. Bu nedenle makale “ortak tarama altyapısını” doğrulanmış fayda olarak ele alır, “tek satırlık geçiş” iddiasını ise desteklenmeyen bir vaat olarak reddeder.

Pratik bir motor seçimi akışı

Dönen HTML ya da doğrudan JSON yanıtı gerekli alanları içeriyorsa önce HTTP yolunu kullanın. Bir tamlık sözleşmesi tanımlayın — gerekli anahtarlar, minimum öğe sayısı veya hedef bir seçici — ve bu karşılanmadığında açıkça başarısız olun. Boş bir dizi, sayfada veri olmadığı anlamına gelmez; burada yer alan iki JavaScript vakasında bu, seçilen temsilde hedef öğelerin bulunmadığı anlamına geliyordu.

Hedef durumuİle başlaNe zaman yükselt
Gerekli alanlar dönen HTML içindeyseCheerioCrawlerGerekli seçiciler veya alanlar yoksa
Tekrarlanabilir bir JSON yanıtı veriyi içeriyorsaCheerioCrawlerİstek tarayıcıya özgü duruma bağlıysa
Sayfa, hedef öğeleri çalıştırma sonrası ekliyorsaPlaywrightCrawlerUygulanmaz; hedefe özel bir hazır olma kontrolü tanımlayın
Hedef karışıksa belirsizseÖnce HTTP, tamlık doğrulamasıylaDoğrulama, yazılı bir “temsil eksik” sonucu verirse

Çalıştırma gerektiğinde bu yazılı hatayı bir tarayıcı işleyicisine yükseltin. Bu düzende yerel sayfa #dynamic-products article.product-card öğesini bekledi; herkese açık alıntı sayfası ise .quote öğesini bekledi. Bu koşullar çıkarım sözleşmesinin bir parçasıdır. Genel bir yüklenme olayı, uygulama verisinin geldiğini kanıtlamaz; test de evrensel bir bekleme kuralını desteklemiyor.

Yükseltmeden sonra, DOM ilkeleri farklı olsa bile çıktı şemasını sabit tutun. Sonucu hangi motorun ürettiğini, hangi hazır olma koşulunun geçtiğini ve gerekli alan doğrulamasının başarılı olup olmadığını kaydedin. Böylece HTTP’den tarayıcıya yedekleme, eksik alanları sessizce kabul edilmiş kayıtlara dönüştürmez; gözlemlenebilir hale gelir.

Son olarak, tarayıcı kurulumunu ve işletim maliyetini dağıtım girdileri olarak değerlendirin. Yaklaşık 82 MiB gözlemi yalnızca yerel bir büyüklük mertebesi verir; tam tarayıcı sürümünü, platformu, önbellek davranışını ve görüntü etkisini kendi ortamınızda ölçün. Proxy rotasyonu, oturumlar, kalıcılık, çökme kurtarma ve sürdürülebilir eşzamanlılık, bu örneğin üretim ölçeğinde bir seçime rehberlik etmesinden önce kendi testlerini gerektirir.

Artılar ve eksiler

Artılar:

  • HTTP ve tarayıcı crawler’ları yaşam döngüsü kavramlarını paylaşır, ancak motorlara özgü çıkarım bağlamları sunar.
  • Statik kataloglar, makaleler ve JSON API’lerinde 1.0 geri çağırma doğruluğu ile HTTP çıkarımı.
  • İki motor arasında ortak altyapı: RequestQueue, derinlik kontrolüyle enqueueLinks, Dataset.
  • Tarayıcı yolu örnek betiklerini çalıştırdı ve iki JavaScript ile render edilen testte beklenen tüm öğeleri geri getirdi.
  • Temiz hata yönetimi — HTTP 500 çökmeye yol açmadan görünür oldu.
  • Apache-2.0 lisansı; aşağı akış kullanıcıları bildirim ve atıf yükümlülüklerini incelemelidir.

Eksiler:

  • Test edilen ortamda tarayıcı motoru ayrı bir Chromium kurulumu gerektirdi; bu olmadan PlaywrightCrawler çalışmadı.
  • HTTP yolu, ham HTML’de olmayan hedef öğeleri ortaya çıkaramaz; tamlık doğrulaması yoksa bu, geçerli bir boş sonuç gibi görünebilir.
  • Tarayıcı yolu, bu çalıştırmada ek bir tarayıcı ikilisi ve sayfa başına daha yüksek yerel maliyet taşır; boyut ve süre derleme ve platforma göre değişir.
  • Varsayılan çalıştırmalar diskte bir storage/ dizini bırakır.
  • Sadece Node/TypeScript — Python kullanan ekipler için uygun değildir.

Kimler için uygun, kimler uzak dursun?

Crawlee, ortak kuyruk ve yaşam döngüsü kavramları altında hem HTTP hem de tarayıcı taraması gereken Node veya TypeScript ekipleri için uygundur. Pratik yaklaşım, önce HTTP crawler’ını denemek, gerekli alanları doğrulamak ve yazılı bir tamlık hatasını hedefe özel bir hazır olma koşuluyla tarayıcı işleyicisine yükseltmektir. Kuyruk ve bağlantı keşfi altyapısı paylaşılırken, handler’ın DOM erişim kodu motora özeldir.

Eğer Python odaklı bir ekip iseniz beklentileri sıfırlayın veya başka yere bakın (Crawlee Node/TS tabanlıdır — ayrı bir Python portu var, ancak bu paket Node kütüphanesini test etti), eğer tüm hedefleriniz statikse ve daha yalın, tek amaçlı bir HTTP scraper tercih ediyorsanız ya da ölçekli, kanıtlanmış davranışa ihtiyacınız varsa — proxy rotasyonu, oturum havuzları, çökme sonrası devam — ki bu uygulamalı test bunları kapsamıyor. Ve PlaywrightCrawler kullanacaksanız önce Chromium kurun; aksi halde çalışmaz.

Alternatifler ve Thunderbit’in konumu

Crawlee, kendi yönettiğiniz açık kaynak bir yazılımdır. Çağrı başına bir tedarikçi ücreti yoktur; ancak tarayıcı işlem maliyeti, bant genişliği, proxy’ler, depolama, gözlemlenebilirlik ve mühendislik işletim maliyetine dönüşür. Crawler seçimi, tarayıcı ikilisi, depolama durumu ve hazır olma mantığı size aittir.

İlgili inceleme: scrapy-playwright incelemesi.

Yönetilen bir çıkarım hizmeti, edinim ve şema oluşturma sorumluluğunu bir tedarikçiye kaydırır. Biz Thunderbit geliştiriyoruz; ancak onu bu örneklerde çalıştırmadık, dolayısıyla bu makale kalite, gecikme, özellik eşdeğeri veya maliyet karşılaştırması sunmuyor. Buradaki asıl karar, ekibinizin Crawlee’nin süreç içi kontrolünü mü yoksa çağrı başına bir hizmet sınırını mı istediğidir.

İlgili benchmark incelemeleri: açık kaynak scraper karşılaştırmasının tamamı, aynı sayfalarda Playwright ve Puppeteer ve Scrapy’nin tarayıcısız istek tekrar oynatma incelemesi.

Web Verisi Çıkarma için Thunderbit’i Deneyin

Sonuç

Crawlee, HTTP ve tarayıcı çalıştırma arasında ortak tarama orkestrasyonu isteyen Node veya TypeScript ekipleri için güçlü bir adaydır. Test edilen handler’lar birbirinin yerine geçebilir değildi: Playwright’a geçmek page, hedef seçici beklemesi ve tarayıcı tarafında veri çıkarmayı gerektirdi. Proxy, oturum, kalıcılık, devam etme ve büyük ölçekli davranış ise hâlâ açık sorular.

Web Verisi Çıkarma için Thunderbit’i Deneyin Get Started Free

SSS

Crawlee’nin iki crawler’ı arasındaki gerçek fark nedir?
CheerioCrawler HTML’i HTTP üzerinden indirir ve JavaScript çalıştırmaz. PlaywrightCrawler Chromium’u yönetir, sayfa betiklerini çalıştırabilir ve daha yüksek sayfa başı yerel maliyetle ekran görüntüsü alabilir. Yaşam döngüsü kavramlarını paylaşırlar, ancak aynı handler bağlamını değil: bu test düzeneği HTTP yolunda $, Playwright yolunda ise page, hedef seçici beklemesi ve tarayıcı tarafı değerlendirme kullandı.

Crawlee’yi kurduktan sonra neden PlaywrightCrawler çalışmıyor?
Test edilen ortamda paket kurulumu bir tarayıcı yürütülebilir dosyası sağlamadı. Chromium’u npx playwright install chromium ile kurmak başlatma hatasını çözdü. Gözlemlenen yük yaklaşık 82 MiB idi, ancak orijinal ölçüm bunun aktarım mı yoksa disk boyutu mu olduğunu korumadığı için, bunu platformunuz ve derlemeniz için yeniden ölçün.

CheerioCrawler JavaScript ile render edilen sayfaları tarayabilir mi?
Sayfanın JavaScript’ini çalıştıramaz. Ancak doğrudan yanıt örneğinin gösterdiği gibi, istemcinin kullandığı erişilebilir bir JSON uç noktasını isteyebilir. Gerekli veri yalnızca tarayıcı çalıştırmasından sonra oluşuyorsa, bir tarayıcı crawler’ı ve bu alanlara bağlı bir hazır olma koşulu kullanın.

Crawlee normal statik çıkarım için doğru sonuç verir mi?
Kontrollü örneklerde handler’lar 12/12 beklenen katalog ürününü, 3/3 beklenen makale paragrafını ve 8/8 beklenen doğrudan JSON öğesini üretti. Bunlar örnek tamlığı kontrolleridir; test edilmemiş siteler için genel bir doğruluk puanı değildir.

Crawlee ticari kullanım için ücretsiz mi?
Apache-2.0 lisansı altında yayınlanmıştır. Güncel lisansı depo içinde doğrulayın ve dağıtımınız için bildirim ve atıf yükümlülüklerini inceleyin.

Üretimde kullanmadan önce, bu örneğin açık bıraktığı kısımları test edin: temsili sayfalarda tekrar eden eşzamanlılık, proxy ve oturum davranışı, kesinti sonrası kalıcı kuyruk kurtarma, tarayıcı süreci temizliği ve hata durumunda veri kümesi dışa aktarma. Bu sonuçlarla birlikte çözümlenen tarayıcı sürümünü ve kurulum yolunu saklayın. İki crawler sınıfı orkestrasyon farkını azaltır, ama motorlara özgü hazır olma kontrolleri, kaynak bütçeleri ve operasyonel hata yönetimi ihtiyacını ortadan kaldırmaz.

Ke
Ke
Thunderbit’ta CTO | Kıdemli Veri Bilimci ve ML Uzmanı Makine öğrenimi ve veri bilimi alanında yaklaşık on yıllık deneyime sahip olan Ke Shen, Columbia University mezunu ve Walmart Labs’te eski Kıdemli Veri Bilimci’dir. Python, R, Java ve İstatistik konularında derin ve meslektaşları tarafından tanınan uzmanlığıyla, karmaşık yapay zekâ algoritmalarını teoriden üretim düzeyinde mimariye taşıma konusunda sahada test edilmiş içgörüler paylaşır.
Topics
Web Scraping ToolsAI Web Scraper
İçindekiler
Thunderbit · AI web veri ajanı

Herhangi bir sayfadan 1 tık içinde veri çıkar

250.000+ kullanıcı tarafından güveniliyor
ücretsiz plan mevcut
Web sayfasından tabloya
İhtiyacını anlat — Thunderbit’in AI Ajanı bunu çeker ve Excel, Google Sheets, Airtable veya Notion’a aktarır. Başlamak ücretsiz.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week