In this Article

web scraping with javascript

In this Article

یہ گائیڈ دکھاتا ہے کہ Node.js استعمال کرتے ہوئے جاوا اسکرپٹ سے ویب اسکریپنگ کیسے کی جاتی ہے۔ بڑے پیمانے پر عوامی ڈیٹا جمع کرنے کے لیے زیادہ تر انجینئرز Node.js ہی کو رن ٹائم کے طور پر چنتے ہیں۔ جاوا اسکرپٹ کے ساتھ ویب اسکریپنگ سیکھنے کا اصل مطلب یہ ہے کہ ہر صفحے کے لیے درست ٹول منتخب کیا جائے: ساکن HTML کے لیے ہلکا HTTP کلائنٹ، اور اسکرپٹس سے لوڈ ہونے والے مواد کے لیے ہیڈلیس براؤزر۔

نیچے دونوں صورتوں کے لیے چلنے کے قابل Node.js کوڈ دیا گیا ہے۔ اس کے ساتھ پراجیکٹ سیٹ اپ، JSON اور CSV میں منظم ایکسپورٹ، صفحات بندی، بیک آف کے ساتھ دوبارہ کوششیں، درخواستوں کی حد بندی، پراکسی توثیق، XHR انٹرسیپشن، اور وہ اخلاقی و بلاکنگ پہلو بھی شامل ہیں جو طے کرتے ہیں کہ کوئی اسکریپر وقت کے ساتھ قابل اعتماد رہتا ہے یا نہیں۔

DataImpulse ایک اخلاقی پراکسی فراہم کنندہ ہے جو 195 ممالک میں 90 ملین سے زیادہ رہائشی، موبائل اور ڈیٹا سینٹر IP ایڈریسز دیتا ہے۔ اس کا پے ایز یو گو ماڈل 1 ڈالر فی جی بی سے شروع ہوتا ہے، ٹریفک کی معیاد ختم نہیں ہوتی، اور اسے ویب اسکریپنگ، اشتہارات کی تصدیق، قیمتوں کی نگرانی، مارکیٹ ریسرچ اور ملٹی اکاؤنٹ مینجمنٹ کے لیے استعمال کیا جاتا ہے۔

اہم حقائق

  • دو ٹول چینز: سٹیٹک صفحات کو صرف ایک HTTP کلائنٹ اور fetch اور cheerio جیسے پارسر کی ضرورت ہوتی ہے، جبکہ ڈائنامک صفحات جو براؤزر میں مواد رینڈر کرتے ہیں انہیں Puppeteer یا Playwright جیسے ہیڈلیس انجن کی ضرورت ہوتی ہے۔
  • بہترین پراکسی قسم: گھومنے والی رہائشی پراکسیز، جو حقیقی صارفین کے IP استعمال کرتی ہیں اور شناخت کے نظاموں میں کم نمایاں ہوتی ہیں۔
  • قیمت: 1 ڈالر فی جی بی سے، پے ایز یو گو، ایسی ٹریفک جس کی معیاد ختم نہیں ہوتی، اور کوئی سبسکرپشن نہیں۔
  • کوریج: 195 ممالک میں اخلاقی طور پر حاصل کردہ 90M سے زیادہ IP۔
  • قابل اعتمادی: 99.51% کامیابی کی شرح، G2 پر 5 میں سے 4.8 کی درجہ بندی۔
  • پروٹوکولز اور ٹارگٹنگ: HTTP، HTTPS اور SOCKS5، جن میں ملک کے حساب سے ٹارگٹنگ شامل ہے۔
سٹیٹک بمقابلہ ڈائنامک: اپنا جاوا اسکرپٹ اسکریپنگ راستہ منتخب کریں

جاوا اسکرپٹ کے ساتھ ویب اسکریپنگ کیا ہے؟

جاوا اسکرپٹ کے ساتھ ویب اسکریپنگ سے مراد یہ ہے کہ جاوا اسکرپٹ کے ذریعے پروگراماتی طور پر ویب صفحات منگوائے جائیں اور ان سے منظم ڈیٹا نکالا جائے۔ عام طور پر یہ کام براؤزر ٹیب کے بجائے Node.js رن ٹائم میں چلتا ہے۔

