Skip to content
Beginner / 3 min read

نحوه استفاده از پروکسی‌های مسکونی Dataimpulse با Node.js و Axios برای وب‌اسکرپینگ (راهنمای مبتدی برای Windows، macOS و Linux)

آموزش گام‌به‌گام و مبتدی‌پسند برای مسیردهی درخواست‌های Node.js از طریق پروکسی‌های مسکونی پرداخت به میزان مصرف Dataimpulse با Axios و Cheerio، شامل بررسی IP خروجی، تلاش‌های مجدد، محدودیت‌های هم‌زمانی و یک گونه SOCKS5.

Windows macOS HTTP(S) وب اسکرپینگ

مرور کلی

Dataimpulse یک ارائه‌دهنده پروکسی پرداخت به میزان مصرف است که IPهای مسکونی و موبایل را از مجموعه‌ای با بیش از ۹۰ میلیون آدرس روی HTTP و SOCKS5 عرضه می‌کند. چون صورت‌حساب بر اساس ترافیکی است که واقعاً استفاده می‌کنید، نه یک طرح ماهانه ثابت، برای وب‌اسکرپینگ پرحجم و جمع‌آوری داده در مقیاس بزرگ که استفاده‌ای جهشی دارد مناسب است.

این آموزش درخواست‌های Node.js را از طریق یک endpoint مسکونی Dataimpulse با Axios و Cheerio مسیردهی می‌کند، سپس اسکریپت را با تلاش‌های مجدد و سقف هم‌زمانی مقاوم‌تر می‌سازد. کد روی Windows، macOS و Linux یکسان رفتار می‌کند؛ تنها دستورهای shell برای تنظیم متغیرهای محیطی متفاوت‌اند. همین الگو با هر ارائه‌دهنده‌ای که میزبان gateway، پورت و نام کاربری/رمز عبور ارائه می‌دهد کار می‌کند.

در پایان می‌توانید:

  1. نصب بسته‌های Node.js موردنیاز برای وب‌اسکرپینگ آگاه به پروکسی.
  2. دور نگه داشتن اعتبارنامه‌های Dataimpulse از فایل‌های منبع.
  3. بررسی اینکه درخواست‌ها از طریق پروکسی خارج می‌شوند.
  4. اسکرپ و تجزیه یک صفحه با Cheerio.
  5. افزودن تلاش‌های مجدد، backoff و محدودیت هم‌زمانی.
  6. تغییر همان کلاینت از HTTP به SOCKS5.

آنچه نیاز دارید

  • Node.js 18 یا جدیدتر همراه با npm
  • یک حساب Dataimpulse با اعتبار پرداخت به میزان مصرف
  • میزبان gateway، پورت و نام کاربری/رمز عبور از داشبورد Dataimpulse شما
  • یک صفحه هدف که مجاز به اسکرپ آن هستید

انتخاب نوع endpoint

endpoint بهترین برای بسته عامل Node.js
پروکسی HTTP(S) Axios، Fetch و بیشتر کتابخانه‌های اسکرپینگ HTTP https-proxy-agent
SOCKS5 ابزارهایی که SOCKS انتظار دارند، یا یک عامل برای همه ترافیک خروجی socks-proxy-agent

با endpoint HTTP شروع کنید مگر اینکه کتابخانه‌ای از پذیرش پیکربندی پروکسی امتناع کند.

گام‌ها

۱. پروژه را ایجاد کنید

mkdir dataimpulse-axios-scraper
cd dataimpulse-axios-scraper
npm init -y

۲. وابستگی‌ها را نصب کنید

npm install axios cheerio https-proxy-agent

عامل SOCKS5 را فقط در صورتی اضافه کنید که قصد دارید از گام ۷ استفاده کنید:

npm install socks-proxy-agent

۳. اعتبارنامه‌های Dataimpulse خود را به‌عنوان متغیرهای محیطی تنظیم کنید

دور نگه داشتن اعتبارنامه‌ها از فایل‌های منبع مانع از نشت آن‌ها به یک مخزن یا اسکرین‌شات به‌اشتراک‌گذاشته‌شده می‌شود. مقادیر میزبان، پورت، نام کاربری و رمز عبور را از داشبورد Dataimpulse خود کپی کنید.

macOS و Linux:

export PROXY_HOST="your-gateway-host"
export PROXY_PORT="your-gateway-port"
export PROXY_USER="your-username"
export PROXY_PASS="your-password"

Windows PowerShell:

$env:PROXY_HOST = "your-gateway-host"
$env:PROXY_PORT = "your-gateway-port"
$env:PROXY_USER = "your-username"
$env:PROXY_PASS = "your-password"

