لماذا الحشد بلا رأس بحاجة إلى مرشدين
ومن الضروري تحطيم مواقع جافاسكريبت الثقيلة. ومع ذلك، فإن تنظيم دورات متعددة لا رأس لها من عنوان IP هو إشارة واضحة للتشغيل الآلي. ويحل هذا الجمع بين المصفوفين غير الرأسيين والتناوب العميل عن طريق توزيع الطلبات على الآلاف من شركاء التنفيذ المقيمين.
This guide covers Puppeteer and Playwright proxy formation, stealingth plugins, and rotation strategies. لخلفية كيف يعمل الكشف، نرى لدينا دليل لنظم كشف الأجسام المضادة.
Puppeteer Proxy Setup
الاتحاد الأساسي
// Puppeteer: Basic proxy configuration
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.proxyhat.com:8080',
'--no-sandbox',
'--disable-setuid-sandbox'
]
});
const page = await browser.newPage();
// Authenticate with the proxy
await page.authenticate({
username: 'USERNAME',
password: 'PASSWORD'
});
await page.goto('https://example.com', {
waitUntil: 'networkidle2',
timeout: 30000
});
const content = await page.content();
console.log(content.substring(0, 200));
await browser.close();
SOCKS5 with Puppeteer
// Puppeteer: SOCKS5 proxy configuration
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=socks5://gate.proxyhat.com:1080'
]
});
const page = await browser.newPage();
await page.authenticate({
username: 'USERNAME',
password: 'PASSWORD'
});
Puppeteer Stealth Plugin
وتكشف تشكيلة الجراء الافتراضي عن عشرات من علامات التشغيل الآلي التي تكتشفها نظم مكافحة القنابل. The puppeteer-extra-plugin-stealth البلوغ يربط هذه العلامات تلقائياً
// Install: npm install puppeteer-extra puppeteer-extra-plugin-stealth
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
// Apply stealth plugin
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.proxyhat.com:8080',
'--disable-blink-features=AutomationControlled',
'--window-size=1920,1080',
'--disable-dev-shm-usage'
]
});
const page = await browser.newPage();
await page.authenticate({
username: 'USERNAME',
password: 'PASSWORD'
});
// Set realistic viewport
await page.setViewport({ width: 1920, height: 1080 });
// Set extra headers for consistency
await page.setExtraHTTPHeaders({
'Accept-Language': 'en-US,en;q=0.9'
});
await page.goto('https://example.com');
رقائق البلوغ الخفية:
navigator.webdriver- غير محدد بدلا من الحقيقةchrome.runtime- إضافة أشياء خاصة بالكروم المفقود- بائع/مدير على الشبكة العالمية لسواتل الملاحة - قيود واقعية على نظام الأفضليات المعمم
- صفائف البلوجين والإذن - تطابق الكروم الحقيقي
- اتساق اللغات والمنبر
من أجل فهم أعمق لما تتناوله هذه الشقق، انظر مقالنا على بصمة مصفوفة.
منظمة بلاي رايت للمحترفين
ويوفر بلايرايت تشكيلة بديلة أنيقة أكثر من بوفييه، ودعم العملاء في كل منطقة، وزرع الأجهزة المبنية.
الاتحاد الأساسي
// Playwright: Basic proxy setup
const { chromium } = require('playwright');
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME',
password: 'PASSWORD'
}
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
const title = await page.title();
console.log(`Page title: ${title}`);
await browser.close();
Per-Context Proxy (Different IPs per Tab)
// Playwright: Different proxy per context
const { chromium } = require('playwright');
const browser = await chromium.launch();
// Context 1: US proxy session
const ctx1 = await browser.newContext({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME-country-us-session-abc1',
password: 'PASSWORD'
},
locale: 'en-US',
timezoneId: 'America/New_York'
});
// Context 2: UK proxy session
const ctx2 = await browser.newContext({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME-country-gb-session-abc2',
password: 'PASSWORD'
},
locale: 'en-GB',
timezoneId: 'Europe/London'
});
const page1 = await ctx1.newPage();
const page2 = await ctx2.newPage();
// Each page uses a different IP and locale
await page1.goto('https://example.com');
await page2.goto('https://example.com');
جهاز تصوير مع البروكسي
// Playwright: Realistic device emulation + proxy
const { chromium, devices } = require('playwright');
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME',
password: 'PASSWORD'
}
});
// Emulate a specific device with matching settings
const context = await browser.newContext({
...devices['Desktop Chrome'],
locale: 'en-US',
timezoneId: 'America/Chicago',
geolocation: { latitude: 41.8781, longitude: -87.6298 },
permissions: ['geolocation'],
colorScheme: 'light'
});
const page = await context.newPage();
await page.goto('https://example.com');
التناوب المحترف مع الحشد العاقل
الاستراتيجية 1: السياق الجديد لكل طلب
Create a new browser context for each URL. هذا يعطي آي بي جديد و كوكيز نظيف لكل طلب
// Playwright: Rotate proxy per request via new contexts
async function scrapeWithRotation(urls) {
const browser = await chromium.launch();
const results = [];
for (const url of urls) {
const sessionId = `sess-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
const context = await browser.newContext({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: `USERNAME-session-${sessionId}`,
password: 'PASSWORD'
}
});
const page = await context.newPage();
try {
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
const data = await page.evaluate(() => document.title);
results.push({ url, data });
} catch (error) {
console.error(`Failed: ${url} — ${error.message}`);
} finally {
await context.close();
}
// Natural delay between requests
await new Promise(r => setTimeout(r, 1000 + Math.random() * 2000));
}
await browser.close();
return results;
}
الاستراتيجية 2: عقد دورات مرنة لتدفقات متعددة المراحل
استخدام الجلسات اللزجة عندما تحتاج للحفاظ على نفس IP عبر صفحات متعددة (الرسم وتدفقات قطع الأشجار).
// Playwright: Sticky session for multi-page scraping
async function scrapeWithStickySession(baseUrl, pageCount) {
const sessionId = `sticky-${Date.now()}`;
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: `USERNAME-session-${sessionId}`,
password: 'PASSWORD'
}
});
const context = await browser.newContext();
const page = await context.newPage();
const results = [];
for (let i = 1; i <= pageCount; i++) {
await page.goto(`${baseUrl}?page=${i}`, { waitUntil: 'networkidle' });
const items = await page.$$eval('.item', els =>
els.map(el => el.textContent.trim())
);
results.push(...items);
// Natural delay between pages
await new Promise(r => setTimeout(r, 1500 + Math.random() * 1500));
}
await browser.close();
return results;
}
الاستراتيجية 3: التآمر مع المتسكعين
// Playwright: Concurrent scraping with proxy pool
async function concurrentScrape(urls, concurrency = 5) {
const browser = await chromium.launch();
const results = [];
// Process URLs in batches
for (let i = 0; i < urls.length; i += concurrency) {
const batch = urls.slice(i, i + concurrency);
const promises = batch.map(async (url) => {
const sessionId = `conc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
const context = await browser.newContext({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: `USERNAME-session-${sessionId}`,
password: 'PASSWORD'
}
});
const page = await context.newPage();
try {
await page.goto(url, { timeout: 30000, waitUntil: 'domcontentloaded' });
return { url, title: await page.title(), status: 'ok' };
} catch (e) {
return { url, error: e.message, status: 'error' };
} finally {
await context.close();
}
});
const batchResults = await Promise.all(promises);
results.push(...batchResults);
// Delay between batches
await new Promise(r => setTimeout(r, 2000));
}
await browser.close();
return results;
}
مبتدئ مع بيتسون (بديل بيتر)
لمطوري بايتون playwright بالنسبة لـ (بيثون) توفر نفس القدرات ذات النسيج الأنظف
# Python: Playwright with proxy and stealth settings
# pip install playwright
# playwright install chromium
from playwright.async_api import async_playwright
import asyncio
async def scrape_with_proxy():
async with async_playwright() as p:
browser = await p.chromium.launch(
proxy={
"server": "http://gate.proxyhat.com:8080",
"username": "USERNAME",
"password": "PASSWORD"
}
)
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
locale="en-US",
timezone_id="America/New_York",
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
page = await context.new_page()
await page.goto("https://example.com")
title = await page.title()
print(f"Title: {title}")
await browser.close()
asyncio.run(scrape_with_proxy())
الاستخدام الأمثل للموارد
يستهلك المصفوفون العديمو الرؤوس ذاكرة كبيرة ووحدة CPU. تحقيق الاستخدام الأمثل لحجم العمل الإنتاجي:
الموارد غير الضرورية
// Playwright: Block images, fonts, and CSS to save bandwidth
const context = await browser.newContext({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME',
password: 'PASSWORD'
}
});
const page = await context.newPage();
// Block non-essential resources
await page.route('**/*.{png,jpg,jpeg,gif,svg,webp,woff,woff2,ttf,css}', route =>
route.abort()
);
// Block tracking and analytics
await page.route('**/{google-analytics,gtag,facebook}**', route =>
route.abort()
);
await page.goto('https://example.com');
إدارة الذاكرة
- السياقات الوثيقة بعد الاستخدام: ويستهلك كل سياق مفتوح 50-150MB. دائماً ما يغلق السياقات عندما ينتهي
- السياقات المتزامنة: الحفاظ على 3-10 سياقات لكل حالة بروزر استناداً إلى السجلات والمحفوظات المتاحة.
- Reart browser periodically: بعد 100-200 دورة سياقية، إعادة تشغيل المصفح لمنع تسرب الذاكرة.
- جديد الطريقة الجديدة بلا رأس تستخدم ذاكرة أقل من القديمة
معالجة القضايا المشتركة
فشل التوثيق
// Handle proxy auth errors gracefully
try {
const response = await page.goto(url, { timeout: 30000 });
if (response.status() === 407) {
console.error('Proxy authentication failed — check credentials');
}
} catch (error) {
if (error.message.includes('net::ERR_PROXY_CONNECTION_FAILED')) {
console.error('Proxy connection failed — check proxy server availability');
}
}
معالجة الوقت
// Retry with exponential backoff
async function gotoWithRetry(page, url, maxRetries = 3) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
return await page.goto(url, {
waitUntil: 'domcontentloaded',
timeout: 30000
});
} catch (error) {
if (attempt === maxRetries) throw error;
const delay = 1000 * Math.pow(2, attempt) + Math.random() * 1000;
console.log(`Retry ${attempt}/${maxRetries} after ${delay}ms`);
await new Promise(r => setTimeout(r, delay));
}
}
}
القائمة المرجعية لأفضل الممارسات
| الممارسة | الجرم | بلاي رايت |
|---|---|---|
| Per-context proxy | حبوب إطلاق فيا فقط | الدعم البديل لما بعد النزاع |
| رقائق السرقة | الجراء - الاكسترا - البوغين - ث | تركيب الأجهزة |
| إعاقة الموارد | Page | Page |
| الازدحام المتعدد | الكروم فقط | Chromium, Firefox, WebKit |
| العزلة | مصفوف جديد لكل دورة | السياق الجديد لكل دورة |
وبالنسبة لمعظم مهام الخردة، فإن بلايرايت هو الخيار الموصى به على الفرسان بسبب دعمه المحترف الأعلى (في كل منطقة)، وزرع الأجهزة المبنية، والدعم المتعدد الازدحام. جهزها وكيلات النيابة السكنية لأفضل النتائج
لتركيب المحترفين اللغويين بدون مهرّبين لا رؤوس لهم Python.. Node.jsو إذهبيستعاض عن عبارة " استراتيجيات شاملة لمكافحة الكشف " بعبارة " دليل الحد من الكشفتتبع دائما ممارسات الخردة الأخلاقية والاحترام سياسات الوصول إلى الموقع الشبكي.






