به راحتی از سلنیوم با AWS Lambda استفاده کنید

https://www.youtube.com/watch?v=8XBkm9DD6Ic
در این آموزش، من شما را از طریق فرآیند اجرای سلنیوم با ChromeDriver در یک تابع AWS Lambda راهنمایی میکنم. این راهاندازی برای خودکار کردن وظایف اسکراپی وب، آزمایش برنامههای کاربردی وب یا انجام هر کار اتوماسیون مرورگر در فضای ابری مفید است. با کانتینری کردن برنامه ما و استقرار آن در AWS Lambda، ما از یک معماری مقیاسپذیر و بدون سرور اطمینان میدهیم. بیایید به جزئیات بپردازیم.
کاری که ما انجام می دهیم
ما یک ظرف Docker ایجاد خواهیم کرد که شامل تمام وابستگیهای لازم برای اجرای Selenium و ChromeDriver است. این کانتینر به عنوان یک تابع AWS Lambda مستقر خواهد شد. تابع Lambda یک کار ساده را انجام می دهد: جستجوی “OpenAI” در گوگل و برگرداندن عناوین نتایج جستجو.
پیش نیازها
قبل از شروع، مطمئن شوید که:
- یک حساب AWS
- یک حساب GitHub
- Docker Desktop نصب شده است
- AWS CLI پیکربندی شد
قبل از پرداختن به موضوع، از شما دعوت میکنیم که از تلاشهای جاری ما حمایت کنید و پلتفرمهای مختلف ما را که به تقویت پروژههای اینترنت اشیا اختصاص داده شدهاند، بررسی کنید:
- در کانال یوتیوب ما مشترک شوید: با عضویت در کانال ما در YouTube — Shilleh از آخرین آموزش ها و اطلاعات پروژه ما به روز باشید.
- از ما حمایت کنید: حمایت شما ارزشمند است. برای کمک به ما در ادامه تولید محتوای با کیفیت، یک قهوه برای من در Buy Me A Coffee بخرید.
- استخدام خدمات متخصص اینترنت اشیا: برای کمک شخصی در پروژه های اینترنت اشیا، من را در UpWork استخدام کنید.
- وب سایت شیله تک (تخفیفات استثنایی):
https://shillehtek.com/collections/all
فروشگاه آمازون ShillehTek:
فروشگاه آمازون ShillehTek – ایالات متحده
فروشگاه آمازون ShillehTek – کانادا
فروشگاه آمازون ShillehTek – ژاپن
فایل های پروژه
1. main.py
این اسکریپت پایتون تابع Lambda است که از سلنیوم برای انجام اتوماسیون مرورگر استفاده می کند.
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options as ChromeOptions
from tempfile import mkdtemp
def lambda_handler(event, context):
chrome_options = ChromeOptions()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--disable-dev-tools")
chrome_options.add_argument("--no-zygote")
chrome_options.add_argument("--single-process")
chrome_options.add_argument(f"--user-data-dir={mkdtemp()}")
chrome_options.add_argument(f"--data-path={mkdtemp()}")
chrome_options.add_argument(f"--disk-cache-dir={mkdtemp()}")
chrome_options.add_argument("--remote-debugging-pipe")
chrome_options.add_argument("--verbose")
chrome_options.add_argument("--log-path=/tmp")
chrome_options.binary_location = "/opt/chrome/chrome-linux64/chrome"
service = Service(
executable_path="/opt/chrome-driver/chromedriver-linux64/chromedriver",
service_log_path="/tmp/chromedriver.log"
)
driver = webdriver.Chrome(
service=service,
options=chrome_options
)
# Open a webpage
driver.get('https://www.google.com')
# Find the search box
search_box = driver.find_element(By.NAME, 'q')
# Enter a search query
search_box.send_keys('OpenAI')
# Submit the search query
search_box.send_keys(Keys.RETURN)
# Wait for the results to load
time.sleep(2)
# Get the results
results = driver.find_elements(By.CSS_SELECTOR, 'div.g')
# Print the titles of the results
titles = [result.find_element(By.TAG_NAME, 'h3').text for result in results]
# Close the WebDriver
driver.quit()
return {
'statusCode': 200,
'body': titles
}
توضیح:
- chrome_options: Chrome را به گونهای پیکربندی میکند که بدون هد اجرا شود و آن را برای یک محیط کانتینری بهینه میکند.
- driver.get: به Google هدایت می شود.
- search_box: ورودی جستجو را مییابد، «OpenAI» را وارد میکند و فرم را ارسال میکند.
- نتایج: عناوین نتایج جستجو را استخراج و چاپ می کند.
2. Dockerfile
این Dockerfile یک تصویر با تمام وابستگی های مورد نیاز برای اجرای Selenium با ChromeDriver ایجاد می کند.
FROM amazon/aws-lambda-python:3.12
# Install chrome dependencies
RUN dnf install -y atk cups-libs gtk3 libXcomposite alsa-lib \
libXcursor libXdamage libXext libXi libXrandr libXScrnSaver \
libXtst pango at-spi2-atk libXt xorg-x11-server-Xvfb \
xorg-x11-xauth dbus-glib dbus-glib-devel nss mesa-libgbm jq unzip
# Copy and run the chrome installer script
COPY ./chrome-installer.sh ./chrome-installer.sh
RUN chmod +x ./chrome-installer.sh
RUN ./chrome-installer.sh
RUN rm ./chrome-installer.sh
# Install selenium
RUN pip install selenium
# Copy the main application code
COPY main.py ./
# Command to run the Lambda function
CMD [ "main.lambda_handler" ]
توضیح:
- FROM amazon/aws-lambda-python:3.12: از تصویر پایه AWS Lambda برای Python 3.12 استفاده می کند.
- RUN dnf install -y: وابستگی های لازم برای اجرای Chrome را نصب می کند.
- COPY ./chrome-installer.sh: اسکریپت نصب کننده Chrome را در تصویر کپی می کند.
- RUN ./chrome-installer.sh: اسکریپت را برای نصب Chrome و ChromeDriver اجرا می کند.
- RUN pip install selenium: بسته Selenium Python را نصب می کند.
- COPY main.py: اسکریپت main.py را در تصویر کپی می کند.
- CMD [ “main.lambda_handler” ]: دستور اجرای تابع Lambda را مشخص می کند.
3. chrome-installer.sh
این اسکریپت آخرین نسخههای Chrome و ChromeDriver را نصب میکند.
#!/bin/bash
set -e
latest_stable_json="https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json"
# Retrieve the JSON data using curl
json_data=$(curl -s "$latest_stable_json")
latest_chrome_linux_download_url="$(echo "$json_data" | jq -r ".channels.Stable.downloads.chrome[0].url")"
latest_chrome_driver_linux_download_url="$(echo "$json_data" | jq -r ".channels.Stable.downloads.chromedriver[0].url")"
download_path_chrome_linux="/opt/chrome-headless-shell-linux.zip"
download_path_chrome_driver_linux="/opt/chrome-driver-linux.zip"
mkdir -p "/opt/chrome"
curl -Lo $download_path_chrome_linux $latest_chrome_linux_download_url
unzip -q $download_path_chrome_linux -d "/opt/chrome"
rm -rf $download_path_chrome_linux
mkdir -p "/opt/chrome-driver"
curl -Lo $download_path_chrome_driver_linux $latest_chrome_driver_linux_download_url
unzip -q $download_path_chrome_driver_linux -d "/opt/chrome-driver"
rm -rf $download_path_chrome_driver_linux
*توضیح:
*
- curl -s: آخرین نسخههای پایدار Chrome و ChromeDriver را واکشی میکند.
- mkdir -p: دایرکتوری هایی را برای ذخیره فایل های دانلود شده ایجاد می کند.
- unzip -q: فایل های دانلود شده را به دایرکتوری های مشخص شده استخراج می کند.
ساختن، برچسب گذاری، و فشار دادن تصویر داکر
ساخت تصویر داکر:
- docker build -t selenium-chrome-driver .
تصویر داکر را تگ کنید:
- docker tag selenium-chrome-driver .dkr.ecr.us-east-1.amazonaws.com/docker-images:v1.0.0
تصویر Docker را به AWS ECR فشار دهید:
-
aws ecr get-login-password –region us-east-1 | ورود به سیستم داکر — نام کاربری AWS –password-stdin .dkr.ecr.us-east-1.amazonaws.com/docker-images
-
docker push .dkr.ecr.us-east-1.amazonaws.com/docker-images:v1.0.0
توضیح:
- docker build: تصویر Docker را از Dockerfile می سازد.
- تگ docker: تصویر را با یک نسخه خاص برچسب گذاری می کند.
- docker push: تصویر را به مخزن مشخص شده AWS ECR می برد.
- استقرار تابع لامبدا
پس از فشار دادن تصویر به AWS ECR، می توانید آن را با استفاده از AWS Lambda مستقر کنید. مطمئن شوید که به AWS وارد شده اید و مجوزهای لازم را دارید.
منابع پیکربندی را در ظرف افزایش دهید تا حافظه آن تمام نشود یا تمام نشود.
پس از اجرای یک رویداد آزمایشی، خروجی موفقی را مشاهده می کنیم! کار کرد 🙂
نتیجه
در این مقاله، فرآیند راهاندازی سلنیوم با ChromeDriver در عملکرد AWS Lambda با استفاده از Docker را بررسی کردیم. این رویکرد به شما امکان می دهد از قدرت سلنیوم برای اتوماسیون مرورگر در یک محیط بدون سرور استفاده کنید و از مقیاس پذیری و کارایی اطمینان حاصل کنید. با کانتینری کردن برنامه، می توانید وابستگی ها را به طور مؤثرتری مدیریت کنید و به طور یکپارچه در AWS Lambda مستقر شوید.
با خیال راحت این تنظیمات را برای نیازهای اتوماسیون مرورگر خود آزمایش کرده و گسترش دهید. موفق باشید و اشتراک یا حمایت را فراموش نکنید!