Skip to content
Advanced / 4 min read

چگونه پروکسی‌های مسکونی IPRoyal را با Playwright روی لینوکس برای اسکرپینگ وب روتیت کنیم

از پروکسی‌های مسکونی IPRoyal با Playwright روی لینوکس برای اسکرپینگ مبتنی بر مرورگر استفاده کنید. این آموزش پیشرفته شامل endpointهای HTTP و SOCKS5، نشست‌های چسبنده، هدف‌گیری کشوری، چرخش و تأیید است.

لینوکس SOCKS5 HTTP(S) وب اسکرپینگ

چگونه پروکسی‌های مسکونی IPRoyal را با Playwright روی لینوکس برای اسکرپینگ وب روتیت کنیم

مرور کلی

Playwright یک فریم‌ورک اتوماسیون مرورگر است که می‌تواند Chromium، Firefox و WebKit را کنترل کند. برای اسکرپینگ وب، اتوماسیون مرورگر زمانی مفید است که سایت هدف به JavaScript، کوکی‌ها یا رندر پویا وابسته باشد. پروکسی‌های مسکونی IPRoyal به شما IPهای چرخشی از یک استخر بزرگ می‌دهند، و IPRoyal همچنین پروکسی‌های دیتاسنتر و ISP را با مبادلات مختلف ارائه می‌دهد. این آموزش نشان می‌دهد چگونه Playwright را روی لینوکس به پروکسی‌های مسکونی IPRoyal از طریق HTTP یا SOCKS5 متصل کنید، نشست‌ها را روتیت کنید، از نشست‌های چسبنده استفاده کنید، هدف‌گیری جغرافیایی را اعمال کنید، و IP خروجی را تأیید کنید. این مطلب برای کارهای پیشرفته اتوماسیون مرورگر نوشته شده است که در آن شما از قبل Python، کد async و احراز هویت پایه پروکسی را می‌فهمید.

پیش‌نیازها

  • یک ماشین لینوکس یا سرور لینوکس با محیط دسکتاپ یا هدلس.
  • Python 3.10 یا جدیدتر.
  • یک حساب IPRoyal با اعتبارنامه‌های پروکسی مسکونی از داشبورد IPRoyal.
  • هاست، پورت، نام کاربری و رمز عبور برای endpoint پروکسی IPRoyal شما.
  • آشنایی پایه با Python، async/await و Playwright.
  • مجوز برای اسکرپینگ سایت هدف، و بررسی شرایط و robots.txt آن.

چگونه Playwright از پروکسی‌های IPRoyal استفاده می‌کند

Playwright می‌تواند ترافیک را از طریق یک پروکسی در سطح راه‌اندازی مرورگر یا در سطح context مرورگر ارسال کند. پروکسی‌های مسکونی IPRoyal از احراز هویت نام کاربری/رمز عبور استفاده می‌کنند. پارامترهای دقیق هاست، پورت و نام کاربری از داشبورد IPRoyal شما می‌آیند.

از جدول زیر برای انتخاب مقدار server در Playwright استفاده کنید:

نوع پروکسی IPRoyal مقدار server در Playwright یادداشت‌ها
Residential HTTP/HTTPS http://HOST:PORT انتخاب رایج برای اتوماسیون مرورگر؛ با اهداف HTTPS کار می‌کند.
Residential SOCKS5 socks5://HOST:PORT اگر پلن IPRoyal شما endpoint SOCKS5 را ارائه می‌دهد یا SOCKS5 را فعال کرده‌اید استفاده کنید.
Datacenter http://HOST:PORT یا socks5://HOST:PORT سریع‌تر و ارزان‌تر، اما احتمال مسدود شدن در اهداف حساس بیشتر است.
ISP http://HOST:PORT یا socks5://HOST:PORT گزینه‌های IP استاتیک یا چسبنده می‌توانند در گردش‌کارهای وارد‌شده کمک کنند.
Shadowsocks شنونده SOCKS5 محلی Playwright مستقیماً Shadowsocks را پشتیبانی نمی‌کند. یک کلاینت Shadowsocks محلی اجرا کنید و Playwright را به پورت SOCKS5 آن اشاره دهید.