جاوا اسکرپٹ اس کام کے لیے فطری انتخاب ہے، کیونکہ یہ زبان پہلے ہی Document Object Model کے تصور سے جڑی ہوئی ہے، اس لیے عناصر کا انتخاب فرنٹ اینڈ ڈویلپرز کو مانوس لگتا ہے۔ عملی طور پر اسکریپر تین کام کرتا ہے: HTTP کے ذریعے صفحہ منگواتا ہے، واپس آنے والے مارک اپ کو قابل تلاش درخت میں پارس کرتا ہے، اور مطلوبہ فیلڈز جیسے عنوانات، قیمتیں یا لنکس نکالتا ہے۔ اصل پیچیدگی اس بات میں ہے کہ ہدف صفحہ اپنا ڈیٹا کیسے فراہم کرتا ہے، اسی لیے درست ٹول کا انتخاب پارسنگ سے بھی زیادہ اہم ہو جاتا ہے۔ ساکن صفحات اپنا ڈیٹا پہلے HTML رسپانس ہی میں بھیج دیتے ہیں، جبکہ متحرک صفحات لوڈ ہونے کے بعد براؤزر میں اسے جوڑتے ہیں، اس لیے دونوں کے لیے مختلف ٹول چینز درکار ہوتی ہیں۔

Node.js اسکریپنگ پراجیکٹ کیسے سیٹ اپ کیا جائے؟

ایک پراجیکٹ فولڈر بنائیں، اسے npm سے شروع کریں، اور اسکریپنگ کوڈ لکھنے سے پہلے ضروری لائبریریز انسٹال کر لیں۔

Node.js 18 اور بعد کے ورژنز میں ایک بلٹ ان گلوبل fetch شامل ہوتا ہے، اس لیے سادہ GET درخواستوں کے لیے الگ HTTP لائبریری ضروری نہیں۔ پھر بھی بہت سی ٹیمیں axios کو اس کے انٹرسیپٹرز اور پراکسی ہینڈلنگ کی وجہ سے ترجیح دیتی ہیں۔ نیچے دیے گئے کمانڈز پراجیکٹ تیار کرتے ہیں، پارسنگ کے لیے cheerio، متبادل کلائنٹ کے طور پر axios، بیک وقت کاموں کے کنٹرول کے لیے p-limit، اور متحرک صفحات کے لیے Puppeteer اور Playwright انسٹال کرتے ہیں:

mkdir js-scraper && cd js-scraper
npm init -y
npm install cheerio axios p-limit
npm install puppeteer playwright

# enable modern import syntax
npm pkg set type=module

type=module سیٹ کرنے سے آپ import اسٹیٹمنٹس استعمال کر سکتے ہیں۔ اگر آپ CommonJS کو ترجیح دیتے ہیں تو ڈیفالٹ ہی رہنے دیں اور اس کے بجائے require استعمال کریں۔ اس گائیڈ کی مثالیں import syntax استعمال کرتی ہیں، لیکن ہر مثال براہ راست ایک require کال سے بھی لکھی جا سکتی ہے۔ انسٹالیشن مکمل ہونے کے بعد اسی پراجیکٹ میں ساکن اور متحرک، دونوں طرح کی اسکریپنگ کے لیے سب کچھ موجود ہوگا۔

fetch اور cheerio سے ساکن صفحہ کیسے اسکریپ کریں؟

ساکن صفحات کے لیے بلٹ ان fetch فنکشن سے HTML ڈاؤن لوڈ کریں اور اسے cheerio سے پارس کریں، جو سرور پر jQuery طرز کا API دیتا ہے۔

ساکن صفحات اپنا مواد براہ راست ابتدائی HTML رسپانس میں واپس کرتے ہیں، اس لیے براؤزر رینڈرنگ کی ضرورت نہیں پڑتی۔ یہ طریقہ تیز اور کم خرچ ہے، کیونکہ آپ صرف مارک اپ ڈاؤن لوڈ کرتے ہیں، تصاویر، فونٹس یا اسکرپٹس نہیں۔ نیچے دی گئی مثال ایک صفحہ منگواتی ہے، اسے cheerio میں لوڈ کرتی ہے، اور ہر پروڈکٹ کارڈ پڑھتی ہے:

import * as cheerio from 'cheerio';

async function scrape(url) {
  const res = await fetch(url, {
    headers: { 'User-Agent': 'Mozilla/5.0 (compatible; MyScraper/1.0)' }
  });
  if (!res.ok) throw new Error(`Request failed: ${res.status}`);
  const html = await res.text();
  const $ = cheerio.load(html);

  const items = [];
  $('.product').each((i, el) => {
    items.push({
      title: $(el).find('h2').text().trim(),
      price: $(el).find('.price').text().trim(),
      link: $(el).find('a').attr('href')
    });
  });
  return items;
}

console.log(await scrape('https://example.com/catalog'));

