العودة إلى المدونة

عرض JavaScript عبر الوكيل: كيفية تجنب الحجب والأخطاء

يتطلب عرض JavaScript نهجًا خاصًا عند العمل مع الوكيل. دعنا نفهم المشاكل التي تنشأ وكيفية حلها.

📅١٣ جمادى الآخرة ١٤٤٧ هـ
```html

عرض JavaScript عبر الوكيل: كيفية تجنب الحجب والأخطاء

عندما تقوم بتحليل مواقع الويب التي تحمل المحتوى عبر JavaScript، تصبح طلبات HTTP البسيطة غير فعالة. أضف إلى ذلك حماية من الروبوتات وقيود الموقع الجغرافي — وتصبح المهمة معقدة بعدة مرات. تحل الوكلاء جزءاً من المشاكل، لكنها تتطلب إعداداً صحيحاً.

لماذا يتطلب عرض JavaScript وكيلاً

غالباً ما تستخدم المواقع الحديثة أطر عمل مثل React و Vue و Angular، والتي تحمل المحتوى على جانب العميل. عندما ترسل طلب GET عادياً، تحصل على HTML فارغ يحتوي على علامة <div id="root"></div>، وليس المحتوى الجاهز.

المشاكل التي تحلها الوكلاء:

  • قيود الموقع الجغرافي. تقيد المواقع الوصول حسب الدول. يتجاوز الوكيل الذي يحتوي على عنوان IP من المنطقة المطلوبة هذه القيود.
  • حماية من الروبوتات. تحجب أنظمة مثل Cloudflare و hCaptcha الطلبات المؤتمتة. الوكلاء السكنية تبدو مثل المستخدمين العاديين وتمر عبر الفحوصات بشكل أفضل.
  • تحديد معدل الطلبات. قد يحجب الخادم عنوان IP واحد بعد عدة طلبات. توزع الوكلاء حركة المرور وتتجنب الحجب.
  • الخصوصية. تخفي عنوان IP الحقيقي الخاص بك عند التحليل.

متصفحات Headless والوكلاء: الأساسيات

لعرض JavaScript، يتم استخدام متصفحات headless — Chromium بدون واجهة رسومية. الخيارات الشهيرة:

  • Puppeteer — مكتبة Node.js للتحكم في Chrome/Chromium.
  • Playwright — بديل متعدد المتصفحات، يدعم Chrome و Firefox و Safari.
  • Selenium — الخيار الكلاسيكي، يعمل مع متصفحات مختلفة.

جميعها تدعم الوكلاء من خلال معاملات بدء تشغيل المتصفح أو خيارات الاتصال.

الإعداد العملي

Puppeteer مع الوكيل

مثال أساسي لربط وكيل بـ Puppeteer:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    args: [
      '--proxy-server=http://proxy.example.com:8080'
    ]
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');
  
  const content = await page.content();
  console.log(content);
  
  await browser.close();
})();

إذا كان الوكيل يتطلب المصادقة:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    args: [
      '--proxy-server=http://proxy.example.com:8080'
    ]
  });

  const page = await browser.newPage();
  
  // تعيين بيانات اعتماد الوكيل
  await page.authenticate({
    username: 'user',
    password: 'pass'
  });
  
  await page.goto('https://example.com');
  const content = await page.content();
  
  await browser.close();
})();

Playwright مع الوكيل

في Playwright، يتم إعداد الوكيل من خلال سياق المتصفح:

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

(async () => {
  const browser = await chromium.launch({
    proxy: {
      server: 'http://proxy.example.com:8080',
      username: 'user',
      password: 'pass'
    }
  });

  const context = await browser.newContext();
  const page = await context.newPage();
  
  await page.goto('https://example.com');
  const content = await page.content();
  
  await browser.close();
})();

تدوير الوكلاء للطلبات المتعددة

للتحليل على نطاق واسع، تحتاج إلى تدوير الوكلاء. إليك مثال بسيط مع مصفوفة:

const puppeteer = require('puppeteer');

const proxies = [
  'http://proxy1.com:8080',
  'http://proxy2.com:8080',
  'http://proxy3.com:8080'
];

let proxyIndex = 0;

async function getPageWithProxy(url) {
  const currentProxy = proxies[proxyIndex % proxies.length];
  proxyIndex++;
  
  const browser = await puppeteer.launch({
    args: [`--proxy-server=${currentProxy}`]
  });
  
  const page = await browser.newPage();
  await page.goto(url);
  const content = await page.content();
  
  await browser.close();
  return content;
}

// الاستخدام
(async () => {
  const urls = ['https://example.com/1', 'https://example.com/2'];
  for (const url of urls) {
    const content = await getPageWithProxy(url);
    console.log('تم التحليل:', url);
  }
})();

الأخطاء الشائعة والحلول

الخطأ السبب الحل
ERR_TUNNEL_CONNECTION_FAILED الوكيل غير متاح أو بيانات اعتماد غير صحيحة تحقق من IP:port للوكيل واسم المستخدم/كلمة المرور. اختبر عبر curl
انتهاء المهلة الزمنية عند التحميل وكيل بطيء أو الموقع يحجب الطلب زد المهلة الزمنية، أضف User-Agent، استخدم وكلاء سكنية
403 Forbidden الموقع تعرف على الروبوت أضف رؤوس واقعية، استخدم وكلاء سكنية، أضف تأخير بين الطلبات
CAPTCHA في كل طلب الموقع يرى نفس User-Agent دوّر User-Agent، استخدم وكلاء مختلفة لكل متصفح

إضافة رؤوس واقعية

const page = await browser.newPage();

await page.setUserAgent(
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
);

await page.setExtraHTTPHeaders({
  'Accept-Language': 'en-US,en;q=0.9',
  'Accept': 'text/html,application/xhtml+xml',
  'Referer': 'https://google.com'
});

await page.goto('https://example.com');

تحسين الأداء

تعطيل الموارد غير الضرورية

تبطئ تحميل الصور والأنماط التحليل. إذا كنت تحتاج فقط إلى النص:

const page = await browser.newPage();

// حجب تحميل الصور والأنماط والخطوط والوسائط
await page.on('request', (request) => {
  const resourceType = request.resourceType();
  if (['image', 'stylesheet', 'font', 'media'].includes(resourceType)) {
    request.abort();
  } else {
    request.continue();
  }
});

await page.goto('https://example.com');

استخدام مجموعة متصفحات

للمعالجة المتوازية لعدة صفحات، أنشئ مجموعة متصفحات بدلاً من بدء متصفح جديد لكل طلب:

const puppeteer = require('puppeteer');

let browser;
const maxPages = 5;
let activePage = 0;

async function initBrowser() {
  browser = await puppeteer.launch({
    args: ['--proxy-server=http://proxy.example.com:8080']
  });
}

async function parsePage(url) {
  const page = await browser.newPage();
  try {
    await page.goto(url);
    const content = await page.content();
    return content;
  } finally {
    await page.close();
  }
}

// الاستخدام
(async () => {
  await initBrowser();
  const urls = ['url1', 'url2', 'url3'];
  
  for (const url of urls) {
    await parsePage(url);
  }
  
  await browser.close();
})();

الأدوات والمكتبات

  • Puppeteer Extra — امتداد Puppeteer مع دعم المكونات الإضافية لتجاوز حماية الروبوتات.
  • Cheerio — مكتبة خفيفة لتحليل HTML بعد عرض المتصفح.
  • Axios + Proxy Agent — للطلبات البسيطة عبر وكيل بدون متصفح.
  • Scrapy — إطار عمل Python مع دعم مدمج للوكلاء والتحليل الموزع.

مهم: عند العمل مع الوكلاء، تأكد من الامتثال لشروط استخدام الموقع المستهدف وعدم انتهاك ملف robots.txt الخاص به. يجب أن يكون التحليل أخلاقياً وعدم إرهاق الخوادم.

الخلاصة

عرض JavaScript عبر الوكيل هو أداة قوية لأتمتة التحليل، لكنها تتطلب الانتباه للتفاصيل. الإعداد الصحيح للمتصفح وتدوير الوكلاء والرؤوس الواقعية وتحسين الأداء — هي مفاتيح العمل الموثوق.

للتحليل على نطاق واسع مع متطلبات عالية للخصوصية، تناسب الوكلاء السكنية بشكل جيد، والتي تبدو مثل المستخدمين العاديين وتتجاوز معظم حماية الروبوتات.

```