IPRoyal پروتکل‌های HTTP، SOCKS5 و Shadowsocks را در میان پروتکل‌های پشتیبانی‌شده خود فهرست می‌کند، بنابراین می‌توانید بعداً اتوماسیون مرورگر را با ابزارهای دیگر ترکیب کنید.

مراحل

۱. نصب Playwright و Chromium روی لینوکس

یک محیط Python ایزوله ایجاد کنید و Playwright را همراه با Chromium نصب کنید.

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install playwright python-dotenv
python -m playwright install --with-deps chromium

پرچم --with-deps کتابخانه‌های سیستمی مورد نیاز Chromium را روی Debian و Ubuntu نصب می‌کند. روی توزیع‌های دیگر، وابستگی‌های معادل Chromium را نصب کنید یا از ایمیج Docker Playwright استفاده کنید.

۲. ذخیره امن اعتبارنامه‌های پروکسی IPRoyal

یک فایل .env در پوشه پروژه خود ایجاد کنید. آن را در کنترل نسخه commit نکنید.

IPROYAL_PROXY_HOST=your-iproyal-host
IPROYAL_PROXY_PORT=your-iproyal-port
IPROYAL_PROXY_USER=your-iproyal-username
IPROYAL_PROXY_PASS=your-iproyal-password
IPROYAL_PROXY_SCHEME=http

از مقادیر دقیق داشبورد IPRoyal خود استفاده کنید. IPROYAL_PROXY_SCHEME را برای endpointهای HTTP/HTTPS روی http یا برای endpointهای SOCKS5 روی socks5 تنظیم کنید.

۳. ساخت یک هلپر پروکسی قابل استفاده مجدد

فایل proxy_config.py را ایجاد کنید. این هلپر اعتبارنامه‌های شما را می‌خواند و دیکشنری مورد انتظار Playwright را می‌سازد.

import os
from dataclasses import dataclass
from dotenv import load_dotenv

load_dotenv()

@dataclass(frozen=True)
class ProxyConfig:
    server: str
    username: str
    password: str

def iproyal_proxy(
    session_id: str | None = None,
    country: str | None = None,
) -> ProxyConfig:
    '''
    Build a Playwright proxy dict for IPRoyal.

    The session and country syntax must match your IPRoyal dashboard.
    The examples below show common patterns only. Replace the f-strings
    with the exact format IPRoyal gives you.
    '''
    host = os.environ['IPROYAL_PROXY_HOST']
    port = os.environ['IPROYAL_PROXY_PORT']
    scheme = os.environ.get('IPROYAL_PROXY_SCHEME', 'http')
    username = os.environ['IPROYAL_PROXY_USER']
    password = os.environ['IPROYAL_PROXY_PASS']

    if country:
        # Example pattern only. Check your IPRoyal dashboard for the exact syntax.
        username = f'{username}-country-{country}'
    if session_id:
        # Example pattern only. Sticky sessions usually attach a session token.
        username = f'{username}-session-{session_id}'

    return ProxyConfig(
        server=f'{scheme}://{host}:{port}',
        username=username,
        password=password,
    )

اگر نام کاربری IPRoyal شما از قبل شامل پارامترهای هدف‌گیری است، آن‌ها را تکراری نکنید. از قالبی که در داشبورد نشان داده شده استفاده کنید و هلپر را تطبیق دهید.

۴. اجرای Playwright با یک پروکسی IPRoyal در حال چرخش

فایل browser_check.py را ایجاد کنید. Chromium را با پروکسی اجرا کنید و IP خروجی را تأیید کنید.

import asyncio
from playwright.async_api import async_playwright
from proxy_config import iproyal_proxy

