Web kazıma için Kuklacı ve Selenyum arasında karar vermeye mi çalışıyorsunuz? Her ikisi de güçlü tarayıcı otomasyon çerçeveleridir ve doğru seçimi yapmak, özel kazıma ihtiyaçlarınıza ve mevcut kaynaklara bağlıdır.
Bilinçli bir karar vermenize yardımcı olmak için aşağıdaki tabloda Puppeteer ve Selenium arasındaki temel farkları vurguladık. Daha sonra ayrıntılara ineceğiz ve her çerçevenin web sayfalarından veri çıkarmadaki etkinliğini göstermek için birer örnek sunacağız.
Kriterler | Kuklacı | Selenyum |
---|---|---|
Uyumlu Diller | Yalnızca JavaScript resmi olarak desteklenmektedir ancak resmi olmayan PHP ve Python bağlantı noktaları da vardır | Java, Python, C#, Ruby, PHP, JavaScript ve Kotlin |
Tarayıcı Desteği | Chromium ve deneysel Firefox desteği | Chrome, Safari, Firefox, Opera, Edge ve Internet Explorer |
Verim | 60% Selenyumdan daha hızlı | Hızlı |
İşletim Sistemi Desteği | Windows, Linux ve macOS | Windows, Linux, macOS ve Solaris |
Mimari | Başsız tarayıcı örneklerine sahip olay odaklı mimari | Tarayıcı örneğini kontrol etmek için web sürücüsündeki JSONWire protokolü |
Önkoşullar | JavaScript paketi yeterli | Selenyum Bağlamaları (seçilen programlama dili için) ve tarayıcı web sürücüleri |
Toplum | Selenium'a kıyasla daha küçük topluluk | İyi yapılandırılmış belgeler ve geniş bir topluluk |
Bu kitaplıkları ayrıntılı olarak tartışmaya devam edelim ve bir web sayfasından veri çıkarmadaki verimliliklerini göstermek için her biriyle bir kazıma örneği gerçekleştirelim.
Kuklacı
Kuklacı Chrome veya Chromium'u DevTools Protokolü üzerinden kontrol etmek için üst düzey bir API sağlayan bir Node.js kitaplığıdır. Ekran görüntüsü alma, PDF oluşturma ve sayfalarda gezinme gibi Chrome veya Chromium'daki görevleri otomatikleştirmek için tasarlanmıştır.
Puppeteer ayrıca düğmelere tıklamak, formları doldurmak ve görüntülenen sonuçları doğrulamak gibi kullanıcı etkileşimlerini simüle ederek web sayfalarını test etmek için de kullanılabilir.
Kuklacının Avantajları
- Kullanım kolaylığı: Kullanımı basit ve anlaşılır.
- Krom ile birlikte gelir: Ek kurulum gerekmez.
- Başsız Mod: Varsayılan olarak başsız modda çalışır ancak tam tarayıcı modunda çalışacak şekilde yapılandırılabilir.
- Olay Odaklı Mimari: Kodunuzda manuel uyku araması ihtiyacını ortadan kaldırır.
- Kapsamlı Yetenekler: Ekran görüntüleri alabilir, PDF'ler oluşturabilir ve tüm tarayıcı işlemlerini otomatikleştirebilir.
- Performans Yönetimi: Kazıyıcınızı optimize etmek ve hata ayıklamak için çalışma süresini ve yük performansını kaydetmeye yönelik araçlar sunar.
- SPA Taraması: Tek Sayfalı Uygulamaları (SPA'lar) tarayabilir ve önceden oluşturulmuş içerik oluşturabilir (sunucu tarafı oluşturma).
- Komut Dosyası Kaydı: DevTools konsolunu kullanarak tarayıcıdaki eylemleri kaydederek Puppeteer komut dosyaları oluşturmaya olanak tanır.
Kuklacının Dezavantajları
- Sınırlı Tarayıcı Desteği: Selenium'a kıyasla daha az tarayıcıyı destekler.
- JavaScript Odaklı: Python ve PHP için resmi olmayan bağlantı noktaları mevcut olmasına rağmen, öncelikle JavaScript'i destekler.
Puppeteer ile Web Kazıma Örneği
Tuna web sitesinin Suç ve Gerilim kategorisindeki öğeleri çıkarmak için Puppeteer web kazıma eğitimini inceleyelim.
Tuna Mağazası: Suç ve Gerilim
Başlamak için Puppeteer modülünü içe aktarın ve Puppeteer kodunu çalıştıracak eşzamansız bir işlev oluşturun:
const puppeteer = require('puppeteer');
async function main() {
// Launch a headless browser instance
const browser = await puppeteer.launch({ headless: true });
// Create a new page object
const page = await browser.newPage();
// Navigate to the target URL and wait until the loading finishes
await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });
// Wait for the left-side bar to load
await page.waitForSelector('ul.sidebar-list');
// Click on the first element and wait for the navigation to finish
await Promise.all([
page.waitForNavigation(),
page.click("ul[class='sidebar-list'] > li > a"),
]);
// Wait for the book previews to load
await page.waitForSelector("li[class='preview']");
// Extract the book previews
const books = await page.evaluateHandle(
() => [...document.querySelectorAll("li[class='preview']")]
);
// Extract the relevant data using page.evaluate
const processed_data = await page.evaluate(elements => {
let data = [];
elements.forEach(element => {
let title = element.querySelector("div.preview-title").innerHTML;
let author = element.querySelector("div.preview-author").innerHTML;
let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;
let result = { title, author, rating, price };
data.push(result);
});
return data;
}, books);
// Print out the extracted data
console.log(processed_data);
// Close the page and browser respectively
await page.close();
await browser.close();
}
// Run the main function to scrape the data
main();
Beklenen çıktı
Kodu çalıştırdığınızda çıktı aşağıdakine benzemelidir:
[
{
title: 'Does the Sun Also Rise?',
author: 'Ernst Doubtingway',
rating: '★★★★☆',
price: '$9.95'
},
{
title: 'The Insiders',
author: 'E. S. Hilton',
rating: '★★★★☆',
price: '$9.95'
},
{
title: 'A Citrussy Clock',
author: 'Bethany Urges',
rating: '★★★★★',
price: '$9.95'
}
]
Kuklacı Kullanmanın Başka Bir Örneği
Puppeteer, web sayfalarından veri toplamanın yanı sıra çeşitli otomasyon görevleri için de kullanılabilir. Yaygın kullanım örneklerinden biri, bir web sayfasının PDF'sini oluşturmaktır. Bir web sayfasından PDF oluşturmak için Puppeteer'ın kullanıldığı bir örneği inceleyelim.
Puppeteer ile PDF oluşturma
Adım 1: Kuklacıyı İçe Aktarın ve Eşzamansız Bir İşlev Oluşturun
const puppeteer = require('puppeteer');
async function generatePDF() {
// Launch a headless browser instance
const browser = await puppeteer.launch({ headless: true });
// Create a new page object
const page = await browser.newPage();
// Navigate to the target URL
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
// Generate a PDF from the web page
await page.pdf({
path: 'example.pdf', // Output file path
format: 'A4', // Paper format
printBackground: true, // Include background graphics
});
// Close the page and browser respectively
await page.close();
await browser.close();
}
// Run the function to generate the PDF
generatePDF();
Ek Kuklacı Seçenekleri
Puppeteer, ihtiyaçlarınıza uyacak şekilde özelleştirilebilecek PDF'ler oluşturmak için çeşitli seçenekler sunar. Kullanabileceğiniz seçeneklerden bazıları şunlardır:
path
: PDF'nin kaydedileceği dosya yolu.format
: Kağıt formatı (örneğin, 'A4', 'Letter').printBackground
: Arka plan grafiklerinin dahil edilip edilmeyeceği.landscape
: Ayarlanırtrue
manzara yönlendirmesi için.margin
: PDF için kenar boşluklarını belirtin (üst, sağ, alt, sol).
Ek Seçeneklerle Örnek:
const puppeteer = require('puppeteer');
async function generatePDF() {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.pdf({
path: 'example.pdf',
format: 'A4',
printBackground: true,
landscape: true,
margin: {
top: '20px',
right: '20px',
bottom: '20px',
left: '20px',
},
});
await page.close();
await browser.close();
}
generatePDF();
Örnek Çıktı
Yukarıdaki kodu çalıştırmak, adında bir PDF dosyası oluşturacaktır. example.pdf
web sayfasının içeriğinin bulunduğu geçerli dizinde https://example.com
.
Puppeteer, verileri kazımaktan PDF oluşturmaya kadar web otomasyonu görevleri için çok yönlü bir araçtır. Kullanım kolaylığı ve güçlü özellikleri, onu çok çeşitli tarayıcı etkinliklerini otomatikleştirmek için mükemmel bir seçim haline getiriyor. İster veri topluyor olun, ister rapor oluşturuyor olun, ister web sayfalarını test ediyor olun, Puppeteer işi verimli bir şekilde halletmeniz için ihtiyacınız olan araçları sağlar.
Selenyum
Selenyum genellikle web kazıma için kullanılan açık kaynaklı bir uçtan uca test ve web otomasyon aracıdır. Ana bileşenleri arasında Selenium IDE, Selenium WebDriver ve Selenium Grid bulunur.
- Selenyum IDE: Eylemleri otomatikleştirmeden önce kaydetmek için kullanılır.
- Selenyum Web Sürücüsü: Tarayıcıdaki komutları yürütür.
- Selenyum Izgarası: Paralel yürütmeyi etkinleştirir.
Selenyumun Avantajları
- Kullanım kolaylığı: Kullanımı basit ve anlaşılır.
- Dil desteği: Python, Java, JavaScript, Ruby ve C# gibi çeşitli programlama dillerini destekler.
- Tarayıcı Otomasyonu: Firefox, Edge, Safari gibi tarayıcıları ve hatta özel QtWebKit tarayıcılarını otomatikleştirebilir.
- Ölçeklenebilirlik: Farklı tarayıcı ayarlarına sahip bulut sunucuları kullanarak Selenium'u yüzlerce örneğe ölçeklendirmek mümkündür.
- Çapraz Platform: Windows, macOS ve Linux'ta çalışır.
Selenyumun Dezavantajları
- Karmaşık Kurulum: Selenyum kurulum yöntemleri karmaşık olabilir.
Selenyumlu Web Kazıma Örneği
Puppeteer'da olduğu gibi, aynı hedef siteyi kullanarak Selenium ile web kazıma üzerine bir eğitimden geçelim. Kitap ön izlemelerini Tuna web sitesinin Suç ve Gerilim kategorisinden çıkaracağız.
Tuna Mağazası: Suç ve Gerilim
Adım 1: Gerekli Modülleri İçe Aktarın ve Selenyum'u Yapılandırın
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--headless")
2. Adım: Chrome Web Sürücüsünü başlatın
driver = webdriver.Chrome(options=options)
3. Adım: Hedef Web Sitesine Gidin
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")
Adım 4: Suç ve Gerilim Kategorisine tıklayın ve Kitap Önizlemelerini Çıkarın
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")
Adım 5: Her Kitap Önizlemesinden Veri Çıkarmak için Bir İşlev Tanımlayın
def extract(element):
title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
return {"title": title, "author": author, "rating": rating, "price": price}
Adım 6: Önizlemelerde Döngü Yapın, Verileri Çıkarın ve Sürücüden Çıkın
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
driver.quit()
Beklenen çıktı
Yukarıdaki kodun çalıştırılması aşağıdakine benzer bir çıktı üretecektir:
[
{'title': 'Does the Sun Also Rise?', 'author': 'Ernst Doubtingway', 'rating': '★★★★☆', 'price': '$9.95'},
{'title': 'The Insiders', 'author': 'E. S. Hilton', 'rating': '★★★★☆', 'price': '$9.95'},
{'title': 'A Citrussy Clock', 'author': 'Bethany Urges', 'rating': '★★★★★', 'price': '$9.95'}
]
Ek Selenyum Örneği: Ekran Görüntüsü Alma
Verileri kazımaya ek olarak Selenium, web sayfalarının ekran görüntülerini almak için de kullanılabilir. Selenyum kullanarak bir web sayfasının ekran görüntüsünün nasıl alınacağına dair bir örneği burada bulabilirsiniz.
Adım 1: Gerekli Modülleri İçe Aktarın ve Selenyum'u Yapılandırın
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
2. Adım: Chrome Web Sürücüsünü başlatın
driver = webdriver.Chrome(options=options)
3. Adım: Hedef Web Sitesine Gidin
url = "https://example.com"
driver.get(url)
4. Adım: Ekran Görüntüsü Alın
driver.save_screenshot("example_screenshot.png")
Adım 5: Sürücüden Çıkın
driver.quit()
Selenium, web kazıma ve ekran görüntüsü alma dahil, web otomasyon görevleri için çok yönlü bir araçtır. Çoklu programlama dili ve tarayıcı desteği ve ölçeklenebilirliği, onu çeşitli otomasyon ihtiyaçları için güçlü bir seçim haline getiriyor. İster veri çıkarıyor olun ister rapor oluşturuyor olun Selenium, görevlerinizi verimli bir şekilde otomatikleştirmenizi sağlayacak yetenekler sağlar.
Kuklacı ve Selenyum: Hız Karşılaştırması
Puppeteer Selenium'dan daha mı hızlı? Cevap evet; Kuklacı genellikle Selenium'dan daha hızlıdır.
Puppeteer ve Selenium'un hızını karşılaştırmak için Tuna deposu sanal alanını kullandık ve yukarıda sunulan komut dosyalarını 20 kez çalıştırarak yürütme sürelerinin ortalamasını aldık.
Selenyum Hız Testi
Biz kullandık time
Selenyum betiğinin yürütme süresini ölçmek için Python'daki modül. Başlangıç zamanı senaryonun başında ve bitiş zamanı da senaryonun sonunda kaydedildi. Bu süreler arasındaki fark toplam yürütme süresini sağladı.
İşte Selenium için kullanılan betiğin tamamı:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def extract(element):
title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
return {"title": title, "author": author, "rating": rating, "price": price}
# Start the timer
start_time = time.time()
options = webdriver.ChromeOptions()
options.add_argument("--headless")
# Create a new instance of the Chrome driver
driver = webdriver.Chrome(options=options)
url = "https://danube-webshop.herokuapp.com/"
driver.get(url)
# Click on the Crime & Thrillers category
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
# Extract the book previews
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
# End the timer
end_time = time.time()
print(f"The whole script took: {end_time - start_time:.4f} seconds")
driver.quit()
Kuklacı Hız Testi
Puppeteer senaryosu için şunu kullandık: Date
yürütme süresini ölçmek için nesne. Başlangıç zamanı senaryonun başında ve bitiş zamanı da senaryonun sonunda kaydedildi. Bu süreler arasındaki fark toplam yürütme süresini sağladı.
Puppeteer için kullanılan betiğin tamamı burada:
const puppeteer = require('puppeteer');
async function main() {
const start = Date.now();
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });
await page.waitForSelector('ul.sidebar-list');
await Promise.all([
page.waitForNavigation(),
page.click("ul[class='sidebar-list'] > li > a"),
]);
await page.waitForSelector("li[class='preview']");
const books = await page.evaluateHandle(
() => [...document.querySelectorAll("li[class='preview']")]
);
const processed_data = await page.evaluate(elements => {
let data = [];
elements.forEach(element => {
let title = element.querySelector("div.preview-title").innerHTML;
let author = element.querySelector("div.preview-author").innerHTML;
let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;
let result = { title, author, rating, price };
data.push(result);
});
return data;
}, books);
console.log(processed_data);
await page.close();
await browser.close();
const end = Date.now();
console.log(`Execution time: ${(end - start) / 1000} seconds`);
}
main();
Performans Testi Sonuçları
Performans testleri Puppeteer'ın Selenium'dan yaklaşık 60% daha hızlı olduğunu gösterdi. Bu hız avantajı, özellikle Chromium tabanlı tarayıcılarla çalışırken, yüksek hızlı web kazıma ve otomasyon gerektiren projeler için Puppeteer'ı daha uygun bir seçim haline getiriyor.
Hız Sonuçları Özeti:
Aşağıdaki grafik Puppeteer ve Selenium arasındaki performans farkını göstermektedir:
Hızlı, verimli web kazıma gerektiren projeler için Puppeteer uygulamalarının ölçeğini büyütmek bu bağlamda en uygun seçimdir.
Kuklacı ve Selenyum: Hangisi Daha İyi?
Peki kazıma için Selenium ve Puppeteer arasında hangisi daha iyi? Uzun vadeli kütüphane desteği, tarayıcılar arası destek ve web kazıma ihtiyaçlarınız gibi birden fazla faktöre bağlı olduğundan bu sorunun doğrudan bir cevabı yoktur.
Puppeteer daha hızlıdır ancak Selenium ile karşılaştırıldığında daha az tarayıcıyı destekler. Selenium ayrıca Puppeteer'a kıyasla daha fazla programlama dilini destekler.
Çözüm
Puppeteer veya Selenium kullanmak web kazıma için iyi bir seçenek olsa da, web kazıma projenizin ölçeğini büyütmek ve optimize etmek zor olabilir çünkü gelişmiş anti-bot önlemleri bu kitaplıkları tespit edip engelleyebilir. Bunu önlemenin en iyi yolu OneProxy gibi bir web kazıma API'si kullanmaktır.
Puppeteer'ı Proxy Sunucularla Kullanmak
Puppeteer'ı bir proxy sunucusuyla kullanmak için proxy ayarlarını args
tarayıcı örneğini başlatırken seçenek. İşte bir örnek:
const puppeteer = require('puppeteer');
async function main() {
const proxyServer = 'http://your-proxy-server:port';
const browser = await puppeteer.launch({
headless: true,
args: [`--proxy-server=${proxyServer}`]
});
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
// Perform your web scraping tasks here
await browser.close();
}
main();
Selenium'u Proxy Sunucularla Kullanmak
Selenium'u bir proxy sunucusuyla kullanmak için proxy seçeneklerini kullanarak ayarlayabilirsiniz. webdriver.Proxy
sınıf. İşte bir örnek:
from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "your-proxy-server:port"
proxy.ssl_proxy = "your-proxy-server:port"
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(desired_capabilities=capabilities, options=options)
driver.get("https://example.com")
# Perform your web scraping tasks here
driver.quit()
Proxy sunucularını Puppeteer ve Selenium ile kullanmak, IP tabanlı kısıtlamaları aşmanıza ve engellenme riskini azaltarak web kazıma görevlerinizin verimliliğini artırmanıza yardımcı olabilir. OneProxy'nin dönen proxy'leri kusursuz bir kazıma deneyimi sunarak bu süreci daha da optimize edebilir.