این مقادیر فقط برای نشست ترمینال فعلی اعمال می‌شوند. اگر رمز عبور شما شامل @، : یا / است، اسکریپت زیر آن را با encodeURIComponent به‌صورت URL کدگذاری می‌کند، بنابراین می‌توانید آن را همان‌طور که هست جای‌گذاری کنید.

۴. IP خروجی را تأیید کنید

فایلی به نام check-ip.js ایجاد کنید:

const axios = require('axios');
const { HttpsProxyAgent } = require('https-proxy-agent');

const proxyUrl = `http://${process.env.PROXY_USER}:${encodeURIComponent(process.env.PROXY_PASS)}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;

const client = axios.create({
  httpsAgent: new HttpsProxyAgent(proxyUrl),
  proxy: false,
  timeout: 20000,
});

(async () => {
  const { data } = await client.get('https://api.ipify.org?format=json');
  console.log('Exit IP:', data.ip);
})();

چند بار آن را اجرا کنید:

node check-ip.js

اگر gateway IP خروجی را می‌چرخاند، در هر اجرا آدرس متفاوتی خواهید دید، که رفتار عادی ترافیک مسکونی است. اگر نیاز دارید چندین درخواست از همان آدرس خارج شوند، به‌جای تلاش برای پین کردن یک IP در داخل اسکریپت، از قالب پارامتر session یا sticky که در داشبورد Dataimpulse مستند شده است استفاده کنید. تنظیم proxy: false عمدی است: عامل صریح تونل‌سازی را انجام می‌دهد و روشن گذاشتن تشخیص خودکار پروکسی Axios می‌تواند با آن تعارض داشته باشد.

۵. یک صفحه را اسکرپ و تجزیه کنید

scrape.js را ایجاد کنید. این نسخه یک User-Agent توصیفی، یک هدر Accept-Language و یک کمک‌تابع تلاش مجدد اضافه می‌کند:

const axios = require('axios');
const { load } = require('cheerio');
const { HttpsProxyAgent } = require('https-proxy-agent');

const proxyUrl = `http://${process.env.PROXY_USER}:${encodeURIComponent(process.env.PROXY_PASS)}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;

const client = axios.create({
  httpsAgent: new HttpsProxyAgent(proxyUrl),
  proxy: false,
  timeout: 20000,
  headers: {
    'User-Agent': 'Mozilla/5.0 (compatible; ProxyScoutExample/1.0)',
    'Accept-Language': 'en-US,en;q=0.9',
  },
});

async function getWithRetry(url, attempts = 3) {
  for (let i = 1; i <= attempts; i++) {
    try {
      return await client.get(url);
    } catch (error) {
      const status = error.response && error.response.status;
      const retryable = !status || status === 429 || status >= 500;
      if (!retryable || i === attempts) throw error;
      const backoff = 1000 * 2 ** (i - 1);
      console.warn(`Attempt ${i} failed (${status || error.code}); retrying in ${backoff} ms`);
      await new Promise((resolve) => setTimeout(resolve, backoff));
    }
  }
}

(async () => {
  const { data: html } = await getWithRetry('https://example.com/');
  const $ = load(html);
  console.log('Title:', $('title').text().trim());
  $('a').slice(0, 5).each((index, element) => {
    console.log('Link:', $(element).attr('href'));
  });
})();
node scrape.js

خطاهای احراز هویت (HTTP 407) و بیشتر پاسخ‌های 4xx غیرقابل‌تلاش‌مجدد در نظر گرفته می‌شوند، چون تکرار همان درخواست با همان اعتبارنامه معمولاً همان نتیجه را بازتولید می‌کند. خطاهای گذرای شبکه، پاسخ‌های 429 و پاسخ‌های 5xx با backoff نمایی دوباره تلاش می‌شوند.

۶. به‌جای پرتاب همه درخواست‌ها هم‌زمان، یک محدودیت هم‌زمانی اضافه کنید

gateway چرخشی تغییرات IP را برای شما انجام می‌دهد، بنابراین ریسک اصلی برای کار شما حمله‌ور شدن به یک هدف واحد با سرعت زیاد است. URLها را در دسته‌های کوچک پردازش کنید و اگر شروع به دیدن پاسخ‌های 403 یا 429 کردید، اندازه دسته را کاهش دهید:

async function scrapeAll(urls, concurrency = 4) {
  const results = [];
  for (let i = 0; i < urls.length; i += concurrency) {
    const batch = urls.slice(i, i + concurrency);
    const settled = await Promise.allSettled(batch.map((url) => getWithRetry(url)));
    results.push(...settled);
  }
  return results;
}

