خراش وب با Puppeteer و Python: راهنمای توسعه دهنده

وب سایت های مدرن و سنگین جاوا اسکریپت اغلب به ابزارهایی احتیاج دارند که می توانند مانند یک کاربر واقعی با محتوای پویا در تعامل باشند. عروسک، یک کتابخانه Node.js توسط Google ، یک نیروگاه برای اتوماسیون مرورگر است – اما اگر می خواهید به جای JavaScript از پایتون استفاده کنید ، چه می کنید؟ در این راهنما ، ما با کاوش شکاف را به وجود می آوریم پپتر، یک بندر غیررسمی پایتون عروسک ، و نشان می دهد که چگونه توسعه دهندگان پایتون می توانند از قابلیت های خود برای خراش دادن وب استفاده کنند.
چرا Puppeteer (و Pyppeteer)؟
Puppeteer مشهور است:
- کنترل مرورگرهای کروم/کروم بدون سر.
- رسیدگی به رندر ، کلیک ، ارسال فرم و تصاویر.
- اشکال زدایی و تجزیه و تحلیل عملکرد.
پپتر این ویژگی ها را به پایتون می آورد و یک API آشنا را برای توسعه دهندگان که پایتون را از جاوا اسکریپت ترجیح می دهند ، ارائه می دهد. در حالی که به طور رسمی نگهداری نمی شود ، هنوز هم برای کارهایی مانند:
- ضبط برنامه های تک صفحه ای (SPA).
- خودکار ورود به سیستم و تعامل.
- تولید PDF یا تصاویر.
شروع با pyppeteer
1. PYPPETEER را نصب کنید
pip install pyppeteer
2. یک مرورگر راه اندازی کنید
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(headless=False) # Set headless=True for background
page = await browser.newPage()
await page.goto('https://example.com')
print(await page.title())
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
یادداشت: PYPPETEER به طور خودکار Chromium را در اولین اجرا بارگیری می کند.
گردش کار اصلی خراش وب
بیایید داده های محصول را از یک سایت تجارت الکترونیکی نمایشی جدا کنیم.
مرحله 1: محتوای پویا را استخراج کنید
async def scrape_products():
browser = await launch(headless=True)
page = await browser.newPage()
await page.goto('https://webscraper.io/test-sites/e-commerce/allinone')
# Wait for product elements to load
await page.waitForSelector('.thumbnail')
# Extract titles and prices
products = await page.querySelectorAll('.thumbnail')
for product in products:
title = await product.querySelectorEval('.title', 'el => el.textContent')
price = await product.querySelectorEval('.price', 'el => el.textContent')
print(f"{title.strip()}: {price.strip()}")
await browser.close()
asyncio.get_event_loop().run_until_complete(scrape_products())
مرحله 2: رسیدگی به صفحه بندی
برای بارگذاری مطالب بیشتر روی دکمه ها یا پیمایش کلیک کنید:
# Click a "Next" button
await page.click('button:contains("Next")')
# Scroll to trigger lazy loading
await page.evaluate('window.scrollTo(0, document.body.scrollHeight)')
await page.waitForTimeout(2000) # Wait for content to load
تکنیک های پیشرفته
1. ورود به سیستم خودکار
async def login():
browser = await launch(headless=False)
page = await browser.newPage()
await page.goto('https://example.com/login')
# Fill credentials
await page.type('#username', 'your_email@test.com')
await page.type('#password', 'secure_password')
# Submit form
await page.click('#submit-button')
await page.waitForNavigation()
# Verify login success
await page.waitForSelector('.dashboard')
print("Logged in successfully!")
await browser.close()
2. درخواست های شبکه را رهگیری کنید
ضبط پاسخ های API یا منابع بلوک (به عنوان مثال ، تصاویر):
async def intercept_requests():
browser = await launch()
page = await browser.newPage()
# Block images to speed up scraping
await page.setRequestInterception(True)
async def block_images(request):
if request.resourceType in ['image', 'stylesheet']:
await request.abort()
else:
await request.continue_()
page.on('request', block_images)
await page.goto('https://example.com')
await browser.close()
3. تصاویر/PDF را تولید کنید
await page.screenshot({'path': 'screenshot.png', 'fullPage': True})
await page.pdf({'path': 'page.pdf', 'format': 'A4'})
بهترین روشها
-
از تشخیص خودداری کنید:
- از افزونه های مخفی استفاده کنید (به عنوان مثال ،
pyppeteer-stealth
). - نمایندگان کاربر را بچرخانید:
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64)')
- از افزونه های مخفی استفاده کنید (به عنوان مثال ،
- رفتار انسان را با تأخیرهای تصادفی تقلید می کند.
- رسیدگی به خطا:
try:
await page.goto('https://unstable-site.com')
except Exception as e:
print(f"Error: {e}")
- پشتیبانی پروکسی:
browser = await launch(args=['--proxy-server=http://proxy-ip:port'])
pyppeteer در مقابل گزینه های دیگر
ابزار | زبان | بهترین برای |
---|---|---|
پپتر | پیتون | گردش کار ساده مانند عروسک |
نمایشنامه نویس | پیتون | اتوماسیون مدرن مرورگر متقاطع |
سلنیوم | پیتون | پشتیبانی مرورگر میراث |
چه زمانی از pyppeteer استفاده کنید:
- شما به ویژگی های شبیه به Puppeteer در پایتون نیاز دارید.
- پروژه های سبک وزن که در آن نمایشنامه نویس/scropy بیش از حد است.
محدودیت ها:
- درگاه غیررسمی (به روزرسانی ها ممکن است از Puppeteer عقب مانده باشد).
- پشتیبانی محدود جامعه.
موارد استفاده در دنیای واقعی
- نظارت بر تجارت الکترونیکی: قیمت ها در سایت های React/Angular.
- اتوماسیون رسانه های اجتماعی: پست های عمومی را از سیستم عامل هایی مانند اینستاگرام خراش دهید.
- استخراج داده ها از داشبورد: داده ها را از ابزارهای تحلیلی معتبر بکشید.
- تست خودکار: گردش کار UI را در طول توسعه تأیید کنید.
پایان
PYPPETEER قابلیت های اتوماسیون قدرتمند مرورگر Puppeteer را به پایتون می آورد و آن را به یک انتخاب محکم برای خراش دادن سایت های سنگین جاوا اسکریپت تبدیل می کند. در حالی که فاقد استحکام نمایشنامه نویس یا سلنیوم است ، سادگی و API مانند عروسک های آن ، آن را برای توسعه دهندگان پایتون با محتوای پویا ایده آل می کند.
مراحل بعدی:
برای نوک: همیشه یک وب سایت را بررسی کنید robots.txt
و شرایط خدمات قبل از خراش دادن. وقتی شک دارید ، از API های رسمی استفاده کنید!
خراش مبارک! 🚀