استفاده از پروکسی با Playwright و Puppeteer برای جلوگیری از مسدودسازی (2026)

منتشر شده در 2 ژوئن 2026 · زمان مطالعه ≈ 7 دقیقه

مرورگرهای headless جاوااسکریپت را رندر می‌کنند، پس سایت‌های مدرنی را که کلاینت‌های ساده‌ی HTTP نمی‌توانند مدیریت کنند، هندل می‌کنند. اما یک مرورگر هنوز هر درخواست را از یک IP می‌فرستد، و اتوماسیون همان لحظه‌ای که سایت آن آدرس را محدود نرخ یا فینگرپرینت کند، گیر می‌افتد. استفاده از پروکسی با Playwright و Puppeteer ترافیک را روی چند IP پخش می‌کند و اگر درست انجام شود، اتوماسیون شما را شبیه کاربران عادی می‌سازد. در اینجا راه‌اندازی کاربردی برای هر دو، در پایتون و Node آمده است.

Playwright با پروکسی (پایتون)

پروکسی را هنگام راه‌اندازی مرورگر تنظیم کنید. احراز هویت را به‌صورت فیلدهای جداگانه‌ی username و password پاس بدهید — اطلاعات ورود را داخل URL سرور قرار ندهید:

from playwright.sync_api import sync_playwright

PROXY = {
    "server": "http://gate.jibaoproxy.com:10001",
    "username": "USERNAME",
    "password": "PASSWORD",
}

with sync_playwright() as p:
    browser = p.chromium.launch(proxy=PROXY, headless=True)
    page = browser.new_page()
    page.goto("https://httpbin.org/ip")
    print(page.inner_text("body"))
    browser.close()

JIBAO هم HTTP و هم SOCKS5 را روی gateway در دسترس می‌گذارد. برای اتوماسیون مرورگر از endpoint مربوط به HTTP استفاده کنید: Playwright و Puppeteer از پروکسی‌های SOCKS5 با احراز هویت پشتیبانی نمی‌کنند، پس HTTP همراه با auth انتخاب قابل‌اتکاست.

Playwright با پروکسی (Node)

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({
    headless: true,
    proxy: {
      server: 'http://gate.jibaoproxy.com:10001',
      username: 'USERNAME',
      password: 'PASSWORD',
    },
  });
  const page = await browser.newPage();
  await page.goto('https://httpbin.org/ip');
  console.log(await page.innerText('body'));
  await browser.close();
})();

چرخش IP به‌ازای هر Browser Context

تمیزترین راه برای چرخش در Playwright، یک IP به‌ازای هر BrowserContext است. هر context یک سشن ایزوله است (با کوکی‌ها و کش مخصوص خودش)، پس بایند کردن هرکدام به یک IP خروجی متفاوت، هویت‌های موازی از یک فرایند مرورگر واحد به شما می‌دهد:

from playwright.sync_api import sync_playwright

def ctx_proxy(session_id):
    return {
        "server": "http://gate.jibaoproxy.com:10001",
        "username": f"USERNAME-session-{session_id}",
        "password": "PASSWORD",
    }

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    for i in range(3):
        context = browser.new_context(proxy=ctx_proxy(f"ctx{i}"))
        page = context.new_page()
        page.goto("https://httpbin.org/ip")
        print(i, page.inner_text("body"))
        context.close()
    browser.close()

هر context از یک توکن sticky session متمایز استفاده می‌کند، پس IP داخل یک context ثابت می‌ماند (برای جریان‌های ورود خوب است) ولی بین contextها متفاوت است (برای اجرای موازی چند حساب خوب است). این همان الگویی است که مرورگرهای ضدتشخیص مانند GoLogin و Dolphin Anty خودکارش می‌کنند — راهنمای راه‌اندازی پروکسی ضدتشخیص ما را ببینید.

Puppeteer با پروکسی (Node)

Puppeteer سرور پروکسی را به‌عنوان یک فلگ راه‌اندازی Chromium تنظیم می‌کند، سپس روی شیء page احراز هویت می‌کند:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: 'new',
    args: ['--proxy-server=http://gate.jibaoproxy.com:10001'],
  });
  const page = await browser.newPage();
  await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' });

  await page.goto('https://httpbin.org/ip');
  console.log(await page.evaluate(() => document.body.innerText));
  await browser.close();
})();

چون پروکسی یک فلگ در سطح فرایند است، یک مرورگر Puppeteer واحد از یک IP استفاده می‌کند. برای چرخش، به‌ازای هر هویت یک مرورگر تازه راه بیندازید (سنگین‌تر) یا چرخش را از طریق یک gateway که IP را به‌ازای هر اتصال عوض می‌کند هدایت کنید.

Sticky Session برای جریان‌های ورود

هر جریانی که یک کوکی سشن می‌سازد باید برای کل عمرش همان IP را نگه دارد. کوکی‌ای که روی IP-A ساخته شده و ناگهان از IP-B ظاهر می‌شود، مثل ربایش سشن خوانده می‌شود و یک احراز هویت مجدد یا یک مسدودسازی را فعال می‌کند. برای کل سشن، یک context (یا یک مرورگر) به‌ازای هر حساب واردشده نگه دارید که به یک توکن sticky session پین شده باشد.

فینگرپرینت را فراموش نکنید

یک IP مسکونی لازم است ولی کافی نیست. سایت‌ها دست‌دادن TLS/JA4 مرورگر شما، ترتیب فریم‌های HTTP/2، canvas، WebGL و ویژگی‌های navigator را هم می‌خوانند. Chromium headless معمولی navigator.webdriver = true و یک فینگرپرینت headless را لو می‌دهد که بهترین IP را هم خنثی می‌کند. با افزونه‌های stealth و فلگ‌های راه‌اندازی واقع‌گرایانه آن را کاهش دهید:

// Node: puppeteer-extra + stealth
const puppeteer = require('puppeteer-extra');
const Stealth = require('puppeteer-extra-plugin-stealth');
puppeteer.use(Stealth());

// فلگ‌های راه‌اندازی واقع‌گرایانه
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=http://gate.jibaoproxy.com:10001',
    '--disable-blink-features=AutomationControlled',
    '--window-size=1920,1080',
  ],
});

برای اینکه دقیقاً ببینید کدام سیگنال‌ها را لو می‌دهید، مرورگر خودکار خود را روی ابزار رایگان بررسی فینگرپرینت JA3/JA4 جیبائو اجرا کنید. برای مکانیک عمیق‌تر اینکه چرا دست‌دادن‌ها علامت‌گذاری می‌شوند، دور زدن فینگرپرینت TLS و دستورالعمل کامل دور زدن Cloudflare را بخوانید.

تأیید و دیباگ

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

۵ دلار اعتبار رایگان و IPهای مسکونی بگیرید که Playwright و Puppeteer را از فهرست مسدودی دور نگه می‌دارند.

شروع تست رایگان

برای همه محصولات IP · هزاران نود همیشه در دسترس

همین حالا ثبت‌نام کنید و تا ۱۰۰٪ کش‌بک شارژ بگیرید

کاربران جدید با ثبت‌نام 500MB هدیه می‌گیرند، به‌علاوه بونوس اولین شارژ. پیشنهاد محدود.