مرورگرهای headless جاوااسکریپت را رندر میکنند، پس سایتهای مدرنی را که کلاینتهای سادهی HTTP نمیتوانند مدیریت کنند، هندل میکنند. اما یک مرورگر هنوز هر درخواست را از یک IP میفرستد، و اتوماسیون همان لحظهای که سایت آن آدرس را محدود نرخ یا فینگرپرینت کند، گیر میافتد. استفاده از پروکسی با Playwright و Puppeteer ترافیک را روی چند IP پخش میکند و اگر درست انجام شود، اتوماسیون شما را شبیه کاربران عادی میسازد. در اینجا راهاندازی کاربردی برای هر دو، در پایتون و Node آمده است.
پروکسی را هنگام راهاندازی مرورگر تنظیم کنید. احراز هویت را بهصورت فیلدهای جداگانهی 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 انتخاب قابلاتکاست.
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();
})();
تمیزترین راه برای چرخش در 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 سرور پروکسی را بهعنوان یک فلگ راهاندازی 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 را بهازای هر اتصال عوض میکند هدایت کنید.
هر جریانی که یک کوکی سشن میسازد باید برای کل عمرش همان 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 را بخوانید.
headless=False را تنظیم کنید تا ببینید هدف واقعاً به بات شما چه نشان میدهد.۵ دلار اعتبار رایگان و IPهای مسکونی بگیرید که Playwright و Puppeteer را از فهرست مسدودی دور نگه میدارند.
شروع تست رایگانکاربران جدید با ثبتنام 500MB هدیه میگیرند، بهعلاوه بونوس اولین شارژ. پیشنهاد محدود.