In this Article

scrape dynamic web pages

In this Article

ڈائنامک ویب پیجز کی اسکریپنگ سیکھنے کا مطلب ایسے مواد سے نمٹنا ہے جو پہلی درخواست میں ملنے والے HTML میں موجود نہیں ہوتا۔ جدید سائٹس پروڈکٹ گرِڈز، قیمتیں، تبصرے اور فیڈز JavaScript کے ذریعے براؤزر میں بناتی ہیں، اس لیے ایک سادہ HTTP درخواست وہاں صرف خالی ڈھانچہ واپس کرتی ہے جہاں اصل ڈیٹا ہونا چاہیے۔

یہ گائیڈ Python میں مکمل ورک فلو سمجھاتی ہے۔ یہ خام HTML جواب کا رینڈر شدہ DOM سے موازنہ کر کے ڈائنامک مواد کی شناخت سے شروع ہوتی ہے، پھر ڈیٹا نکالنے کے طریقوں کو کم خرچ سے زیادہ وسائل طلب تک ترتیب دیتی ہے: چھپا ہوا JSON API تلاش کرنا، Playwright یا Selenium چلانا، لامحدود اسکرول اور مزید لوڈ کرنے والے بٹنوں کو سنبھالنا، پراکسی بینڈوڈتھ کم کرنا، دوبارہ کوششیں شامل کرنا، بیک وقت اسکریپنگ کرنا، اور صاف JSON اور CSV برآمد کرنا۔

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

اہم حقائق

  • ڈائنامک اسکریپنگ: JavaScript سے بنایا گیا مواد خام HTML میں موجود نہیں ہوتا، اس لیے آپ یا تو وہ بنیادی JSON API کال دہراتے ہیں جس سے پیج ڈیٹا لیتا ہے یا پیج کو ہیڈ لیس براؤزر میں رینڈر کرتے ہیں۔
  • بہترین پراکسی قسم: روٹیٹنگ رہائشی پراکسیز، جو حقیقی صارفین کے IP ایڈریسز استعمال کرتی ہیں اور شناخت سے بہتر طور پر بچتی ہیں۔
  • قیمت: 1 ڈالر فی GB سے، ادائیگی بمطابق استعمال، ایسی ٹریفک کے ساتھ جو ختم نہیں ہوتی، اور کوئی سبسکرپشن نہیں۔
  • کوریج: 195 ممالک میں 9 کروڑ سے زیادہ اخلاقی طور پر حاصل کردہ IPs۔
  • قابلِ اعتماد: 99.51% کامیابی کی شرح، G2 پر 5 میں سے 4.8 درجہ بندی۔
  • پروٹوکولز اور ہدف بندی: HTTP، HTTPS اور SOCKS5، جس میں ملک کی سطح کی ہدف بندی شامل ہے۔
ڈائنامک ویب پیجز کی اسکریپنگ کے لیے طریقوں کی ترجیح

کوئی ویب پیج ڈائنامک کیسے بنتا ہے؟

کوئی پیج اُس وقت ڈائنامک ہوتا ہے جب اہم مواد ابتدائی HTML جواب میں آنے کے بجائے براؤزر میں JavaScript سے تیار ہو۔ سرور ایک ہلکا پھلکا ڈھانچہ بھیجتا ہے، پھر کلائنٹ سائیڈ کوڈ ڈیٹا حاصل کر کے پیج کھلنے کے بعد اسے DOM میں شامل کر دیتا ہے۔

سب سے تیز دستی جانچ یہ ہے کہ ایک ہی پیج کے دو منظر آپس میں ملائے جائیں۔ رائٹ کلک کر کے View Source منتخب کریں تاکہ سرور کا واپس کردہ خام HTML دیکھ سکیں، پھر ڈویلپر ٹولز کھول کر Elements پینل کا معائنہ کریں، جو اسکرپٹس چلنے کے بعد لائیو DOM دکھاتا ہے۔ اگر مطلوبہ قیمت یا فہرست Elements پینل میں نظر آتی ہے مگر View Source میں غائب ہے، تو مواد ڈائنامک ہے اور ایک اکیلی درخواست اسے حاصل نہیں کر سکے گی۔

  • سٹیٹک مواد View Source میں موجود ہوتا ہے اور اسے براہِ راست ایک HTTP جواب سے پڑھا جا سکتا ہے۔
  • ڈائنامک مواد صرف رینڈر شدہ DOM میں ظاہر ہوتا ہے اور پس منظر کی درخواستوں کے ذریعے لوڈ ہوتا ہے۔