async def main() -> None:
    proxy = iproyal_proxy()
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True,
            proxy={
                'server': proxy.server,
                'username': proxy.username,
                'password': proxy.password,
            },
        )
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
        print(await page.locator('body').inner_text())
        await browser.close()

if __name__ == '__main__':
    asyncio.run(main())

آن را با این دستور اجرا کنید:

python browser_check.py

اگر پاسخ JSON آدرسی غیر از IP خودتان را نشان می‌دهد، پروکسی کار می‌کند. اگر session ID را حذف کنید، یک endpoint مسکونی چرخشی باید در درخواست‌ها یا نشست‌های جدید IPهای متفاوتی برگرداند.

۵. افزودن نشست‌های چسبنده برای جریان‌های چندمرحله‌ای

برخی گردش‌کارها، مانند پر کردن سبد خرید یا تکمیل یک فرم چندمرحله‌ای، به IP خروجی یکسان برای چندین درخواست نیاز دارند. از یک توکن نشست چسبنده از داشبورد IPRoyal خود استفاده کنید.

async def sticky_session_example() -> None:
    proxy = iproyal_proxy(session_id='checkout-001')
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=True,
            proxy={
                'server': proxy.server,
                'username': proxy.username,
                'password': proxy.password,
            },
        )
        context = await browser.new_context()
        page = await context.new_page()
        await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
        print(await page.locator('body').inner_text())
        await browser.close()

در کل گردش‌کار، همان session_id را نگه دارید. وقتی IP خروجی جدید می‌خواهید، از session ID جدید استفاده کنید. طول عمر و در دسترس بودن نشست چسبنده به پلن IPRoyal و تنظیمات داشبورد شما بستگی دارد.

۶. اعمال هدف‌گیری کشوری و شهری

هدف‌گیری کشوری معمولاً از طریق نام کاربری پروکسی منتقل می‌شود. از کد کشور و قالب پارامتر دقیق از داشبورد IPRoyal خود استفاده کنید.

proxy = iproyal_proxy(country='us')

اگر IPRoyal برای پلن شما هدف‌گیری در سطح شهر را فراهم می‌کند، آن را در همان جایی که پارامتر کشور را اضافه می‌کنید، اضافه کنید. قالب را حدس نزنید؛ آن را از داشبورد کپی کنید. نتیجه را با بررسی IP خروجی با یک سرویس مکان‌یابی IP تأیید کنید.

۷. چرخش میان contextهای همزمان مرورگر

برای اسکرپینگ موازی، یک نمونه مرورگر را دوباره استفاده کنید و برای هر پیکربندی پروکسی یک context جدید بسازید. این کار سبک‌تر از اجرای یک مرورگر جدید برای هر درخواست است.

import asyncio
from playwright.async_api import async_playwright
from proxy_config import iproyal_proxy

async def scrape_with_contexts(urls: list[str]) -> list[str]:
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)

        async def one(url: str, idx: int) -> str:
            proxy = iproyal_proxy(session_id=f'job-{idx}')
            context = await browser.new_context(
                proxy={
                    'server': proxy.server,
                    'username': proxy.username,
                    'password': proxy.password,
                }
            )
            page = await context.new_page()
            await page.goto(url, wait_until='domcontentloaded', timeout=60000)
            title = await page.title()
            await context.close()
            return title

        results = await asyncio.gather(*(one(url, i) for i, url in enumerate(urls)))
        await browser.close()
        return results

با همزمانی پایین شروع کنید، نرخ مسدودسازی را پایش کنید، و به‌تدریج افزایش دهید. تعداد بیش از حد نشست‌های موازی از یک هدف مشترک می‌تواند حتی وقتی IPها را می‌چرخانید، محدودیت نرخ را فعال کند.

۸. تأیید IP خروجی قبل از هر کار بزرگ

یک مرحله تأیید کوچک به اسکرپر خود اضافه کنید. در شروع کار IP خروجی را بررسی کنید و آن را با کشور مورد انتظار یا رفتار نشست مقایسه کنید.

