Adakah anda cuba membuat keputusan antara Puppeteer dan Selenium untuk mengikis web? Kedua-duanya adalah rangka kerja automasi penyemak imbas yang berkuasa, dan membuat pilihan yang tepat bergantung pada keperluan pengikisan khusus anda dan sumber yang tersedia.
Untuk membantu anda membuat keputusan termaklum, kami telah menyerlahkan perbezaan utama antara Puppeteer dan Selenium dalam jadual di bawah. Selepas itu, kami akan menyelidiki butiran dan memberikan contoh mengikis untuk setiap rangka kerja untuk menunjukkan keberkesanannya dalam mengekstrak data daripada halaman web.
Kriteria | dalang | Selenium |
---|---|---|
Bahasa yang Serasi | Hanya JavaScript yang disokong secara rasmi, tetapi terdapat port PHP dan Python tidak rasmi | Java, Python, C#, Ruby, PHP, JavaScript dan Kotlin |
Sokongan Pelayar | Chromium dan sokongan Firefox percubaan | Chrome, Safari, Firefox, Opera, Edge dan Internet Explorer |
Prestasi | 60% lebih pantas daripada Selenium | Cepat |
Sokongan Sistem Pengendalian | Windows, Linux dan macOS | Windows, Linux, macOS dan Solaris |
Seni bina | Seni bina dipacu acara dengan tika penyemak imbas tanpa kepala | Protokol JSONWire pada pemacu web untuk mengawal contoh penyemak imbas |
Prasyarat | Pakej JavaScript sudah memadai | Selenium Bindings (untuk bahasa pengaturcaraan yang dipilih) dan pemacu web penyemak imbas |
Komuniti | Komuniti yang lebih kecil berbanding Selenium | Dokumentasi yang mantap dan komuniti yang besar |
Mari kita teruskan membincangkan perpustakaan ini secara terperinci dan lakukan contoh pengikisan dengan setiap satu untuk menggambarkan kecekapannya dalam mengekstrak data daripada halaman web.
dalang
dalang ialah perpustakaan Node.js yang menyediakan API peringkat tinggi untuk mengawal Chrome atau Chromium melalui Protokol DevTools. Ia direka untuk mengautomasikan tugas dalam Chrome atau Chromium, seperti mengambil tangkapan skrin, menjana PDF dan menavigasi halaman.
Puppeteer juga boleh digunakan untuk menguji halaman web dengan mensimulasikan interaksi pengguna seperti mengklik butang, mengisi borang dan mengesahkan keputusan yang dipaparkan.
Kelebihan Puppeteer
- Kemudahan penggunaan: Mudah dan mudah digunakan.
- Dihimpun dengan Chromium: Tiada persediaan tambahan diperlukan.
- Mod Tanpa Kepala: Berjalan dalam mod tanpa kepala secara lalai tetapi boleh dikonfigurasikan untuk dijalankan dalam mod penyemak imbas penuh.
- Seni Bina Didorong Peristiwa: Menghapuskan keperluan untuk panggilan tidur manual dalam kod anda.
- Keupayaan Komprehensif: Boleh mengambil tangkapan skrin, menjana PDF dan mengautomasikan semua tindakan penyemak imbas.
- Pengurusan Prestasi: Menawarkan alat untuk merakam prestasi masa jalan dan memuatkan untuk mengoptimumkan dan nyahpepijat pengikis anda.
- SPA Merangkak: Mampu merangkak Aplikasi Halaman Tunggal (SPA) dan menjana kandungan pra-diberikan (pemarahan sebelah pelayan).
- Rakaman Skrip: Membenarkan membuat skrip Puppeteer dengan merakam tindakan pada penyemak imbas menggunakan konsol DevTools.
Kelemahan Dalang
- Sokongan Penyemak Imbas Terhad: Menyokong lebih sedikit pelayar berbanding Selenium.
- Fokus JavaScript: Terutamanya menyokong JavaScript, walaupun port tidak rasmi untuk Python dan PHP wujud.
Contoh Mengikis Web dengan Puppeteer
Mari kita lihat tutorial mengikis web Puppeteer untuk mengekstrak item daripada kategori Jenayah dan Thriller di tapak web Danube.
Kedai Danube: Jenayah dan Thriller
Untuk bermula, import modul Puppeteer dan buat fungsi tak segerak untuk menjalankan kod 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();
Output yang Dijangka
Apabila anda menjalankan kod, output harus menyerupai yang 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'
}
]
Satu lagi Contoh Penggunaan Puppeteer
Selain mengikis data dari halaman web, Puppeteer boleh digunakan untuk pelbagai tugas automasi. Satu kes penggunaan biasa ialah menjana PDF halaman web. Mari kita lihat contoh di mana Puppeteer digunakan untuk menjana PDF daripada halaman web.
Menjana PDF dengan Puppeteer
Langkah 1: Import Puppeteer dan Cipta Fungsi Asynchronous
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();
Pilihan Dalang Tambahan
Puppeteer menyediakan beberapa pilihan untuk menjana PDF yang boleh disesuaikan mengikut keperluan anda. Berikut adalah beberapa pilihan yang boleh anda gunakan:
path
: Laluan fail untuk menyimpan PDF.format
: Format kertas (cth, 'A4', 'Letter').printBackground
: Sama ada hendak memasukkan grafik latar belakang.landscape
: Ditetapkan untuktrue
untuk orientasi landskap.margin
: Tentukan margin untuk PDF (atas, kanan, bawah, kiri).
Contoh dengan Pilihan 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 Output
Menjalankan kod di atas akan mencipta fail PDF bernama example.pdf
dalam direktori semasa dengan kandungan halaman web https://example.com
.
Puppeteer ialah alat serba boleh untuk tugas automasi web, daripada mengikis data kepada menjana PDF. Kemudahan penggunaannya dan ciri berkuasa menjadikannya pilihan yang sangat baik untuk mengautomasikan pelbagai aktiviti penyemak imbas. Sama ada anda mengikis data, menjana laporan atau menguji halaman web, Puppeteer menyediakan alatan yang anda perlukan untuk menyelesaikan kerja dengan cekap.
Selenium
Selenium ialah alat ujian hujung ke hujung sumber terbuka dan alat automasi web yang sering digunakan untuk mengikis web. Komponen utamanya termasuk Selenium IDE, Selenium WebDriver dan Selenium Grid.
- Selenium IDE: Digunakan untuk merekod tindakan sebelum mengautomasikannya.
- Selenium WebDriver: Melaksanakan arahan dalam pelayar.
- Grid Selenium: Membolehkan pelaksanaan selari.
Kelebihan Selenium
- Kemudahan penggunaan: Mudah dan mudah digunakan.
- Sokongan Bahasa: Menyokong pelbagai bahasa pengaturcaraan seperti Python, Java, JavaScript, Ruby, dan C#.
- Automasi Pelayar: Boleh mengautomasikan penyemak imbas seperti Firefox, Edge, Safari, dan juga penyemak imbas QtWebKit tersuai.
- Kebolehskalaan: Berkemungkinan untuk menskalakan Selenium kepada ratusan contoh menggunakan pelayan awan dengan tetapan penyemak imbas yang berbeza.
- Merentas Platform: Beroperasi pada Windows, macOS dan Linux.
Kelemahan Selenium
- Persediaan Kompleks: Kaedah persediaan selenium boleh menjadi rumit.
Sampel Pengikisan Web dengan Selenium
Seperti Puppeteer, mari kita lihat tutorial tentang mengikis web dengan Selenium menggunakan tapak sasaran yang sama. Kami akan mengeluarkan pratonton buku daripada kategori Jenayah dan Ngeri di tapak web Danube.
Kedai Danube: Jenayah dan Thriller
Langkah 1: Import 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: Mulakan Pemacu Web Chrome
driver = webdriver.Chrome(options=options)
Langkah 3: Navigasi ke Tapak Web Sasaran
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 Jenayah & Thriller dan Ekstrak Pratonton 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 daripada Setiap Pratonton 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: Gelung Melalui Pratonton, Ekstrak Data dan Keluar dari Pemacu
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
driver.quit()
Output yang Dijangka
Menjalankan kod di atas akan menghasilkan output yang serupa dengan yang 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 Skrin
Selain mengikis data, Selenium juga boleh digunakan untuk mengambil tangkapan skrin halaman web. Berikut ialah contoh cara mengambil tangkapan skrin halaman web menggunakan Selenium.
Langkah 1: Import Modul yang Diperlukan dan Konfigurasikan Selenium
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
Langkah 2: Mulakan Pemacu Web Chrome
driver = webdriver.Chrome(options=options)
Langkah 3: Navigasi ke Tapak Web Sasaran
url = "https://example.com"
driver.get(url)
Langkah 4: Ambil Tangkapan Skrin
driver.save_screenshot("example_screenshot.png")
Langkah 5: Berhenti Pemandu
driver.quit()
Selenium ialah alat serba boleh untuk tugas automasi web, termasuk mengikis web dan mengambil tangkapan skrin. Sokongannya untuk berbilang bahasa pengaturcaraan dan penyemak imbas, bersama-sama dengan skalabilitinya, menjadikannya pilihan yang berkuasa untuk pelbagai keperluan automasi. Sama ada anda mengekstrak data atau menjana laporan, Selenium menyediakan keupayaan untuk mengautomasikan tugas anda dengan cekap.
Puppeteer vs. Selenium: Perbandingan Kelajuan
Adakah Puppeteer lebih cepat daripada Selenium? Jawapannya ialah ya—Puppeteer secara amnya lebih pantas daripada Selenium.
Untuk membandingkan kelajuan Puppeteer dan Selenium, kami menggunakan kotak pasir kedai Danube dan menjalankan skrip yang dibentangkan melebihi 20 kali, dengan purata masa pelaksanaan.
Ujian Kelajuan Selenium
Kami menggunakan time
modul dalam Python untuk mengukur masa pelaksanaan skrip Selenium. Masa mula direkodkan pada permulaan dan masa tamat pada akhir skrip. Perbezaan antara masa ini memberikan jumlah tempoh pelaksanaan.
Berikut ialah 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()
Ujian Kepantasan Dalang
Untuk skrip Puppeteer, kami menggunakan Date
objek untuk mengukur masa pelaksanaan. Masa mula direkodkan pada permulaan dan masa tamat pada akhir skrip. Perbezaan antara masa ini memberikan jumlah tempoh pelaksanaan.
Berikut ialah skrip lengkap yang digunakan untuk Puppeteer:
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();
Keputusan Ujian Prestasi
Ujian prestasi menunjukkan bahawa Puppeteer adalah kira-kira 60% lebih pantas daripada Selenium. Kelebihan kelajuan ini menjadikan Puppeteer pilihan yang lebih sesuai untuk projek yang memerlukan pengikisan dan automasi web berkelajuan tinggi, terutamanya apabila bekerja dengan penyemak imbas berasaskan Chromium.
Ringkasan Keputusan Kelajuan:
Carta di bawah menggambarkan perbezaan prestasi antara Puppeteer dan Selenium:
Mempertingkatkan aplikasi Puppeteer untuk projek yang memerlukan pengikisan web yang pantas dan cekap ialah pilihan optimum dalam konteks ini.
Puppeteer vs. Selenium: Mana Yang Lebih Baik?
Jadi mana yang lebih baik antara Selenium dan Puppeteer untuk mengikis? Tiada jawapan langsung kepada soalan itu kerana ia bergantung pada pelbagai faktor, seperti sokongan perpustakaan jangka panjang, sokongan merentas penyemak imbas dan keperluan mengikis web anda.
Puppeteer lebih pantas, tetapi berbanding Selenium, ia menyokong lebih sedikit pelayar. Selenium juga menyokong lebih banyak bahasa pengaturcaraan berbanding Puppeteer.
Kesimpulan
Walaupun menggunakan Puppeteer atau Selenium ialah pilihan yang baik untuk mengikis web, meningkatkan dan mengoptimumkan projek mengikis web anda boleh menjadi mencabar kerana langkah anti-bot lanjutan boleh mengesan dan menyekat perpustakaan ini. Cara terbaik untuk mengelakkan ini adalah dengan menggunakan API pengikis web, seperti OneProxy.
Menggunakan Puppeteer dengan Pelayan Proksi
Untuk menggunakan Puppeteer dengan pelayan proksi, anda boleh lulus tetapan proksi dalam args
pilihan semasa melancarkan contoh penyemak imbas. Berikut ialah contoh:
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 Pelayan Proksi
Untuk menggunakan Selenium dengan pelayan proksi, anda boleh menetapkan pilihan proksi menggunakan webdriver.Proxy
kelas. Berikut ialah contoh:
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 pelayan proksi dengan Puppeteer dan Selenium boleh membantu memintas sekatan berasaskan IP dan mengurangkan risiko disekat, meningkatkan kecekapan tugas mengikis web anda. Proksi berputar OneProxy boleh mengoptimumkan lagi proses ini, memberikan pengalaman mengikis yang lancar.