آپ یہی تشخیص کوڈ میں خودکار بھی بنا سکتے ہیں۔ پہلے، اُس خام HTML میں ہدف عناصر گنیں جو ایک عام HTTP کلائنٹ ڈاؤن لوڈ کرتا ہے:

import requests
from bs4 import BeautifulSoup

url = "https://example.com/products"
headers = {"User-Agent": "Mozilla/5.0"}

resp = requests.get(url, headers=headers, timeout=30)
soup = BeautifulSoup(resp.text, "html.parser")

raw_cards = soup.select("div.product-card")
print("Cards in raw HTML:", len(raw_cards))

# If this prints 0 but the page clearly shows products in a browser,
# the content is injected by JavaScript and the page is dynamic.

پھر، اسی URL کو ایک ہیڈ لیس براؤزر میں رینڈر کریں اور دوبارہ گنیں۔ دونوں اعداد کا فرق ہی ثبوت ہے:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com/products", wait_until="networkidle")
    rendered_cards = page.query_selector_all("div.product-card")
    print("Cards after JavaScript runs:", len(rendered_cards))
    browser.close()

# Raw HTML 0, rendered DOM 48 means the page builds its content dynamically.

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

ڈائنامک پیجز کی اسکریپنگ کے لیے کون سا طریقہ استعمال کریں؟

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

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

طریقہ رفتار لاگت بہترین استعمال بنیادی حد
چھپا ہوا JSON API سب سے تیز سب سے کم ایک صاف XHR کال کے پیچھے موجود ڈیٹا اینڈ پوائنٹ بدل سکتا ہے یا ٹوکنز درکار ہو سکتے ہیں
Playwright معتدل زیادہ مکمل رینڈرنگ، جدید غیر ہم وقت کنٹرول CPU، میموری اور بینڈوڈتھ استعمال کرتا ہے
Selenium معتدل زیادہ پرانے اسٹیکس، وسیع زبانوں کی سپورٹ سست سیٹ اپ، زیادہ طویل انتظار
requests-html سست کم سادہ پیجز پر ہلکا JavaScript بڑی حد تک غیر فعال دیکھ بھال، کمزور رینڈرنگ

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

ڈائنامک پیج کے پیچھے چھپا ہوا API کیسے تلاش کریں؟

وہ پس منظر کی درخواست تلاش کریں جس سے پیج اپنا ڈیٹا لیتا ہے، کیونکہ وہ اینڈ پوائنٹ عموماً صاف JSON واپس کرتا ہے جسے آپ براہِ راست کال کر سکتے ہیں۔ یہ سب سے تیز اور قابلِ اعتماد طریقہ ہے، اور اس میں براؤزر چلانے کی ضرورت نہیں رہتی۔

ڈویلپر ٹولز کھولیں، Network ٹیب پر جائیں، Fetch/XHR سے فلٹر کریں اور پیج دوبارہ لوڈ کریں۔ جیسے جیسے مواد ظاہر ہوتا ہے، ایسی درخواستوں پر نظر رکھیں جو مطلوبہ اقدار پر مشتمل JSON واپس کرتی ہیں۔ درخواست کا URL، طریقہ، کوئری پیرامیٹرز اور بھیجے جانے والے ہیڈرز یا ٹوکنز کا معائنہ کریں، پھر رائٹ کلک کر کے اسے cURL کے طور پر کاپی کریں تاکہ مکمل ساخت دیکھ سکیں۔ ایک بار جب آپ اُس کال کو کسی HTTP کلائنٹ سے دہرا لیں، تو آپ رینڈرنگ مکمل طور پر چھوڑ کر بہت کم لاگت پر منظم ڈیٹا حاصل کر لیتے ہیں۔

یہاں ایک کم سے کم مثال ہے جو ایک پراکسی کے ذریعے JSON اینڈ پوائنٹ کو کال کرتی ہے اور فیلڈز کو براہِ راست پڑھتی ہے:

import requests

proxy = "http://USERNAME:[email protected]:823"
proxies = {"http": proxy, "https": proxy}

headers = {
    "User-Agent": "Mozilla/5.0",
    "Accept": "application/json",
    "Referer": "https://example.com/products",
}
params = {"category": "laptops", "page": 1}

r = requests.get(
    "https://example.com/api/v2/products",
    headers=headers,
    params=params,
    proxies=proxies,
    timeout=30,
)
r.raise_for_status()
data = r.json()

