Bạn đang cố gắng quyết định giữa Puppeteer và Selenium để quét web? Cả hai đều là các khung tự động hóa trình duyệt mạnh mẽ và việc đưa ra lựa chọn đúng đắn tùy thuộc vào nhu cầu thu thập dữ liệu cụ thể và tài nguyên sẵn có của bạn.
Để giúp bạn đưa ra quyết định sáng suốt, chúng tôi đã nêu rõ những điểm khác biệt chính giữa Puppeteer và Selenium trong bảng bên dưới. Sau đó, chúng tôi sẽ đi sâu vào chi tiết và cung cấp ví dụ về từng khung để chứng minh tính hiệu quả của chúng trong việc trích xuất dữ liệu từ các trang web.
Tiêu chuẩn | Người múa rối | Selen |
---|---|---|
Ngôn ngữ tương thích | Chỉ có JavaScript được hỗ trợ chính thức, nhưng có các cổng PHP và Python không chính thức | Java, Python, C#, Ruby, PHP, JavaScript và Kotlin |
Hỗ trợ trình duyệt | Hỗ trợ Chrome và Firefox thử nghiệm | Chrome, Safari, Firefox, Opera, Edge và Internet Explorer |
Hiệu suất | 60% nhanh hơn Selenium | Nhanh |
Hỗ trợ hệ điều hành | Windows, Linux và macOS | Windows, Linux, macOS và Solaris |
Ngành kiến trúc | Kiến trúc hướng sự kiện với các phiên bản trình duyệt không có giao diện người dùng | Giao thức JSONWire trên trình điều khiển web để kiểm soát phiên bản trình duyệt |
Điều kiện tiên quyết | Gói JavaScript là đủ | Ràng buộc Selenium (dành cho ngôn ngữ lập trình đã chọn) và trình điều khiển web của trình duyệt |
Cộng đồng | Cộng đồng nhỏ hơn so với Selenium | Tài liệu được thiết lập tốt và cộng đồng lớn |
Chúng ta hãy tiến hành thảo luận chi tiết về các thư viện này và thực hiện một ví dụ thu thập dữ liệu với từng thư viện để minh họa hiệu quả của chúng trong việc trích xuất dữ liệu từ một trang web.
Người múa rối
Người múa rối là thư viện Node.js cung cấp API cấp cao để kiểm soát Chrome hoặc Chrome qua Giao thức DevTools. Nó được thiết kế để tự động hóa các tác vụ trong Chrome hoặc Chrome, chẳng hạn như chụp ảnh màn hình, tạo tệp PDF và điều hướng trang.
Puppeteer cũng có thể được sử dụng để kiểm tra các trang web bằng cách mô phỏng các tương tác của người dùng như nhấp vào nút, điền vào biểu mẫu và xác minh kết quả được hiển thị.
Ưu điểm của nghệ sĩ múa rối
- Dễ sử dụng: Đơn giản và dễ sử dụng.
- Đi kèm với Chrome: Không cần thiết lập thêm.
- Chế độ không đầu: Chạy ở chế độ không đầu theo mặc định nhưng có thể được cấu hình để chạy ở chế độ trình duyệt đầy đủ.
- Kiến trúc hướng sự kiện: Loại bỏ nhu cầu gọi lệnh ngủ thủ công trong mã của bạn.
- Khả năng toàn diện: Có thể chụp ảnh màn hình, tạo tệp PDF và tự động hóa mọi hành động của trình duyệt.
- Quản lý hiệu suất: Cung cấp các công cụ ghi lại thời gian chạy và hiệu suất tải để tối ưu hóa và gỡ lỗi trình quét của bạn.
- Thu thập dữ liệu SPA: Có khả năng thu thập thông tin Ứng dụng Trang Đơn (SPA) và tạo nội dung được kết xuất trước (kết xuất phía máy chủ).
- Ghi kịch bản: Cho phép tạo tập lệnh Puppeteer bằng cách ghi lại các hành động trên trình duyệt bằng bảng điều khiển DevTools.
Nhược điểm của múa rối
- Hỗ trợ trình duyệt hạn chế: Hỗ trợ ít trình duyệt hơn so với Selenium.
- Tập trung vào JavaScript: Chủ yếu hỗ trợ JavaScript, mặc dù vẫn tồn tại các cổng không chính thức cho Python và PHP.
Ví dụ về quét web với Puppeteer
Chúng ta hãy xem hướng dẫn quét web Puppeteer để trích xuất các mục từ danh mục Tội phạm và Kinh dị của trang web Danube.
Cửa hàng Danube: Tội phạm và ly kỳ
Để bắt đầu, hãy nhập mô-đun Puppeteer và tạo một hàm không đồng bộ để chạy mã 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();
Sản lượng dự kiến
Khi bạn chạy mã, kết quả sẽ giống như sau:
[
{
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'
}
]
Một ví dụ khác về việc sử dụng Puppeteer
Ngoài việc thu thập dữ liệu từ các trang web, Puppeteer có thể được sử dụng cho nhiều tác vụ tự động hóa khác nhau. Một trường hợp sử dụng phổ biến là tạo tệp PDF của trang web. Hãy xem qua một ví dụ trong đó Puppeteer được sử dụng để tạo tệp PDF từ một trang web.
Tạo tệp PDF bằng Puppeteer
Bước 1: Nhập Puppeteer và tạo hàm không đồng bộ
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();
Tùy chọn múa rối bổ sung
Puppeteer cung cấp một số tùy chọn để tạo tệp PDF có thể được tùy chỉnh cho phù hợp với nhu cầu của bạn. Dưới đây là một số tùy chọn bạn có thể sử dụng:
path
: Đường dẫn file PDF để lưu.format
: Định dạng giấy (ví dụ: 'A4', 'Letter').printBackground
: Có bao gồm đồ họa nền hay không.landscape
: Đặt thànhtrue
để định hướng cảnh quan.margin
: Chỉ định lề cho tệp PDF (trên, phải, dưới, trái).
Ví dụ với Tùy chọn bổ sung:
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();
Đầu ra ví dụ
Chạy đoạn mã trên sẽ tạo một tệp PDF có tên example.pdf
trong thư mục hiện tại có nội dung của trang web https://example.com
.
Puppeteer là một công cụ linh hoạt cho các tác vụ tự động hóa web, từ thu thập dữ liệu đến tạo tệp PDF. Tính dễ sử dụng và các tính năng mạnh mẽ khiến nó trở thành sự lựa chọn tuyệt vời để tự động hóa nhiều hoạt động của trình duyệt. Cho dù bạn đang thu thập dữ liệu, tạo báo cáo hay kiểm tra các trang web, Puppeteer đều cung cấp các công cụ bạn cần để hoàn thành công việc một cách hiệu quả.
Selen
Selen là một công cụ tự động hóa web và thử nghiệm end-to-end mã nguồn mở thường được sử dụng để quét web. Các thành phần chính của nó bao gồm Selenium IDE, Selenium WebDriver và Selenium Grid.
- IDE Selenium: Được sử dụng để ghi lại các hành động trước khi tự động hóa chúng.
- Trình điều khiển web Selenium: Thực thi các lệnh trong trình duyệt.
- Lưới Selenium: Cho phép thực hiện song song.
Ưu điểm của Selen
- Dễ sử dụng: Đơn giản và dễ sử dụng.
- Hỗ trợ ngôn ngữ: Hỗ trợ nhiều ngôn ngữ lập trình khác nhau như Python, Java, JavaScript, Ruby và C#.
- Tự động hóa trình duyệt: Có thể tự động hóa các trình duyệt như Firefox, Edge, Safari và thậm chí cả trình duyệt QtWebKit tùy chỉnh.
- Khả năng mở rộng: Có thể mở rộng quy mô Selenium lên hàng trăm phiên bản bằng cách sử dụng máy chủ đám mây với các cài đặt trình duyệt khác nhau.
- Đa nền tảng: Hoạt động trên Windows, macOS và Linux.
Nhược điểm của Selen
- Thiết lập phức tạp: Phương pháp thiết lập Selenium có thể phức tạp.
Mẫu quét web với Selenium
Giống như Puppeteer, chúng ta hãy xem qua hướng dẫn về quét web bằng Selenium bằng cách sử dụng cùng một trang đích. Chúng tôi sẽ trích xuất các bản xem trước sách từ danh mục Tội phạm và Kinh dị trên trang web Danube.
Cửa hàng Danube: Tội phạm và ly kỳ
Bước 1: Nhập các mô-đun cần thiết và định cấu hình Selenium
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--headless")
Bước 2: Khởi tạo Chrome WebDriver
driver = webdriver.Chrome(options=options)
Bước 3: Điều hướng đến trang web mục tiêu
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")
Bước 4: Bấm vào mục Tội phạm & Kinh dị và Trích xuất bản xem trước sách
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")
Bước 5: Xác định hàm trích xuất dữ liệu từ mỗi bản xem trước sách
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}
Bước 6: Lặp lại các bản xem trước, trích xuất dữ liệu và thoát trình điều khiển
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
driver.quit()
Sản lượng dự kiến
Chạy đoạn mã trên sẽ tạo ra một kết quả tương tự như sau:
[
{'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'}
]
Ví dụ về Selenium bổ sung: Chụp ảnh màn hình
Ngoài việc thu thập dữ liệu, Selenium còn có thể được sử dụng để chụp ảnh màn hình các trang web. Đây là ví dụ về cách chụp ảnh màn hình trang web bằng Selenium.
Bước 1: Nhập các mô-đun cần thiết và định cấu hình Selenium
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
Bước 2: Khởi tạo Chrome WebDriver
driver = webdriver.Chrome(options=options)
Bước 3: Điều hướng đến trang web mục tiêu
url = "https://example.com"
driver.get(url)
Bước 4: Chụp ảnh màn hình
driver.save_screenshot("example_screenshot.png")
Bước 5: Thoát khỏi trình điều khiển
driver.quit()
Selenium là một công cụ linh hoạt cho các tác vụ tự động hóa web, bao gồm quét web và chụp ảnh màn hình. Sự hỗ trợ của nó cho nhiều ngôn ngữ lập trình và trình duyệt, cùng với khả năng mở rộng, khiến nó trở thành một lựa chọn mạnh mẽ cho các nhu cầu tự động hóa khác nhau. Cho dù bạn đang trích xuất dữ liệu hay tạo báo cáo, Selenium đều cung cấp các khả năng để tự động hóa nhiệm vụ của bạn một cách hiệu quả.
Puppeteer vs Selenium: So sánh tốc độ
Puppeteer có nhanh hơn Selenium không? Câu trả lời là có—Puppeteer thường nhanh hơn Selenium.
Để so sánh tốc độ của Puppeteer và Selenium, chúng tôi đã sử dụng hộp cát của cửa hàng Danube và chạy các tập lệnh được trình bày trên 20 lần, tính trung bình thời gian thực thi.
Kiểm tra tốc độ Selenium
Chúng tôi đã sử dụng time
mô-đun trong Python để đo thời gian thực thi của tập lệnh Selenium. Thời gian bắt đầu được ghi ở đầu và thời gian kết thúc ở cuối kịch bản. Sự khác biệt giữa những thời điểm này cung cấp tổng thời gian thực hiện.
Đây là tập lệnh hoàn chỉnh được sử dụng cho 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()
Kiểm tra tốc độ múa rối
Đối với tập lệnh Puppeteer, chúng tôi đã sử dụng Date
đối tượng để đo thời gian thực hiện. Thời gian bắt đầu được ghi ở đầu và thời gian kết thúc ở cuối kịch bản. Sự khác biệt giữa những thời điểm này cung cấp tổng thời gian thực hiện.
Đây là tập lệnh hoàn chỉnh được sử dụng cho 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();
Kết quả kiểm tra hiệu suất
Các bài kiểm tra hiệu suất cho thấy Puppeteer nhanh hơn Selenium khoảng 60%. Lợi thế về tốc độ này khiến Puppeteer trở thành lựa chọn phù hợp hơn cho các dự án yêu cầu tự động hóa và quét web tốc độ cao, đặc biệt là khi làm việc với các trình duyệt dựa trên Chrome.
Tóm tắt kết quả tốc độ:
Biểu đồ bên dưới minh họa sự khác biệt về hiệu suất giữa Puppeteer và Selenium:
Mở rộng quy mô ứng dụng Puppeteer cho các dự án yêu cầu quét web nhanh chóng, hiệu quả là lựa chọn tối ưu trong bối cảnh này.
Puppeteer vs Selenium: Cái nào tốt hơn?
Vậy giữa Selenium và Puppeteer cái nào tốt hơn cho việc cạo? Không có câu trả lời trực tiếp cho câu hỏi đó vì nó phụ thuộc vào nhiều yếu tố, chẳng hạn như hỗ trợ thư viện dài hạn, hỗ trợ nhiều trình duyệt và nhu cầu quét web của bạn.
Puppeteer nhanh hơn, nhưng so với Selenium, nó hỗ trợ ít trình duyệt hơn. Selenium cũng hỗ trợ nhiều ngôn ngữ lập trình hơn so với Puppeteer.
Phần kết luận
Mặc dù sử dụng Puppeteer hoặc Selenium là một lựa chọn tốt để quét web, việc mở rộng quy mô và tối ưu hóa dự án quét web của bạn có thể gặp khó khăn vì các biện pháp chống bot nâng cao có thể phát hiện và chặn các thư viện này. Cách tốt nhất để tránh điều này là sử dụng API quét web, như OneProxy.
Sử dụng Puppeteer với máy chủ proxy
Để sử dụng Puppeteer với máy chủ proxy, bạn có thể chuyển cài đặt proxy trong args
tùy chọn khi khởi chạy phiên bản trình duyệt. Đây là một ví dụ:
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();
Sử dụng Selenium với máy chủ proxy
Để sử dụng Selenium với máy chủ proxy, bạn có thể đặt tùy chọn proxy bằng cách sử dụng webdriver.Proxy
lớp học. Đây là một ví dụ:
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()
Sử dụng máy chủ proxy với Puppeteer và Selenium có thể giúp vượt qua các hạn chế dựa trên IP và giảm nguy cơ bị chặn, nâng cao hiệu quả của các tác vụ quét web của bạn. Proxy luân phiên của OneProxy có thể tối ưu hóa hơn nữa quá trình này, mang lại trải nghiệm cạo liền mạch.