async def verify_exit_ip(page) -> str:
    await page.goto('https://httpbin.org/ip', wait_until='domcontentloaded')
    body = await page.locator('body').inner_text()
    print(body)
    return body

اگر IP اشتباه است، قبل از اجرای خزش کامل، نام کاربری پروکسی یا پارامترهای نشست را اصلاح کنید.

عیب‌یابی

نشانه علت احتمالی راه‌حل
407 Proxy Authentication Required نام کاربری اشتباه، رمز عبور اشتباه، یا اعتبارنامه‌ها به‌درستی ارسال نشده‌اند نام کاربری و رمز عبور IPRoyal را تأیید کنید. از فیلدهای username و password در Playwright استفاده کنید، نه جاسازی اعتبارنامه‌ها در URL سرور.
net::ERR_PROXY_CONNECTION_FAILED هاست، پورت یا scheme اشتباه؛ فایروال پورت پروکسی را مسدود می‌کند هاست و پورت را در داشبورد IPRoyal بررسی کنید. HTTP و SOCKS5 را جداگانه امتحان کنید. قبل از استفاده از Playwright با curl تست کنید.
IP خروجی یکسان در هر درخواست نشست چسبنده فعال است، یا endpoint در حال چرخش نیست session ID را حذف کنید، یک نشست جدید بسازید، یا تنظیمات چرخش IPRoyal خود را بررسی کنید.
SOCKS5 کار نمی‌کند اما HTTP کار می‌کند scheme یا پورت اشتباه از socks5://HOST:PORT و پورت SOCKS5 از داشبورد استفاده کنید.
اتصال Shadowsocks شکست می‌خورد Playwright به‌صورت بومی از Shadowsocks پشتیبانی نمی‌کند یک کلاینت Shadowsocks محلی اجرا کنید و Playwright را به شنونده SOCKS5 محلی آن اشاره دهید.
سایت کپچا نشان می‌دهد یا مسدود می‌کند درخواست‌های بیش از حد در هر IP، عدم تطابق اثر انگشت مرورگر، یا IPهای دیتاسنتر روی یک هدف حساس سرعت را کم کنید، از پروکسی‌های مسکونی استفاده کنید، نشست‌ها را بچرخانید، contextهای واقع‌گرایانه را دوباره استفاده کنید، و قوانین سایت هدف را رعایت کنید.

یک بررسی سریع از خط فرمان می‌تواند مشکلات پروکسی را از مشکلات Playwright جدا کند:

curl -x 'http://USERNAME:PASSWORD@HOST:PORT' https://httpbin.org/ip

اگر رمز عبور شامل کاراکترهای خاص است، آن را URL-encode کنید یا از گزینه --proxy-user در curl استفاده کنید.

خلاصه

می‌توانید از پروکسی‌های مسکونی IPRoyal با Playwright روی لینوکس استفاده کنید؛ با ذخیره اعتبارنامه‌ها در .env، ساخت یک هلپر پروکسی قابل استفاده مجدد، اجرای Chromium یا یک context مرورگر با دیکشنری پروکسی، و چرخش نشست‌ها یا استفاده از نشست‌های چسبنده در صورت نیاز. برای سادگی از HTTP استفاده کنید، وقتی لازم است از SOCKS5، و فقط زمانی از یک کلاینت Shadowsocks محلی استفاده کنید که گردش‌کار شما به تونل‌زنی به سبک Shadowsocks نیاز دارد. قبل از کارهای بزرگ IP خروجی را تأیید کنید، با همزمانی پایین شروع کنید، و چرخش و هدف‌گیری جغرافیایی را با استفاده از دستور دقیق داشبورد IPRoyal خود تنظیم کنید. IPRoyal یک ارائه‌دهنده پیشنهادی برای پروکسی‌های مسکونی، دیتاسنتر و ISP است، اما همیشه اندازه استخر، قیمت‌گذاری و سازگاری با هدف را قبل از متعهد شدن به یک پشته اسکرپینگ مقایسه کنید.