for item in data["items"]:
    print(item["name"], item["price"])

اگر اینڈ پوائنٹ صفحات میں بٹا ہوا ہے، تو page پیرامیٹر بڑھائیں یا جواب میں آنے والے اگلے کرسر کی پیروی کریں۔ جب کسی درخواست کو ٹوکن درکار ہو، تو دیکھیں کہ پیج اسے پہلی بار کہاں جاری کرتا ہے اور اسی سیشن کے اندر اسے دوبارہ استعمال کریں۔ کال کو DataImpulse کے ذریعے روٹ کرنے کا مطلب ہے کہ اینڈ پوائنٹ آپ کے سرور ایڈریس کے بجائے ایک رہائشی IP دیکھتا ہے، جو اُس وقت اہم ہے جب API ماخذ کے حساب سے ریٹ محدود کرتا ہے۔ اگر آپ کو خود پراکسی کی توثیق میں رکاوٹ پیش آئے، تو پراکسی توثیق پر ہمارا نوٹ کریڈینشل فارمیٹ کی وضاحت کرتا ہے۔

Playwright کے ساتھ ڈائنامک پیجز کی اسکریپنگ کیسے کریں؟

جب کال کرنے کے لیے کوئی صاف API نہ ہو، تو Playwright جیسا ہیڈ لیس براؤزر چلائیں تاکہ JavaScript بالکل ویسے ہی چلے جیسے کسی صارف کے لیے چلتا ہے، پھر مکمل DOM پڑھیں۔ Playwright جدید ڈیفالٹ ہے کیونکہ یہ قابلِ اعتماد خودکار انتظار، اعلیٰ درجے کی غیر ہم وقت سپورٹ، اور ایک سادہ پراکسی آپشن فراہم کرتا ہے۔

پہلے اسے انسٹال کریں اور براؤزر کی بائنری ڈاؤن لوڈ کریں:

pip install playwright
playwright install chromium

بنیادی اصول یہ ہے کہ مقررہ وقفوں سے اندازہ لگانے کے بجائے اُس مخصوص عنصر کا انتظار کریں جس کی آپ کو ضرورت ہے۔ نیچے دی گئی مثال Chromium شروع کرتی ہے، اسے ڈکشنری فارم استعمال کرتے ہوئے پراکسی کے ذریعے روٹ کرتی ہے، پروڈکٹ گرِڈ کا انتظار کرتی ہے، اور رینڈر شدہ اقدار نکالتی ہے:

from playwright.sync_api import sync_playwright

PROXY = {
    "server": "http://gw.dataimpulse.com:823",
    "username": "USERNAME",
    "password": "PASSWORD",
}

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True, proxy=PROXY)
    context = browser.new_context(user_agent="Mozilla/5.0")
    page = context.new_page()
    page.goto("https://example.com/products", wait_until="domcontentloaded")

    page.wait_for_selector("div.product-card", timeout=15000)

    cards = page.query_selector_all("div.product-card")
    for card in cards:
        name = card.query_selector(".title").inner_text()
        price = card.query_selector(".price").inner_text()
        print(name, price)

    browser.close()

انتظار ہی وہ مرحلہ ہے جہاں زیادہ تر ڈائنامک اسکریپرز کامیاب یا ناکام ہوتے ہیں، اس لیے چار حکمتِ عملیوں اور ہر ایک کے مناسب استعمال کو جاننا مفید ہے۔ networkidle کے بجائے کسی ٹھوس سلیکٹر یا شرط کا انتظار کرنے کو ترجیح دیں، کیونکہ networkidle اُن پیجز پر اٹک سکتا ہے جو طویل مدتی کنکشن کھلے رکھتے ہیں:

# Wait for a specific element (most reliable)
page.wait_for_selector("div.product-card", timeout=15000)

# Wait for the initial DOM to be built, before every script finishes
page.goto(url, wait_until="domcontentloaded")

# Wait until there are no network connections for 500 ms
page.goto(url, wait_until="networkidle")

# Wait for a custom condition, such as a minimum item count
page.wait_for_function(
    "document.querySelectorAll('div.product-card').length > 20"
)

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

لامحدود اسکرول اور مزید لوڈ کرنے والے بٹنوں کو کیسے سنبھالیں؟

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