اگر آپ axios کو ترجیح دیتے ہیں تو پارسنگ وہی رہتی ہے، صرف درخواست کا طریقہ بدلتا ہے۔ axios غیر 2xx اسٹیٹس کوڈز پر خود بخود خرابی پھینکتا ہے اور پراکسی کنفیگریشن آسان بناتا ہے، اسی لیے بہت سے پروڈکشن اسکریپرز اسے استعمال کرتے ہیں:

import axios from 'axios';
import * as cheerio from 'cheerio';

const { data: html } = await axios.get('https://example.com/catalog', {
  headers: { 'User-Agent': 'Mozilla/5.0 (compatible; MyScraper/1.0)' },
  timeout: 15000
});
const $ = cheerio.load(html);
const titles = $('.product h2').map((i, el) => $(el).text().trim()).get();
console.log(titles);

کسی بھی سائٹ پر اسکریپر چلانے سے پہلے یہ دیکھ لینا بہتر ہے کہ ہدف سائٹ اس کی اجازت دیتی ہے یا نہیں۔ ہماری گائیڈ یہ کیسے چیک کریں کہ ویب سائٹ اسکریپنگ کی اجازت دیتی ہے یا نہیں robots.txt اور سروس کی شرائط کا جائزہ لیتی ہے۔

ساختہ ڈیٹا کو JSON اور CSV میں کیسے نکالیں؟

ہر ریکارڈ کو سادہ آبجیکٹس کی ایک ارے میں جمع کریں، پھر اس ارے کو JSON فائل میں لکھیں، یا CSV کے لیے اسے کوما سے جدا قطاروں میں بدل دیں۔

خام نکالا ہوا متن اسی وقت کام آتا ہے جب اسے ایک قابل پیش گوئی شکل میں محفوظ کیا جائے۔ JSON سب سے آسان فارمیٹ ہے، کیونکہ جاوا اسکرپٹ کی ارے براہ راست serialize ہو جاتی ہے۔ نیچے دیا گیا اسنیپٹ بلٹ ان فائل سسٹم ماڈیول سے نکالے گئے آئٹمز کو ڈسک پر لکھتا ہے:

import { writeFile } from 'node:fs/promises';

const items = await scrape('https://example.com/catalog');
await writeFile('products.json', JSON.stringify(items, null, 2), 'utf-8');
console.log(`Saved ${items.length} records to products.json`);

CSV اس وقت بہتر رہتا ہے جب ڈیٹا کسی اسپریڈشیٹ یا ڈیٹا ویئر ہاؤس میں جانا ہو۔ آپ کوٹیشن نشانات کو ایسکیپ کر کے اور فیلڈز کو جوڑ کر اسے بغیر لائبریری کے بھی بنا سکتے ہیں، لیکن ایسکیپنگ ضروری ہے کیونکہ قیمتوں اور عنوانات میں کوما آ سکتے ہیں:

import { writeFile } from 'node:fs/promises';

function toCsv(rows) {
  const headers = Object.keys(rows[0]);
  const escape = (v) => `"${String(v ?? '').replace(/"/g, '""')}"`;
  const lines = [headers.join(',')];
  for (const row of rows) {
    lines.push(headers.map((h) => escape(row[h])).join(','));
  }
  return lines.join('\n');
}

const items = await scrape('https://example.com/catalog');
await writeFile('products.csv', toCsv(items), 'utf-8');

ہر رن میں فیلڈ نام مستقل رکھیں تاکہ صفحے کا لے آؤٹ ذرا بدلنے پر ڈاؤن اسٹریم ٹولز خراب نہ ہوں۔ اگر آپ کو بائنری اثاثے بھی نکالنے ہوں تو ہماری گائیڈ ویب سائٹ سے تصاویر اسکریپ کرنے کا طریقہ دیکھیں۔

صفحات بندی کے ساتھ متعدد صفحات کیسے اسکریپ کریں؟

سائٹ کے صفحہ URLs پر لوپ چلائیں یا ہر صفحے پر اگلے صفحے کے لنک کی پیروی کریں، ہر صفحہ اسکریپ کریں، اور جب مزید نتائج نہ رہیں تو رک جائیں۔

زیادہ تر کیٹلاگ ?page=2 جیسے کوئری پیرامیٹر سے نتائج کو نمبر والے صفحات میں تقسیم کرتے ہیں، یا اگلے صفحے کا لنک دکھاتے ہیں۔ سب سے محفوظ طریقہ یہ ہے کہ ہر صفحہ پڑھا جائے، اس کے ریکارڈز جمع کیے جائیں، پھر اگلا صفحہ تلاش کیا جائے، اور جب وہ موجود نہ ہو تو رک جایا جائے۔ نیچے دی گئی مثال نمبر والے صفحات پر اس وقت تک چلتی ہے جب تک کوئی صفحہ صفر آئٹمز واپس نہ کرے:

