آیا می خواهید بین Puppeteer و Selenium برای خراش دادن وب تصمیم بگیرید؟ هر دو چارچوب اتوماسیون مرورگر قدرتمندی هستند و انتخاب درست به نیازهای خاص خراش و منابع موجود شما بستگی دارد.
برای کمک به شما در تصمیم گیری آگاهانه، تفاوت های کلیدی بین Puppeteer و Selenium را در جدول زیر برجسته کرده ایم. پس از آن، جزئیات را بررسی می کنیم و یک مثال خراش دادن برای هر چارچوب ارائه می کنیم تا اثربخشی آنها را در استخراج داده ها از صفحات وب نشان دهیم.
شاخص | عروسک گردان | سلنیوم |
---|---|---|
زبان های سازگار | فقط جاوا اسکریپت به طور رسمی پشتیبانی می شود، اما پورت های غیر رسمی PHP و Python وجود دارد | جاوا، پایتون، C#، روبی، پی اچ پی، جاوا اسکریپت و کاتلین |
پشتیبانی مرورگر | پشتیبانی از کرومیوم و آزمایشی فایرفاکس | کروم، سافاری، فایرفاکس، اپرا، اج و اینترنت اکسپلورر |
کارایی | 60% سریعتر از سلنیوم | سریع |
پشتیبانی از سیستم عامل | ویندوز، لینوکس و macOS | ویندوز، لینوکس، macOS و Solaris |
معماری | معماری رویداد محور با نمونه های مرورگر بدون سر | پروتکل JSONWire در درایور وب برای کنترل نمونه مرورگر |
پیش نیازها | بسته جاوا اسکریپت کافی است | Selenium Bindings (برای زبان برنامه نویسی انتخاب شده) و درایورهای وب مرورگر |
انجمن | جامعه کوچکتر در مقایسه با سلنیوم | اسناد تثبیت شده و یک جامعه بزرگ |
بیایید به بحث درباره این کتابخانهها به تفصیل ادامه دهیم و یک مثال خراش دادن با هرکدام برای نشان دادن کارایی آنها در استخراج دادهها از یک صفحه وب انجام دهیم.
عروسک گردان
عروسک گردان یک کتابخانه Node.js است که یک API سطح بالا برای کنترل Chrome یا Chromium از طریق پروتکل DevTools ارائه می دهد. این برای خودکارسازی وظایف در Chrome یا Chromium، مانند گرفتن اسکرین شات، تولید PDF، و پیمایش صفحات طراحی شده است.
Puppeteer همچنین می تواند برای آزمایش صفحات وب با شبیه سازی تعاملات کاربر مانند کلیک کردن روی دکمه ها، پر کردن فرم ها و تأیید نتایج نمایش داده شده استفاده شود.
مزایای Puppeteer
- راحتی در استفاده: استفاده ساده و سرراست.
- همراه با Chromium: نیازی به تنظیم اضافی نیست.
- حالت بدون سر: به طور پیش فرض در حالت هدلس اجرا می شود اما می توان آن را برای اجرا در حالت کامل مرورگر پیکربندی کرد.
- معماری رویداد محور: نیاز به تماس های خواب دستی در کد شما را از بین می برد.
- قابلیت های جامع: می تواند اسکرین شات بگیرد، پی دی اف تولید کند و تمام اقدامات مرورگر را خودکار کند.
- مدیریت اجرایی: ابزارهایی را برای ضبط زمان اجرا و عملکرد بارگذاری برای بهینه سازی و اشکال زدایی اسکراپر ارائه می دهد.
- SPA Crawling: قابلیت خزیدن اپلیکیشن های تک صفحه ای (SPA) و تولید محتوای از پیش رندر شده (رندر سمت سرور).
- ضبط اسکریپت: امکان ایجاد اسکریپت های Puppeteer را با ضبط اقدامات در مرورگر با استفاده از کنسول DevTools می دهد.
معایب عروسک گردانی
- پشتیبانی محدود از مرورگر: در مقایسه با سلنیوم از مرورگرهای کمتری پشتیبانی می کند.
- جاوا اسکریپت متمرکز: در درجه اول از جاوا اسکریپت پشتیبانی می کند، اگرچه پورت های غیر رسمی برای Python و PHP وجود دارد.
مثال خراش دادن وب با Puppeteer
بیایید آموزش خراش دادن وب Puppeteer را برای استخراج موارد از دسته جنایی و هیجان انگیز وب سایت دانوب مرور کنیم.
فروشگاه دانوب: جنایی و هیجان انگیز
برای شروع، ماژول Puppeteer را وارد کرده و یک تابع ناهمزمان برای اجرای کد 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();
خروجی مورد انتظار
وقتی کد را اجرا می کنید، خروجی باید شبیه زیر باشد:
[
{
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'
}
]
مثال دیگری از استفاده از Puppeteer
علاوه بر خراش دادن داده ها از صفحات وب، Puppeteer می تواند برای انواع کارهای اتوماسیون نیز استفاده شود. یکی از موارد استفاده رایج این است که یک PDF از یک صفحه وب ایجاد کنید. بیایید مثالی را مرور کنیم که در آن Puppeteer برای تولید PDF از یک صفحه وب استفاده می شود.
تولید PDF با Puppeteer
مرحله 1: Puppeteer را وارد کنید و یک تابع ناهمزمان ایجاد کنید
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();
گزینه های اضافی عروسک گردان
Puppeteer چندین گزینه برای تولید PDF ارائه می دهد که می تواند مطابق با نیازهای شما سفارشی شود. در اینجا برخی از گزینه هایی است که می توانید استفاده کنید:
path
: مسیر فایل برای ذخیره PDF.format
: فرمت کاغذ (به عنوان مثال، 'A4'، 'Letter').printBackground
: شامل گرافیک پسزمینه باشد.landscape
: تنظیم کنیدtrue
برای جهت گیری منظرهmargin
: حاشیه هایی را برای PDF (بالا، راست، پایین، چپ) مشخص کنید.
مثال با گزینه های اضافی:
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();
خروجی نمونه
با اجرای کد بالا یک فایل PDF با نام ایجاد می شود example.pdf
در فهرست فعلی با محتویات صفحه وب https://example.com
.
Puppeteer یک ابزار همه کاره برای کارهای اتوماسیون وب، از خراش دادن داده ها تا تولید PDF است. سهولت استفاده و ویژگی های قدرتمند آن را به انتخابی عالی برای خودکارسازی طیف وسیعی از فعالیت های مرورگر تبدیل کرده است. چه در حال جمع کردن داده ها، تولید گزارش یا آزمایش صفحات وب باشید، Puppeteer ابزارهایی را که برای انجام کارها به آن نیاز دارید، فراهم می کند.
سلنیوم
سلنیوم یک ابزار متن باز تست سرتاسر و اتوماسیون وب است که اغلب برای خراش دادن وب استفاده می شود. اجزای اصلی آن عبارتند از Selenium IDE، Selenium WebDriver و Selenium Grid.
- سلنیوم IDE: برای ضبط اقدامات قبل از خودکار کردن آنها استفاده می شود.
- سلنیوم وب درایور: دستورات را در مرورگر اجرا می کند.
- شبکه سلنیوم: اجرای موازی را فعال می کند.
مزایای سلنیوم
- راحتی در استفاده: استفاده ساده و سرراست.
- پشتیبانی از زبان: پشتیبانی از زبان های برنامه نویسی مختلف مانند پایتون، جاوا، جاوا اسکریپت، روبی و C#.
- اتوماسیون مرورگر: می تواند مرورگرهایی مانند Firefox، Edge، Safari و حتی مرورگرهای سفارشی QtWebKit را خودکار کند.
- مقیاس پذیری: با استفاده از سرورهای ابری با تنظیمات مختلف مرورگر، میتوان سلنیوم را به صدها نمونه مقیاس کرد.
- کراس پلتفرم: روی ویندوز، macOS و لینوکس کار می کند.
مضرات سلنیوم
- راه اندازی پیچیده: روش های تنظیم سلنیوم می تواند پیچیده باشد.
نمونه خراش دادن وب با سلنیوم
مانند Puppeteer، بیایید آموزش خراش دادن وب با سلنیوم را با استفاده از همان سایت هدف مرور کنیم. ما پیش نمایش کتاب را از دسته جنایی و هیجان انگیز وب سایت دانوب استخراج می کنیم.
فروشگاه دانوب: جنایی و هیجان انگیز
مرحله 1: ماژول های لازم را وارد کنید و سلنیوم را پیکربندی کنید
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
options = webdriver.ChromeOptions()
options.add_argument("--headless")
مرحله 2: Chrome WebDriver را راه اندازی کنید
driver = webdriver.Chrome(options=options)
مرحله 3: به وب سایت هدف بروید
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")
مرحله 4: بر روی 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)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")
مرحله 5: یک تابع برای استخراج داده ها از هر پیش نمایش کتاب تعریف کنید
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}
مرحله 6: از طریق پیش نمایش ها حلقه بزنید، داده ها را استخراج کنید و از درایور خارج شوید
extracted_data = []
for element in books:
data = extract(element)
extracted_data.append(data)
print(extracted_data)
driver.quit()
خروجی مورد انتظار
با اجرای کد بالا خروجی مشابه زیر تولید می شود:
[
{'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'}
]
مثال سلنیوم اضافی: گرفتن اسکرین شات
علاوه بر خراش دادن داده ها، سلنیوم می تواند برای گرفتن اسکرین شات از صفحات وب نیز استفاده شود. در اینجا مثالی از نحوه گرفتن اسکرین شات از یک صفحه وب با استفاده از سلنیوم آورده شده است.
مرحله 1: ماژول های لازم را وارد کنید و سلنیوم را پیکربندی کنید
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--headless")
مرحله 2: Chrome WebDriver را راه اندازی کنید
driver = webdriver.Chrome(options=options)
مرحله 3: به وب سایت هدف بروید
url = "https://example.com"
driver.get(url)
مرحله 4: یک اسکرین شات بگیرید
driver.save_screenshot("example_screenshot.png")
مرحله 5: از Driver خارج شوید
driver.quit()
سلنیوم یک ابزار همه کاره برای کارهای اتوماسیون وب، از جمله خراش دادن وب و گرفتن اسکرین شات است. پشتیبانی آن از چندین زبان برنامه نویسی و مرورگرها، همراه با مقیاس پذیری آن، آن را به گزینه ای قدرتمند برای نیازهای مختلف اتوماسیون تبدیل می کند. چه در حال استخراج دادهها یا تولید گزارش باشید، سلنیوم قابلیتهایی را برای خودکارسازی وظایف شما به طور موثر فراهم میکند.
عروسک گردان در مقابل سلنیوم: مقایسه سرعت
آیا Puppeteer سریعتر از سلنیوم است؟ پاسخ این است که بله - Puppeteer به طور کلی سریعتر از سلنیوم است.
برای مقایسه سرعت Puppeteer و Selenium، از sandbox فروشگاه Danube استفاده کردیم و اسکریپتهای ارائه شده در بالای ۲۰ بار را اجرا کردیم، میانگین زمانهای اجرا را در نظر گرفتیم.
تست سرعت سلنیوم
ما استفاده کردیم time
ماژول در پایتون برای اندازه گیری زمان اجرای اسکریپت سلنیوم. زمان شروع در ابتدا و زمان پایان در پایان فیلمنامه ثبت شد. تفاوت بین این زمان ها کل مدت زمان اجرا را ارائه می دهد.
در اینجا اسکریپت کامل مورد استفاده برای سلنیوم آمده است:
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()
تست سرعت عروسک گردان
برای فیلمنامه Puppeteer، ما از آن استفاده کردیم Date
شی برای اندازه گیری زمان اجرا. زمان شروع در ابتدا و زمان پایان در پایان فیلمنامه ثبت شد. تفاوت بین این زمان ها کل مدت زمان اجرا را ارائه می دهد.
در اینجا اسکریپت کامل مورد استفاده برای 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();
نتایج تست عملکرد
آزمایشات عملکرد نشان داد که Puppeteer حدود 60% سریعتر از سلنیوم است. این مزیت سرعت، Puppeteer را به انتخاب مناسب تری برای پروژه هایی که نیاز به اسکراپینگ و اتوماسیون وب با سرعت بالا دارند، به خصوص هنگام کار با مرورگرهای مبتنی بر Chromium تبدیل می کند.
خلاصه نتایج سرعت:
نمودار زیر تفاوت عملکرد بین Puppeteer و Selenium را نشان می دهد:
افزایش مقیاس برنامه های Puppeteer برای پروژه هایی که نیاز به خراش دادن سریع و کارآمد وب دارند، انتخاب بهینه در این زمینه است.
عروسک گردان در مقابل سلنیوم: کدام بهتر است؟
پس کدام یک از سلنیوم و Puppeteer برای خراش دادن بهتر است؟ پاسخ مستقیمی برای این سوال وجود ندارد زیرا به عوامل متعددی مانند پشتیبانی طولانی مدت از کتابخانه، پشتیبانی از مرورگرهای متقابل و نیازهای شما برای خراش دادن وب بستگی دارد.
Puppeteer سریعتر است، اما در مقایسه با Selenium، از مرورگرهای کمتری پشتیبانی می کند. Selenium همچنین از زبان های برنامه نویسی بیشتری در مقایسه با Puppeteer پشتیبانی می کند.
نتیجه
اگرچه استفاده از Puppeteer یا Selenium گزینه خوبی برای خراش دادن وب است، اما افزایش مقیاس و بهینه سازی پروژه خراش وب شما می تواند چالش برانگیز باشد زیرا اقدامات پیشرفته ضد ربات می تواند این کتابخانه ها را شناسایی و مسدود کند. بهترین راه برای جلوگیری از این امر استفاده از یک API scraping وب مانند OneProxy است.
استفاده از Puppeteer با سرورهای پروکسی
برای استفاده از Puppeteer با سرور پراکسی، میتوانید تنظیمات پروکسی را در قسمت ارسال کنید args
گزینه هنگام راه اندازی نمونه مرورگر. در اینجا یک مثال است:
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();
استفاده از سلنیوم با سرورهای پراکسی
برای استفاده از سلنیوم با سرور پراکسی، میتوانید گزینههای پراکسی را با استفاده از webdriver.Proxy
کلاس در اینجا یک مثال است:
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()
استفاده از سرورهای پراکسی با Puppeteer و Selenium میتواند به دور زدن محدودیتهای مبتنی بر IP و کاهش خطر مسدود شدن کمک کند و کارایی وظایف اسکراپی وب شما را افزایش دهد. پراکسی های چرخان OneProxy می تواند این فرآیند را بیشتر بهینه کند و یک تجربه خراشیدن بدون درز را ارائه دهد.