براؤزر کی طرف بڑھنے سے پہلے Network ٹیب دوبارہ چیک کریں، کیونکہ لامحدود اسکرول تقریباً ہمیشہ صفحات میں بٹی XHR کال سے چلتا ہے، اور اوپر دیے گئے requests طریقے سے اُس اینڈ پوائنٹ پر لوپ کرنا اسکرول کرنے سے کہیں سستا ہے۔ اگر آپ کو اسکرول کرنا ہی پڑے، تو اسے ایک قابو شدہ لوپ میں کریں جو نئے آئٹمز نہ آنے پر رک جائے:

def scroll_until_stable(page, item_selector, max_rounds=30):
    seen = 0
    for _ in range(max_rounds):
        page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
        page.wait_for_timeout(1500)
        count = len(page.query_selector_all(item_selector))
        if count == seen:
            break            # no new items loaded, stop
        seen = count
    return seen

جو پیجز اسکرول کے بجائے واضح بٹن استعمال کرتے ہیں، اُن کے لیے کلک لوپ درکار ہوتا ہے۔ ہر کلک سے پہلے آئٹمز کی گنتی پڑھیں، بٹن پر کلک کریں، اور گنتی کے بڑھنے کا انتظار کریں تاکہ آپ رینڈرنگ سے آگے نہ نکل جائیں:

def click_load_more(page, button_selector, item_selector, max_clicks=50):
    for _ in range(max_clicks):
        button = page.query_selector(button_selector)
        if button is None or not button.is_visible():
            break
        before = len(page.query_selector_all(item_selector))
        button.click()
        page.wait_for_function(
            "([sel, n]) => document.querySelectorAll(sel).length > n",
            arg=[item_selector, before],
        )
    return len(page.query_selector_all(item_selector))

جمع کرتے وقت ساتھ ساتھ ڈپلیکیٹ ہٹاتے جائیں، کیونکہ ہر چکر میں انہی نوڈز کو دوبارہ پڑھنا عام بات ہے۔ منفرد IDs یا URLs کا ایک سیٹ رکھیں اور صرف وہ ریکارڈز شامل کریں جو پہلے نہیں دیکھے گئے۔

کیا آپ Playwright کے بجائے Selenium استعمال کر سکتے ہیں؟

جی ہاں، Selenium بھی اسی طرح ایک حقیقی براؤزر چلاتا ہے اور یہ اُس وقت مضبوط انتخاب ہے جب آپ کی ٹیم پہلے سے اسے استعمال کر رہی ہو یا اس کی وسیع زبانوں کی سپورٹ درکار ہو۔ اس کا طریقہ Playwright جیسا ہی ہے: پیج لوڈ کریں، WebDriverWait سے کسی شرط کا انتظار کریں، پھر رینڈر شدہ DOM سے عناصر پڑھیں۔

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument("--headless=new")
options.add_argument("--proxy-server=http://gw.dataimpulse.com:823")

driver = webdriver.Chrome(options=options)
driver.get("https://example.com/products")

WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "div.product-card"))
)

for card in driver.find_elements(By.CSS_SELECTOR, "div.product-card"):
    name = card.find_element(By.CSS_SELECTOR, ".title").text
    price = card.find_element(By.CSS_SELECTOR, ".price").text
    print(name, price)

driver.quit()

ایک احتیاط: سادہ –proxy-server فلیگ یوزرنیم اور پاس ورڈ قبول نہیں کرتا، اس لیے توثیق شدہ پراکسی کے لیے ایک معاون درکار ہوتا ہے۔ Selenium Wire لائبریری کریڈینشلز کو صاف طریقے سے شامل کرتی ہے، اور Selenium Wire پراکسی سیٹ اپ پر ہماری وضاحت درست ترتیب دکھاتی ہے۔ Selenium کو Playwright کے مقابلے میں ترتیب دینا زیادہ بھاری ہے اور اس کے انتظار عموماً زیادہ طویل ہوتے ہیں، اس لیے نئے پروجیکٹس اکثر Playwright سے شروع کرتے ہیں جب تک Selenium پر رہنے کی کوئی وجہ نہ ہو۔

پیجز رینڈر کرتے وقت پراکسی بینڈوڈتھ کیسے کم کریں؟

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

Playwright آپ کو درخواستیں روکنے اور اُن غیر متعلقہ درخواستوں کو منسوخ کرنے دیتا ہے جن کی ڈیٹا نکالنے کے عمل میں ضرورت نہیں ہوتی۔ تصاویر، میڈیا اور فونٹس بلاک کرنے سے پراکسی ٹریفک تیزی سے کم ہو سکتی ہے، جبکہ وہ JSON اور HTML جو آپ اصل میں پڑھتے ہیں بغیر چھیڑ چھاڑ کے رہتے ہیں:

BLOCK = {"image", "media", "font"}

def block_heavy(route):
    if route.request.resource_type in BLOCK:
        route.abort()
    else:
        route.continue_()

context = browser.new_context()
context.route("**/*", block_heavy)
page = context.new_page()
page.goto("https://example.com/products", wait_until="domcontentloaded")

آپ اسی ہینڈلر کو بڑھا کر اُن اینالٹکس اور اشتہاری ڈومینز کو چھوڑ سکتے ہیں جو ڈیٹا بڑھائے بغیر بوجھ بڑھاتے ہیں۔ DataImpulse کی ٹریفک 1 ڈالر فی GB سے ادائیگی بمطابق استعمال پر بل ہوتی ہے اور ختم نہیں ہوتی، اس لیے ضائع بائٹس کم کرنا ہر اسکریپ کی لاگت کو براہِ راست گھٹاتا ہے۔ متعلقہ پیجز کے درمیان ایک ہی براؤزر کانٹیکسٹ دوبارہ استعمال کرنا بار بار شروع ہونے کی لاگت سے بھی بچاتا ہے، اور سب سے سستی درخواست وہی رہتی ہے جس سے آپ چھپے ہوئے API پر جا کر بچ جاتے ہیں۔

ایرر ہینڈلنگ اور دوبارہ کوششیں کیسے شامل کریں؟

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

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

import time
from playwright.sync_api import TimeoutError as PlaywrightTimeout

def fetch_with_retries(page, url, selector, retries=3, backoff=2):
    for attempt in range(1, retries + 1):
        try:
            page.goto(url, wait_until="domcontentloaded", timeout=30000)
            page.wait_for_selector(selector, timeout=15000)
            return page.query_selector_all(selector)
        except PlaywrightTimeout:
            wait = backoff ** attempt
            print(f"Attempt {attempt} timed out, retrying in {wait}s")
            time.sleep(wait)
    raise RuntimeError(f"Failed to load {url} after {retries} attempts")

دوبارہ کوششوں کو پراکسی روٹیشن کے ساتھ جوڑیں تاکہ ہر کوشش ایک تازہ IP کے ذریعے باہر جائے۔ اگر ایک ایگزٹ ریٹ لمٹ کا شکار ہو، تو اگلی درخواست کسی مختلف ایڈریس سے جاتی ہے اور اکثر کامیاب ہو جاتی ہے۔ رہائشی پراکسیز یا موبائل پراکسیز کا ایک روٹیٹنگ پول ہر درخواست پر خودکار طور پر نئی IP تفویض کرتا ہے، جو کئی سخت بلاکس کو ایک سادہ دوبارہ کوشش میں بدل دیتا ہے۔ خاص طور پر پراکسی سطح کی ناکامیوں سے نمٹنے کے لیے، HTTP ایرر 407 پر ہمارا نوٹ سب سے عام توثیقی جواب کا احاطہ کرتا ہے۔

بہت سے ڈائنامک پیجز کو بیک وقت کیسے اسکریپ کریں؟

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

سیمافور اس بات کی حد مقرر کرتا ہے کہ کتنے پیجز متوازی طور پر چلیں۔ ٹاسکس کے درمیان ایک ہی براؤزر اور کانٹیکسٹ شیئر کریں، ہر URL کے لیے ایک پیج کھولیں، اور نتائج اکٹھے کریں:

import asyncio
from playwright.async_api import async_playwright

PROXY = {
    "server": "http://gw.dataimpulse.com:823",
    "username": "USERNAME",
    "password": "PASSWORD",
}

async def scrape_one(context, url, sem):
    async with sem:
        page = await context.new_page()
        try:
            await page.goto(url, wait_until="domcontentloaded")
            await page.wait_for_selector("div.product-card", timeout=15000)
            cards = await page.query_selector_all("div.product-card")
            return [await c.inner_text() for c in cards]
        finally:
            await page.close()

async def main(urls):
    sem = asyncio.Semaphore(5)   # at most 5 pages at once
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True, proxy=PROXY)
        context = await browser.new_context()
        tasks = [scrape_one(context, u, sem) for u in urls]
        results = await asyncio.gather(*tasks)
        await browser.close()
    return results

urls = ["https://example.com/products?page=%d" % i for i in range(1, 21)]
data = asyncio.run(main(urls))

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