import * as cheerio from 'cheerio';

async function scrapeAll(base) {
  const all = [];
  for (let page = 1; page <= 50; page++) {
    const res = await fetch(`${base}?page=${page}`, {
      headers: { 'User-Agent': 'Mozilla/5.0 (compatible; MyScraper/1.0)' }
    });
    if (!res.ok) break;
    const $ = cheerio.load(await res.text());
    const items = $('.product').map((i, el) => ({
      title: $(el).find('h2').text().trim(),
      price: $(el).find('.price').text().trim()
    })).get();

    if (items.length === 0) break;
    all.push(...items);
    await new Promise((r) => setTimeout(r, 1000));
  }
  return all;
}

console.log((await scrapeAll('https://example.com/catalog')).length);

صفحات کے درمیان ایک سیکنڈ کا وقفہ اور 50 iterations کی سخت حد نوٹ کریں۔ اگر سائٹ کبھی خالی صفحہ واپس نہ کرے تو یہ حد بے قابو لوپ کو روکتی ہے۔ جب مواد نمبر والے صفحات کے بجائے اسکرولنگ سے لوڈ ہوتا ہے تو ہیڈلیس براؤزر کی ضرورت پڑتی ہے، جس کا ذکر نیچے Puppeteer سیکشن میں ہے۔

دوبارہ کوششیں، بیک آف اور درخواستوں کی حد بندی کیسے سنبھالیں؟

ہر درخواست کو ایسے ری ٹرائی ہیلپر میں لپیٹیں جو ہر ناکامی کے بعد انتظار کا وقفہ بڑھاتا جائے، اور بیک وقت چلنے والی درخواستوں کی تعداد محدود رکھیں تاکہ آپ سائٹ کی برداشت کے اندر رہیں۔

نیٹ ورک ہمیشہ قابل اعتماد نہیں ہوتے اور سرورز عارضی خرابیاں واپس کر سکتے ہیں، اس لیے جو اسکریپر پہلی ناکامی پر رک جائے وہ غیر ضروری طور پر ڈیٹا کھو دیتا ہے۔ Exponential backoff والا ری ٹرائی ہیلپر کوششوں کے درمیان وقفہ بتدریج بڑھاتا ہے، جس سے ریٹ لمیٹڈ سرور کو بحال ہونے کا وقت بھی ملتا ہے:

async function fetchWithRetry(fn, retries = 4, delay = 1000) {
  for (let attempt = 1; attempt <= retries; attempt++) {
    try {
      return await fn();
    } catch (err) {
      if (attempt === retries) throw err;
      const wait = delay * 2 ** (attempt - 1);
      console.warn(`Attempt ${attempt} failed, retrying in ${wait}ms`);
      await new Promise((r) => setTimeout(r, wait));
    }
  }
}

const html = await fetchWithRetry(async () => {
  const res = await fetch('https://example.com/catalog');
  if (res.status === 429) throw new Error('Rate limited');
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  return res.text();
});

بیک آف انفرادی درخواستوں کو سنبھالتا ہے، مگر یہ بھی کنٹرول کرنا ضروری ہے کہ کتنی درخواستیں بیک وقت چلیں۔ سینکڑوں بیک وقت درخواستیں بھیجنا ہدف سرور پر بوجھ ڈالتا ہے اور آپ کی ٹریفک کو مشکوک بنا سکتا ہے۔ p-limit لائبریری بیک وقت کاموں کی تعداد محدود کرتی ہے تاکہ ورکرز کی مقررہ تعداد URLs کی قطار پروسیس کرے:

import pLimit from 'p-limit';

const limit = pLimit(5); // at most 5 requests in flight
const urls = Array.from({ length: 100 }, (_, i) =>
  `https://example.com/item/${i + 1}`
);

const results = await Promise.all(
  urls.map((url) =>
    limit(() => fetchWithRetry(async () => {
      const res = await fetch(url);
      if (!res.ok) throw new Error(`HTTP ${res.status}`);
      return res.text();
    }))
  )
);

console.log(`Fetched ${results.length} pages with a cap of 5 in parallel`);

بیک آف اور بیک وقت درخواستوں کی حد مل کر آپ کے فٹ پرنٹ کو مناسب رکھتے ہیں اور کامیابی کی شرح بہتر بناتے ہیں۔ زیادہ جامع چیک لسٹ کے لیے ہماری ویب اسکریپنگ بہترین طریقوں کی گائیڈ دیکھیں۔

Puppeteer کے ساتھ ڈائنامک صفحات کیسے اسکریپ کریں؟

ایسے متحرک صفحات کے لیے جو لوڈ ہونے کے بعد جاوا اسکرپٹ سے مواد بناتے ہیں، Puppeteer کے ذریعے ہیڈلیس Chrome چلائیں، ہدف سلیکٹر کا انتظار کریں، اور مکمل رینڈر شدہ DOM پڑھیں۔

بہت سی جدید سائٹس تقریبا خالی HTML شیل واپس کرتی ہیں اور پھر بیک گراؤنڈ درخواستوں سے ڈیٹا لاتی ہیں۔ HTTP کلائنٹ کو اس میں کوئی مفید مواد نظر نہیں آتا، اس لیے ایسا انجن چاہیے جو صفحے کی اپنی جاوا اسکرپٹ چلا سکے۔ Puppeteer ہیڈلیس Chrome کو کنٹرول کرتا ہے اور عناصر کا انتظار، کلک اور اسکرول کر سکتا ہے۔ نیچے دی گئی مثال ایک سلیکٹر کا انتظار کرتی ہے، پھر براؤزر کانٹیکسٹ میں ڈیٹا نکالنے سے پہلے infinite-scroll لوڈنگ شروع کرنے کے لیے بار بار اسکرول کرتی ہے:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (compatible; MyScraper/1.0)');
await page.goto('https://example.com/feed', { waitUntil: 'networkidle2' });

// wait until the first batch of cards is present
await page.waitForSelector('.product');

// infinite scroll: scroll to the bottom until height stops growing
let previousHeight = 0;
for (let i = 0; i < 20; i++) {
  const height = await page.evaluate('document.body.scrollHeight');
  if (height === previousHeight) break;
  previousHeight = height;
  await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
  await new Promise((r) => setTimeout(r, 1500));
}

const items = await page.evaluate(() =>
  Array.from(document.querySelectorAll('.product')).map((el) => ({
    title: el.querySelector('h2')?.innerText.trim(),
    price: el.querySelector('.price')?.innerText.trim()
  }))
);

console.log(`Extracted ${items.length} items`);
await browser.close();

لوپ اس وقت رکتا ہے جب صفحے کی اونچائی بڑھنا بند ہو جاتی ہے، یعنی نیا مواد لوڈ نہیں ہو رہا۔ 20 اسکرولز کی سخت حد لامتناہی لوپ سے بچاتی ہے۔ اس طرح کے ہدف کے بارے میں مزید جاننے کے لیے ہماری گائیڈ ڈائنامک ویب صفحات اسکریپ کرنے کا طریقہ دیکھیں۔

Puppeteer کے متبادل کے طور پر Playwright کیسے استعمال کیا جائے؟

Playwright تقریبا Puppeteer ہی کی طرح کام کرتا ہے، مگر Chromium، Firefox اور WebKit کے لیے فرسٹ کلاس سپورٹ کے ساتھ خودکار انتظار کرنے والے locators بھی دیتا ہے، جس سے غیر مستحکم سلیکٹرز کا مسئلہ کم ہوتا ہے۔

Playwright کو Puppeteer کے کچھ اصل انجینئرز نے بنایا تھا اور اس کا زیادہ تر API مشترک ہے، اس لیے منتقل ہونا عموما چند calls کے نام بدلنے تک محدود رہتا ہے۔ اس کے locators خودکار طور پر انتظار کرتے ہیں کہ عناصر قابل عمل ہو جائیں، جس سے بہت سی دستی waitForSelector calls کی ضرورت ختم ہو جاتی ہے۔ مساوی اسکریپر یوں دکھتا ہے:

import { chromium } from 'playwright';

const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
  userAgent: 'Mozilla/5.0 (compatible; MyScraper/1.0)'
});
const page = await context.newPage();
await page.goto('https://example.com/feed', { waitUntil: 'networkidle' });

await page.locator('.product').first().waitFor();

const items = await page.locator('.product').evaluateAll((els) =>
  els.map((el) => ({
    title: el.querySelector('h2')?.innerText.trim(),
    price: el.querySelector('.price')?.innerText.trim()
  }))
);

console.log(`Extracted ${items.length} items`);
await browser.close();

Playwright اس وقت چنیں جب ایک ہی اسکریپر کو کئی براؤزر انجنز پر ٹیسٹ کرنا ہو یا اس کی بلٹ ان network mocking درکار ہو۔ Puppeteer اس وقت بہتر ہے جب صرف Chrome ہدف ہو اور چھوٹی dependency چاہیے ہو۔ دونوں fetch اور cheerio کے مقابلے میں کہیں زیادہ میموری لیتے ہیں، اس لیے انہیں صرف ان صفحات کے لیے رکھیں جنہیں واقعی رینڈرنگ چاہیے۔

