استفاده از پروکسی با Playwright و Puppeteer

تاریخ انتشار: 23 جولای 2026 · 6 دقیقه مطالعه

خلاصه: در Playwright یک دیکشنری proxy را به launch() یا بهتر، به new_context() پاس دهید تا هر context IP خودش را داشته باشد. در Puppeteer، --proxy-server را در args پاس دهید و برای اطلاعات ورود page.authenticate() را صدا بزنید. از پروکسی رزیدنشیال استفاده کنید تا مرورگر از یک IP خانگی واقعی خارج شود، و وقتی چند هویت را همزمان اجرا می‌کنید، برای هر context/مرورگر یک نشست پایدار جدا بگذارید.

Playwright

Playwright یک دیکشنری proxy با یک URL خالص در server و فیلدهای جدا برای اطلاعات ورود می‌گیرد. ساده‌ترین شکل آن را روی launch() تنظیم می‌کند که به کل مرورگر اعمال می‌شود:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(
        proxy={
            "server": "http://gw.roamproxy.com:41080",
            "username": "YOUR_USERNAME",
            "password": "YOUR_PASSWORD",
        }
    )
    page = browser.new_page()
    page.goto("https://ip.sb")
    print(page.inner_text("body"))
    browser.close()

پروکسی به‌ازای هر context — یک IP در هر هویت

الگوی مفیدتر این است که پروکسی را روی new_context() تنظیم کنید. هر context یک نشست مرورگر ایزوله است — کوکی‌ها، storage و حالا IP خودش را دارد — پس یک فرآیند مرورگر می‌تواند چند هویت را اجرا کند که یک خروجی مشترک ندارند:

ctx_a = browser.new_context(proxy={
    "server": "http://gw.roamproxy.com:41080",
    "username": "USERNAME_session_a",
    "password": "YOUR_PASSWORD",
})
ctx_b = browser.new_context(proxy={
    "server": "http://gw.roamproxy.com:41080",
    "username": "USERNAME_session_b",
    "password": "YOUR_PASSWORD",
})

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

Puppeteer

Puppeteer پروکسی را به‌عنوان یک فلگ launch در Chromium می‌گیرد و احراز هویت را روی صفحه انجام می‌دهد. اطلاعات ورود در فلگ نمی‌روند:

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({
  args: ['--proxy-server=http://gw.roamproxy.com:41080'],
});
const page = await browser.newPage();
await page.authenticate({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' });
await page.goto('https://ip.sb');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Puppeteer پروکسی را به کل مرورگر اعمال می‌کند، پس برای اجرای چند IP همزمان باید چند مرورگر اجرا کنید (هرکدام با --proxy-server و نشست پایدار خودش)، یا یک روتر پروکسی جلوی آن بگذارید.

بررسی خروجی

هر دو قطعه کد بالا به یک endpoint بررسی IP می‌روند و نتیجه را چاپ می‌کنند. باید IP خروجی رزیدنشیال Roam و کشوری که انتخاب کرده‌اید را نشان دهد، نه آدرس واقعی دستگاه شما. اگر IP واقعی شما را نشان داد، پروکسی متصل نشده — سوالات متداول را دوباره بررسی کنید.

وقتی به مرورگر نیاز ندارید

Playwright و Puppeteer وقتی ابزار درستی هستند که مقصد به جاوااسکریپت یا یک چالش تعاملی نیاز داشته باشد. وقتی این‌طور نیست — یک API ساده JSON یا HTML استاتیک — یک مرورگر کامل کندتر و سنگین‌تر از چیزی است که نیاز دارید. برای درخواست‌های HTTP اسکریپتی با فینگرپرینت دقیق مثل مرورگر، به‌جای آن از curl_cffi استفاده کنید، و برای انتخاب بین این دو بر اساس لایه دفاعی، چگونه از Cloudflare عبور کنیم را ببینید. برای راندن Playwright با یک LLM، browser-use با پروکسی رزیدنشیال را ببینید.

سوالات متداول

پروکسی را روی launch تنظیم کنم یا روی context؟

در Playwright ترجیح با context است. تنظیم روی launch() یک پروکسی برای کل مرورگر اعمال می‌کند؛ تنظیم روی new_context() به هر context اجازه می‌دهد پروکسی خودش را داشته باشد — دقیقاً همان چیزی که وقتی یک اسکریپت چند هویت اجرا می‌کند لازم دارید: هر context یک نشست مرورگر جدا با IP جدا می‌شود. Puppeteer پشتیبانی درجه‌یک از پروکسی به‌ازای context ندارد، پس برای چند IP باید چند مرورگر اجرا کنید یا یک روتر پروکسی جلوی آن بگذارید.

نام کاربری و رمز عبور را چطور پاس بدهم؟

در Playwright آن‌ها را در دیکشنری proxy به‌عنوان username و password کنار server قرار دهید — هرگز داخل URL سرور نه. در Puppeteer، اطلاعات ورود در args نمی‌رود؛ شما --proxy-server=host:port را در args تنظیم می‌کنید و سپس قبل از اولین ناوبری await page.authenticate({username, password}) را صدا می‌زنید.

اگر از یک مرورگر واقعی استفاده می‌کنم باز هم به curl_cffi نیاز دارم؟

خیر — این دقیقاً همان دلیل استفاده از مرورگر است. Playwright و Puppeteer یک Chromium واقعی را می‌رانند، پس فینگرپرینت TLS/JS از قبل واقعی است. curl_cffi برای این ساخته شده که همان فینگرپرینت را به درخواست‌های HTTP اسکریپتی که از مرورگر استفاده نمی‌کنند بدهد. با Playwright/Puppeteer فقط باید لایه شبکه را درست کنید که همان کار پروکسی است.

مرورگر باز می‌شود اما هنوز IP واقعی من را نشان می‌دهد — چرا؟

معمولاً پروکسی روی آبجکت اشتباه تنظیم شده یا اطلاعات ورود داخل URL سرور جاسازی شده. مطمئن شوید مقدار server یک http://host:port خالص است، username/password کلیدهای جدا هستند (Playwright) یا از طریق page.authenticate() تنظیم شده‌اند (Puppeteer)، و اینکه پروکسی را به همان context/مرورگری که واقعاً با آن ناوبری می‌کنید متصل کرده‌اید. سپس بررسی IP زیر را دوباره اجرا کنید.

هر دو فریم‌ورک یک پروکسی ساده host:port به‌علاوه اطلاعات ورود می‌خواهند — دقیقاً همان چیزی که Roam می‌دهد. رزیدنشیال چرخشی با $2 در هر گیگابایت و رزیدنشیال استاتیک با $4 در هر IP در ماه، روی HTTP و SOCKS5. یک اکانت بسازید و 300 مگابایت ترافیک آزمایشی رایگان بگیرید تا اولین مرورگرتان را به یک خروجی رزیدنشیال وصل کنید.