اسکریپ کیے گئے ڈیٹا کو JSON اور CSV میں کیسے برآمد کریں؟

ہر پیج کے نتائج کو ڈکشنریوں کی ایک فہرست میں جمع کریں، پھر نیسٹڈ ڈیٹا کے لیے اُس فہرست کو JSON میں، یا فلیٹ اور اسپریڈشیٹ کے لیے موزوں ٹیبلز کے لیے CSV میں لکھیں۔ ڈیٹا نکالنے اور برآمد کرنے کو الگ رکھنے سے اسکریپر کی جانچ اور دوبارہ چلانا آسان ہو جاتا ہے۔

import json
import csv

records = [
    {"name": "Laptop A", "price": "999"},
    {"name": "Laptop B", "price": "1299"},
]

# Export to JSON
with open("products.json", "w", encoding="utf-8") as f:
    json.dump(records, f, ensure_ascii=False, indent=2)

# Export to CSV
with open("products.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "price"])
    writer.writeheader()
    writer.writerows(records)

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

دیر سے لوڈ ہونے والے مواد کے لیے انتظار کی حکمتِ عملیاں

اکثر پوچھے جانے والے سوالات

اسکریپر لکھنے سے پہلے میں کیسے جان سکتا ہوں کہ کوئی پیج ڈائنامک ہے؟

ڈویلپر ٹولز میں View Source کا Elements پینل سے موازنہ کریں، یا خام HTML اور رینڈر شدہ DOM میں کوئی ہدف عنصر گنیں۔ اگر ڈیٹا صرف JavaScript چلنے کے بعد ظاہر ہوتا ہے، تو پیج ڈائنامک ہے اور اسے API کال یا ہیڈ لیس براؤزر کی ضرورت ہے۔

چھپے ہوئے API کو کال کرنا بہتر ہے یا headless براؤزر استعمال کرنا؟

جب آپ چھپا ہوا API تلاش کر سکیں تو اسے کال کریں، کیونکہ یہ رینڈرنگ کی لاگت اور وقت کے ایک معمولی حصے میں صاف JSON واپس کرتا ہے۔ ہیڈ لیس براؤزر صرف اُس وقت استعمال کریں جب کوئی قابلِ تکرار API موجود نہ ہو یا ڈیٹا پیچیدہ کلائنٹ سائیڈ اسکرپٹس پر منحصر ہو۔

ڈائنامک اسکریپنگ کے لیے مجھے Playwright استعمال کرنا چاہیے یا Selenium؟

Playwright قابلِ اعتماد خودکار انتظار اور بلٹ اِن غیر ہم وقت سپورٹ کی بدولت جدید ڈیفالٹ ہے، اس لیے نئے پروجیکٹس عام طور پر وہیں سے شروع ہوتے ہیں۔ Selenium اُس وقت مناسب ہے جب آپ کا اسٹیک پہلے سے اسے استعمال کر رہا ہو یا آپ کو اس کی وسیع تر زبانوں کی سپورٹ درکار ہو۔

ہیڈ لیس براؤزر استعمال کرتے وقت میں پراکسی بینڈوڈتھ کیسے کم کروں؟

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

میں اُس مواد کی اسکریپنگ کیسے کروں جو لامحدود اسکرول پر لوڈ ہوتا ہے؟

پہلے Network ٹیب میں اسکرول کے پیچھے موجود صفحات میں بٹی XHR کال چیک کریں اور اُس اینڈ پوائنٹ پر براہِ راست لوپ کریں۔ اگر آپ کو اسکرول کرنا ہی پڑے، تو اسے ایک قابو شدہ لوپ میں کریں اور پڑھنے سے پہلے ہر نئے بیچ کے رینڈر ہونے کا انتظار کریں۔

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

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

قابلِ اعتماد پراکسیز کے ساتھ ڈائنامک پیجز کی اسکریپنگ کریں

اگر آپ کے اسکریپر کو ایسے رہائشی، موبائل یا ڈیٹا سینٹر IP ایڈریسز درکار ہیں جو حقیقی وزیٹرز کی طرح برتاؤ کریں، تو آپ 1 ڈالر فی GB سے ادائیگی بمطابق استعمال ٹریفک پر شروع کر سکتے ہیں۔ DataImpulse اکاؤنٹ بنائیں اور اپنی ڈائنامک اسکریپنگ کو روٹیٹنگ یا مستحکم (sticky) سیشنز کے ذریعے روٹ کریں۔


Share article: