Apakah Anda mencoba memutuskan antara Dalang dan Selenium untuk web scraping? Keduanya merupakan kerangka otomatisasi browser yang kuat, dan membuat pilihan yang tepat bergantung pada kebutuhan spesifik Anda dan sumber daya yang tersedia.
Untuk membantu Anda mengambil keputusan, kami telah menyoroti perbedaan utama antara Dalang dan Selenium pada tabel di bawah. Setelah itu, kami akan mempelajari detailnya dan memberikan contoh awal untuk setiap kerangka kerja untuk menunjukkan efektivitasnya dalam mengekstraksi data dari halaman web.
Kriteria | Dalang | Selenium |
---|---|---|
Bahasa yang Kompatibel | Hanya JavaScript yang didukung secara resmi, tetapi ada port PHP dan Python tidak resmi | Java, Python, C#, Ruby, PHP, JavaScript, dan Kotlin |
Dukungan Peramban | Dukungan Chromium dan Firefox eksperimental | Chrome, Safari, Firefox, Opera, Edge, dan Internet Explorer |
Pertunjukan | 60% lebih cepat dari Selenium | Cepat |
Dukungan Sistem Operasi | Windows, Linux, dan macOS | Windows, Linux, macOS, dan Solaris |
Arsitektur | Arsitektur berbasis peristiwa dengan instance browser tanpa kepala | Protokol JSONWire pada driver web untuk mengontrol instance browser |
Prasyarat | Paket JavaScript sudah cukup | Selenium Bindings (untuk bahasa pemrograman yang dipilih) dan driver web browser |
Masyarakat | Komunitas yang lebih kecil dibandingkan Selenium | Dokumentasi yang mapan dan komunitas yang besar |
Mari kita lanjutkan membahas pustaka ini secara mendetail dan melakukan contoh pengikisan pada masing-masing pustaka untuk mengilustrasikan efisiensinya dalam mengekstraksi data dari halaman web.
Dalang
Dalang adalah pustaka Node.js yang menyediakan API tingkat tinggi untuk mengontrol Chrome atau Chromium melalui Protokol DevTools. Ini dirancang untuk mengotomatiskan tugas-tugas di Chrome atau Chromium, seperti mengambil tangkapan layar, membuat PDF, dan menavigasi halaman.
Dalang juga dapat digunakan untuk menguji halaman web dengan mensimulasikan interaksi pengguna seperti mengklik tombol, mengisi formulir, dan memverifikasi hasil yang ditampilkan.
Kelebihan Dalang
- Kemudahan penggunaan: Sederhana dan mudah digunakan.
- Dibundel dengan Kromium: Tidak diperlukan pengaturan tambahan.
- Mode Tanpa Kepala: Berjalan dalam mode tanpa kepala secara default tetapi dapat dikonfigurasi untuk berjalan dalam mode browser penuh.
- Arsitektur Berbasis Peristiwa: Menghilangkan kebutuhan akan panggilan tidur manual dalam kode Anda.
- Kemampuan Komprehensif: Dapat mengambil tangkapan layar, menghasilkan PDF, dan mengotomatiskan semua tindakan browser.
- Manajemen kinerja: Menawarkan alat untuk merekam runtime dan memuat kinerja untuk mengoptimalkan dan men-debug scraper Anda.
- Perayapan SPA: Mampu merayapi Aplikasi Halaman Tunggal (SPA) dan menghasilkan konten yang telah dirender sebelumnya (render sisi server).
- Perekaman Naskah: Memungkinkan pembuatan skrip Puppeteer dengan merekam tindakan di browser menggunakan konsol DevTools.
Kekurangan Dalang
- Dukungan Peramban Terbatas: Mendukung lebih sedikit browser dibandingkan Selenium.
- Berfokus pada JavaScript: Terutama mendukung JavaScript, meskipun ada port tidak resmi untuk Python dan PHP.
Contoh Pengikisan Web dengan Dalang
Mari kita lihat tutorial pengikisan web Dalang untuk mengekstrak item dari kategori Kejahatan dan Thriller di situs web Danube.
Toko Danube: Kejahatan dan Thriller
Untuk memulai, impor modul Puppeteer dan buat fungsi asinkron untuk menjalankan kode Puppeteer:
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();
Keluaran yang Diharapkan
Saat Anda menjalankan kode, hasilnya akan terlihat seperti berikut:
[
{
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'
}
]
Contoh Lain Penggunaan Dalang
Selain mengambil data dari halaman web, Dalang dapat digunakan untuk berbagai tugas otomatisasi. Salah satu kasus penggunaan yang umum adalah membuat PDF halaman web. Mari kita lihat contoh di mana Dalang digunakan untuk menghasilkan PDF dari halaman web.
Menghasilkan PDF dengan Dalang
Langkah 1: Impor Dalang dan Buat Fungsi Asinkron
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();
Opsi Dalang Tambahan
Dalang menyediakan beberapa opsi untuk menghasilkan PDF yang dapat disesuaikan dengan kebutuhan Anda. Berikut beberapa opsi yang dapat Anda gunakan:
path
: Jalur file untuk menyimpan PDF.format
: Format kertas (misalnya, 'A4', 'Letter').printBackground
: Apakah akan menyertakan grafik latar belakang.landscape
: Mulaitrue
untuk orientasi lanskap.margin
: Menentukan margin untuk PDF (atas, kanan, bawah, kiri).
Contoh dengan Opsi Tambahan:
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();
Contoh Keluaran
Menjalankan kode di atas akan membuat file PDF bernama example.pdf
di direktori saat ini dengan konten halaman web https://example.com
.
Dalang adalah alat serbaguna untuk tugas otomatisasi web, mulai dari menggores data hingga menghasilkan PDF. Kemudahan penggunaan dan fitur-fiturnya yang canggih menjadikannya pilihan yang sangat baik untuk mengotomatiskan berbagai aktivitas browser. Baik Anda mengumpulkan data, membuat laporan, atau menguji halaman web, Puppeteer menyediakan alat yang Anda perlukan untuk menyelesaikan pekerjaan secara efisien.
Selenium
Selenium adalah alat pengujian end-to-end dan otomatisasi web sumber terbuka yang sering digunakan untuk web scraping. Komponen utamanya meliputi Selenium IDE, Selenium WebDriver, dan Selenium Grid.
- Selenium IDE: Digunakan untuk merekam tindakan sebelum mengotomatiskannya.
- Selenium WebDriver: Menjalankan perintah di browser.
- Kotak Selenium: Mengaktifkan eksekusi paralel.
Keunggulan Selenium
- Kemudahan penggunaan: Sederhana dan mudah digunakan.
- Dukungan bahasa: Mendukung berbagai bahasa pemrograman seperti Python, Java, JavaScript, Ruby, dan C#.
- Otomatisasi Peramban: Dapat mengotomatiskan browser seperti Firefox, Edge, Safari, dan bahkan browser QtWebKit khusus.
- Skalabilitas: Memungkinkan untuk menskalakan Selenium hingga ratusan instance menggunakan server cloud dengan pengaturan browser berbeda.
- Lintas Platform: Beroperasi di Windows, macOS, dan Linux.
Kekurangan Selenium
- Pengaturan Kompleks: Metode pengaturan selenium bisa jadi rumit.
Sampel Pengikisan Web dengan Selenium
Seperti halnya Puppeteer, mari kita lihat tutorial web scraping dengan Selenium menggunakan situs target yang sama. Kami akan mengekstrak pratinjau buku dari kategori Kejahatan dan Thriller di situs web Danube.
Toko Danube: Kejahatan dan Thriller
Langkah 1: Impor Modul yang Diperlukan dan Konfigurasikan Selenium
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--headless")
Langkah 2: Inisialisasi Chrome WebDriver
driver = webdriver.Chrome(options=options)
Langkah 3: Navigasikan ke Situs Web Target
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")
Langkah 4: Klik pada Kategori Kejahatan & Thriller dan Ekstrak Pratinjau Buku
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")
Langkah 5: Tentukan Fungsi untuk Mengekstrak Data dari Setiap Pratinjau Buku
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}
Langkah 6: Ulangi Pratinjau, Ekstrak Data, dan Keluar dari Driver
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
driver.quit()
Keluaran yang Diharapkan
Menjalankan kode di atas akan menghasilkan output seperti berikut:
[
{'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'}
]
Contoh Selenium Tambahan: Mengambil Tangkapan Layar
Selain untuk menggores data, Selenium juga dapat digunakan untuk mengambil screenshot halaman web. Berikut contoh cara mengambil screenshot halaman web menggunakan Selenium.
Langkah 1: Impor Modul yang Diperlukan dan Konfigurasikan Selenium
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
Langkah 2: Inisialisasi Chrome WebDriver
driver = webdriver.Chrome(options=options)
Langkah 3: Navigasikan ke Situs Web Target
url = "https://example.com"
driver.get(url)
Langkah 4: Ambil Tangkapan Layar
driver.save_screenshot("example_screenshot.png")
Langkah 5: Keluar dari Pengemudi
driver.quit()
Selenium adalah alat serbaguna untuk tugas otomatisasi web, termasuk pengikisan web dan pengambilan tangkapan layar. Dukungannya terhadap berbagai bahasa pemrograman dan browser, serta skalabilitasnya, menjadikannya pilihan yang tepat untuk berbagai kebutuhan otomatisasi. Baik Anda mengekstrak data atau membuat laporan, Selenium memberikan kemampuan untuk mengotomatiskan tugas Anda secara efisien.
Dalang vs Selenium: Perbandingan Kecepatan
Apakah Dalang lebih cepat dari Selenium? Jawabannya adalah ya—Dalang umumnya lebih cepat daripada Selenium.
Untuk membandingkan kecepatan Puppeteer dan Selenium, kami menggunakan sandbox Danube-store dan menjalankan skrip yang disajikan di atas sebanyak 20 kali, dengan rata-rata waktu eksekusi.
Tes Kecepatan Selenium
Kami menggunakan time
modul dengan Python untuk mengukur waktu eksekusi skrip Selenium. Waktu mulai dicatat di awal dan waktu berakhir di akhir naskah. Perbedaan antara waktu-waktu ini memberikan total durasi eksekusi.
Berikut skrip lengkap yang digunakan untuk Selenium:
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()
Tes Kecepatan Dalang
Untuk naskah Dalang, kami menggunakan Date
objek untuk mengukur waktu eksekusi. Waktu mulai dicatat di awal dan waktu berakhir di akhir naskah. Perbedaan antara waktu-waktu ini menunjukkan total durasi eksekusi.
Berikut script lengkap yang digunakan untuk Dalang:
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();
Hasil Uji Kinerja
Tes kinerja menunjukkan bahwa Puppeteer 60% lebih cepat dari Selenium. Keunggulan kecepatan ini menjadikan Puppeteer pilihan yang lebih cocok untuk proyek yang memerlukan pengikisan dan otomatisasi web berkecepatan tinggi, terutama saat bekerja dengan browser berbasis Chromium.
Ringkasan Hasil Kecepatan:
Bagan di bawah ini menggambarkan perbedaan kinerja antara Dalang dan Selenium:
Meningkatkan aplikasi Puppeteer untuk proyek yang membutuhkan web scraping yang cepat dan efisien adalah pilihan optimal dalam konteks ini.
Dalang vs Selenium: Mana yang Lebih Baik?
Jadi mana yang lebih baik antara Selenium dan Puppeteer untuk digores? Tidak ada jawaban langsung untuk pertanyaan tersebut karena bergantung pada beberapa faktor, seperti dukungan perpustakaan jangka panjang, dukungan lintas-browser, dan kebutuhan web scraping Anda.
Dalang lebih cepat, tetapi dibandingkan dengan Selenium, ia mendukung lebih sedikit browser. Selenium juga mendukung lebih banyak bahasa pemrograman dibandingkan Puppeteer.
Kesimpulan
Meskipun menggunakan Puppeteer atau Selenium adalah pilihan yang baik untuk web scraping, meningkatkan dan mengoptimalkan proyek web scraping Anda dapat menjadi tantangan karena tindakan anti-bot tingkat lanjut dapat mendeteksi dan memblokir perpustakaan ini. Cara terbaik untuk menghindari hal ini adalah dengan menggunakan API web scraping, seperti OneProxy.
Menggunakan Dalang dengan Server Proxy
Untuk menggunakan Puppeteer dengan server proxy, Anda dapat melewati pengaturan proxy di args
pilihan saat meluncurkan instance browser. Berikut ini contohnya:
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();
Menggunakan Selenium dengan Server Proxy
Untuk menggunakan Selenium dengan server proxy, Anda dapat mengatur opsi proxy menggunakan webdriver.Proxy
kelas. Berikut ini contohnya:
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()
Menggunakan server proxy dengan Puppeteer dan Selenium dapat membantu melewati batasan berbasis IP dan mengurangi risiko pemblokiran, sehingga meningkatkan efisiensi tugas web scraping Anda. Proksi berputar OneProxy dapat lebih mengoptimalkan proses ini, memberikan pengalaman pengikisan yang lancar.