برای یک هدف جدید با هم‌زمانی ۲ تا ۴ شروع کنید، نرخ خطا را زیر نظر بگیرید و تنها پس از آن مقیاس را افزایش دهید. یک اجرای کندتر که کامل می‌شود ارزان‌تر از یک اجرای سریع است که بلاک می‌شود، به‌ویژه در صورت‌حساب پرداخت به میزان مصرف که درخواست‌های ناموفق هم ترافیک مصرف می‌کنند.

۷. اختیاری: همان کلاینت را به SOCKS5 تغییر دهید

اگر یک کتابخانه یا ابزار CLI فقط SOCKS را می‌پذیرد، عامل را عوض کنید. از پورت SOCKS5 در داشبورد Dataimpulse خود استفاده کنید، نه پورت HTTP:

const { SocksProxyAgent } = require('socks-proxy-agent');

const socksUrl = `socks5://${process.env.PROXY_USER}:${encodeURIComponent(process.env.PROXY_PASS)}@${process.env.PROXY_HOST}:${process.env.PROXY_PORT}`;
const agent = new SocksProxyAgent(socksUrl);

const client = axios.create({
  httpAgent: agent,
  httpsAgent: agent,
  proxy: false,
  timeout: 20000,
});

اختصاص همان عامل به هر دو httpAgent و httpsAgent اهداف HTTP ساده و HTTPS را سازگار نگه می‌دارد، که وقتی یک اسکرپ ریدایرکت‌ها را در هر دو طرح دنبال می‌کند اهمیت دارد.

عیب‌یابی

نشانه علت احتمالی راه‌حل
407 Proxy Authentication Required نام کاربری/رمز عبور اشتباه یا گم‌شده اعتبارنامه‌های داشبورد را دوباره بررسی کنید و کدگذاری URL نویسه‌های خاص را تأیید کنید
ECONNREFUSED یا تایم‌اوت فوری هنگام اتصال پورت اشتباه، یا استفاده از پورت HTTP برای درخواست SOCKS5 پورت را با پروتکل انتخاب‌شده مطابقت دهید
URLهای HTTP کار می‌کنند، URLهای HTTPS شکست می‌خورند Axios به‌جای عامل، از مدیریت پروکسی داخلی خود استفاده می‌کند از https-proxy-agent استفاده کنید و proxy: false را تنظیم کنید
403 یا 429 مکرر از سایت هدف نرخ درخواست برای آن میزبان بیش از حد بالاست هم‌زمانی را به ۱ یا ۲ کاهش دهید، backoff را افزایش دهید، هدرها را واقع‌گرایانه نگه دارید
درخواست‌ها در مرورگر موفق‌اند اما در Node شکست می‌خورند مرورگر و ترمینال تنظیمات پروکسی متفاوتی دارند متغیرهای محیطی را در ترمینالی که اسکریپت را اجرا می‌کند دوباره export کنید
هشدارهای گواهی یا TLS ظاهر می‌شوند TLS رهگیری‌شده یا ناهمخوان اعتبارسنجی گواهی را غیرفعال نکنید؛ URL هدف و پیکربندی پروکسی را بررسی کنید

خلاصه

شما یک پروژه Node.js راه‌اندازی کردید که درخواست‌های Axios را از طریق یک پروکسی مسکونی Dataimpulse ارسال می‌کند، IP خروجی را تأیید کردید، HTML را با Cheerio تجزیه کردید و تلاش‌های مجدد، backoff و سقف هم‌زمانی را اضافه کردید. چون gateway خروجی‌ها را برای شما می‌چرخاند، تلاش مهندسی باید صرف تنظیم سرعت، مدیریت خطا و قابلیت مشاهده شود، نه تغییر دستی IP. برای اولین اجرا، IP خروجی را تأیید کنید، یک صفحه را اسکرپ کنید، سپس هم‌زمانی را به‌تدریج افزایش دهید و نرخ خطا و مصرف ترافیک خود را زیر نظر بگیرید. هنگام جمع‌آوری داده، همیشه شرایط خدمات سایت هدف، دستورالعمل‌های robots و قوانین قابل‌اعمال را رعایت کنید.

مطالعه مرتبط در ProxyScout.net: پروکسی‌های مسکونی چرخشی در مقیاس بزرگ، اسکرپینگ مبتنی بر Python با Dataimpulse، و پیکربندی پروکسی‌های Dataimpulse با Proxifier در Windows.