آپ کو کون سا جاوا اسکرپٹ اسکریپنگ ٹول منتخب کرنا چاہیے؟

ساکن HTML کے لیے cheerio کے ساتھ fetch یا axios استعمال کریں، اور Puppeteer یا Playwright کی طرف صرف تب جائیں جب صفحہ اپنا ڈیٹا براؤزر میں رینڈر کرتا ہو۔

درست ٹول کا انحصار اس بات پر ہے کہ صفحہ ڈیٹا کیسے فراہم کرتا ہے اور آپ رینڈرنگ کی درستگی کے مقابلے میں رفتار کو کتنی اہمیت دیتے ہیں۔ HTTP کلائنٹس تیز اور ہلکے ہوتے ہیں لیکن جاوا اسکرپٹ نہیں چلا سکتے؛ ہیڈلیس براؤزرز وہ سب چلاتے ہیں جو ایک حقیقی صارف دیکھتا ہے، مگر زیادہ میموری اور وقت لیتے ہیں۔ نیچے دی گئی ٹیبل ان تبادلوں کا خلاصہ کرتی ہے:

ٹول JS چلاتا ہے رفتار بہترین برائے
fetch + cheerio نہیں سب سے تیز ساکن HTML، زیادہ حجم
axios + cheerio نہیں تیز ساکن HTML، آسان پراکسی کنفیگریشن
Puppeteer جی ہاں سست صرف Chrome کے متحرک صفحات
Playwright جی ہاں سست متحرک صفحات، کراس براؤزر ٹیسٹنگ

ایک عام پروڈکشن طریقہ دونوں کو ملاتا ہے: ہیڈلیس براؤزر صرف ان صفحات یا اینڈ پوائنٹس تک پہنچنے کے لیے استعمال کریں جنہیں رینڈرنگ چاہیے، پھر زیادہ تر درخواستوں کے لیے سادہ HTTP کلائنٹ پر واپس آ جائیں۔ جاوا اسکرپٹ اس کام کے لیے کئی قابل عمل اسٹیکس میں سے ایک ہے؛ اگر آپ ماحولیاتی نظاموں کا موازنہ کر رہے ہیں تو ہماری Rust کے ساتھ ویب اسکریپنگ گائیڈ ایک کمپائل شدہ متبادل کا احاطہ کرتی ہے۔

جاوا اسکرپٹ اسکریپرز کو پراکسی کے ذریعے کیسے گزاریں؟

اپنے HTTP کلائنٹ یا براؤزر لانچ آپشنز میں پراکسی سیٹنگز دیں تاکہ درخواستیں مختلف IP ایڈریس سے جائیں۔ اس سے لوڈ پھیلتا ہے اور کسی ایک ایڈریس کے ریٹ لمیٹ ہونے کا امکان کم ہوتا ہے۔

ایک ہی IP سے بہت سے صفحات اسکریپ کرنا بلاک ہونے کا تیز ترین راستہ ہے۔ ایڈریسز کے ایک پول میں درخواستیں گھمانے سے ٹریفک کئی الگ وزیٹرز جیسی لگتی ہے۔ axios کے ساتھ آپ درخواست کی کنفیگریشن میں پراکسی ہوسٹ، پورٹ اور اسناد دیتے ہیں۔ نیچے دی گئی مثال DataImpulse گیٹ وے کے ذریعے درخواست بھیجتی ہے:

import axios from 'axios';

const { data } = await axios.get('https://example.com', {
  proxy: {
    protocol: 'http',
    host: 'gw.dataimpulse.com',
    port: 823,
    auth: { username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }
  },
  headers: { 'User-Agent': 'Mozilla/5.0 (compatible; MyScraper/1.0)' }
});
console.log(data.length, 'bytes received through the proxy');

Puppeteer پراکسی کو لانچ آرگیومنٹ کے طور پر لیتا ہے اور پھر صفحے پر توثیق کرتا ہے، کیونکہ Chrome پراکسی URL کے اندر اسناد قبول نہیں کرتا۔ یہی پیٹرن Playwright میں بھی ہے، جہاں پراکسی آبجیکٹ میں براہ راست username اور password دیے جا سکتے ہیں:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({
  headless: 'new',
  args: ['--proxy-server=gw.dataimpulse.com:823']
});
const page = await browser.newPage();
await page.authenticate({
  username: 'YOUR_USERNAME',
  password: 'YOUR_PASSWORD'
});
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
console.log(await page.title());
await browser.close();

DataImpulse HTTP، HTTPS، اور SOCKS5 پر رہائشی پراکسیز، ڈیٹا سینٹر پراکسیز، اور موبائل پراکسیز پیش کرتا ہے، جن میں گھومنے والے اور اسٹکی سیشنز شامل ہیں۔ ملک کے حساب سے ٹارگٹنگ شامل ہے، جبکہ اسٹیٹ، شہر، زپ اور ASN ٹارگٹنگ ادا شدہ ایڈ آنز ہیں۔ اگر کوئی پراکسی درخواست توثیق کی خرابی واپس کرے تو ہمارا نوٹ HTTP خرابی 407 کے بارے میں سب سے عام وجہ بتاتا ہے، اور ہماری پراکسی توثیق گائیڈ اسناد کے فارمیٹس کو مزید تفصیل سے بیان کرتی ہے۔

XHR اور JSON اینڈ پوائنٹس کو کیسے پکڑیں؟

رینڈر شدہ HTML اسکریپ کرنے کے بجائے ہیڈلیس براؤزر میں نیٹ ورک ٹریفک دیکھیں اور وہ JSON رسپانسز پڑھیں جو صفحہ بیک گراؤنڈ میں لاتا ہے۔ یہ اکثر زیادہ صاف اور تیز طریقہ ہوتا ہے۔

متحرک صفحات عموما اپنا ڈیٹا کسی پوشیدہ API سے لیتے ہیں جو JSON واپس کرتا ہے۔ اس رسپانس کو براہ راست پڑھنے سے DOM parsing کی ضرورت ختم ہو جاتی ہے اور آپ کو اچھی طرح منظم ریکارڈز ملتے ہیں۔ Puppeteer اور Playwright دونوں رسپانسز سننے اور مطلوبہ ڈیٹا کیپچر کرنے دیتے ہیں۔ نیچے دی گئی Puppeteer مثال کسی بھی API path سے JSON رسپانس کیپچر کرتی ہے:

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({ headless: 'new' });
const page = await browser.newPage();

const captured = [];
page.on('response', async (response) => {
  const url = response.url();
  if (url.includes('/api/') && response.headers()['content-type']?.includes('application/json')) {
    try {
      captured.push(await response.json());
    } catch (err) {
      // non-JSON body, ignore
    }
  }
});

await page.goto('https://example.com/feed', { waitUntil: 'networkidle2' });
console.log(`Captured ${captured.length} JSON payloads`);
await browser.close();

جب آپ اینڈ پوائنٹ URL اور اس کے پیرامیٹرز جان لیں تو اکثر براؤزر کو مکمل طور پر چھوڑا جا سکتا ہے، اور صفحے کے بھیجے ہوئے وہی headers دے کر سادہ fetch سے JSON API کال کی جا سکتی ہے۔ اس طرح آپ کو ساکن اسکریپر کی رفتار اور رینڈر شدہ اسکریپر کی مکمل معلومات، دونوں ملتی ہیں۔ متحرک سائٹس کے لیے یہ سب سے بڑا کارکردگی فائدہ ہے۔

اسکریپنگ کی اخلاقی اور قانونی حدود کیا ہیں؟

صرف عوامی ڈیٹا اسکریپ کریں، سائٹ کی robots.txt اور سروس کی شرائط کا احترام کریں، ذاتی ڈیٹا سے بچیں، اور سرور پر کبھی غیر ضروری بوجھ نہ ڈالیں۔ یہ طریقے آپ کے پراجیکٹ کو قابل دفاع اور پائیدار رکھتے ہیں۔

ڈومین کی جڑ میں robots.txt فائل چیک کریں تاکہ معلوم ہو سکے کہ سائٹ کرالرز کو کن راستوں سے دور رہنے کو کہتی ہے، اور ان ہدایات کو سنجیدگی سے لیں۔ اپنے اسکریپر کو ایک صاف User-Agent سے شناخت کرائیں، درخواستوں کو محدود رفتار سے بھیجیں، اور رسپانسز کیش کریں تاکہ ایک ہی صفحہ غیر ضروری طور پر دوبارہ fetch نہ ہو۔ انفراسٹرکچر کے لحاظ سے آپ کے IP ایڈریسز کا ماخذ اہم ہے۔ DataImpulse ایسے صارفین سے حاصل کردہ اخلاقی پراکسیز چلاتا ہے جو opt-in کرتے ہیں اور معاوضہ پاتے ہیں۔ یہ GDPR کے مطابق ہیں، اور ان کے لیے ڈیٹا پروسیسنگ معاہدہ دستیاب ہے۔ اخلاقیات صرف تعمیل کا معاملہ نہیں؛ شائستہ اور شفاف اسکریپرز ہی دیر تک کام کرتے ہیں۔ پائیدار ڈیٹا جمع کرنے کے اصولوں کے لیے ہماری اخلاقی ویب اسکریپنگ گائیڈ دیکھیں۔

جاوا اسکرپٹ اسکریپنگ ٹولز اور ہر ایک کب استعمال کریں

اکثر پوچھے گئے سوالات

کیا مجھے جاوا اسکرپٹ کے ساتھ اسکریپ کرنے کے لیے Node.js کی ضرورت ہے؟

ایک فوری ون پیج ٹیسٹ سے آگے کسی بھی کام کے لیے، جی ہاں۔ Node.js آپ کو سرور پر اسکریپرز چلانے، بہت سے URLs پر لوپ کرنے، دوبارہ کوششیں سنبھالنے، ڈیٹا ایکسپورٹ کرنے اور پراکسیز استعمال کرنے دیتا ہے۔ یہ کام براؤزر کنسول اچھی طرح نہیں کر پاتا۔

مجھے fetch اور cheerio کی بجائے Puppeteer کب استعمال کرنا چاہیے؟

جب ڈیٹا ابتدائی HTML رسپانس میں موجود ہو تو fetch یا axios کو cheerio کے ساتھ استعمال کریں۔ Puppeteer یا Playwright پر صرف اس وقت جائیں جب صفحہ لوڈ ہونے کے بعد مواد جاوا اسکرپٹ سے رینڈر کرتا ہو، کیونکہ ہیڈلیس براؤزر کہیں زیادہ بھاری ہوتا ہے۔

میں Node.js میں اسکریپ شدہ ڈیٹا کو CSV میں کیسے ایکسپورٹ کروں؟

ریکارڈز کو آبجیکٹس کی ایک ارے کے طور پر جمع کریں، پھر ہر آبجیکٹ کی قدروں کو جوڑ کر، کوٹیشن نشانات اور کوما کو ایسکیپ کرتے ہوئے کوما سے جدا قطاریں بنائیں۔ نتیجہ بلٹ ان fs ماڈیول سے فائل میں لکھیں، یا csv-stringify جیسی لائبریری استعمال کریں۔

جاوا اسکرپٹ کے ساتھ اسکریپنگ کرتے وقت مجھے کیوں بلاک کیا جاتا ہے؟

عام وجوہات یہ ہیں: ایک IP سے بہت زیادہ درخواستیں، غائب یا مشکوک User-Agent، اور درخواستوں کے درمیان کوئی وقفہ نہ ہونا۔ گھومنے والی پراکسیز، حقیقت پسندانہ headers، بیک آف کے ساتھ دوبارہ کوششیں، اور درخواستوں کی حد بندی بلاکس کم کرتی ہیں۔

جاوا اسکرپٹ اسکریپنگ کے لیے کون سی پراکسی قسم بہترین ہے؟

آسان ہدف سائٹس کے لیے ڈیٹا سینٹر پراکسیز تیز اور سستی ہوتی ہیں، جبکہ رہائشی اور موبائل پراکسیز سخت سائٹس پر حقیقی صارفین جیسی زیادہ دکھائی دیتی ہیں۔ گھومنے والے سیشنز درخواستوں کو بہت سے ایڈریسز میں پھیلانے میں مدد کرتے ہیں۔

DataImpulse کب صحیح انتخاب نہیں ہے؟

اگر آپ کو ساکن ISP پراکسیز، مکمل طور پر منظم اسکریپنگ API، یا بینکنگ اور سرکاری سائٹس تک رسائی چاہیے تو DataImpulse درست ٹول نہیں ہے۔ یہ عوامی ڈیٹا جمع کرنے اور مواد تک رسائی کے لیے گھومنے والی رہائشی، موبائل، اور ڈیٹا سینٹر پراکسیز پر توجہ دیتا ہے۔

قابل اعتماد پراکسیز کے ساتھ اسکریپنگ شروع کریں

کیا آپ اپنے جاوا اسکرپٹ اسکریپرز کو مسلسل بلاکس کے بغیر چلانا چاہتے ہیں؟ DataImpulse آپ کو 1 ڈالر فی جی بی سے شروع ہونے والی، ایسی ٹریفک جس کی معیاد ختم نہیں ہوتی، بغیر سبسکرپشن کے اخلاقی طور پر حاصل کردہ رہائشی، موبائل، اور ڈیٹا سینٹر IP فراہم کرتا ہے۔ اکاؤنٹ بنائیں اور آج ہی اپنا پہلا اسکریپر پراکسی کے ذریعے چلائیں۔


Share article: