Python کے ساتھ Bing سرچ نتائج کو کیسے اسکریپ کریں

تبصرے: 0

ویب اینالیٹکس صرف Google تک محدود نہیں ہے۔ Bing SERP کا ایک متبادل نقطۂ نظر فراہم کرتا ہے جو SEO ریسرچ، لنک پروسپیکٹنگ، برانڈ مانیٹرنگ، مسابقتی تجزیہ، اور مواد کی تحقیق کے لیے مفید ہے۔ Python اس قسم کی آٹومیشن کے لیے ایک بہترین ٹول ہے: پختہ ایکو سسٹم، سادہ نحو، اور HTML پارسنگ اور JSON کے ساتھ کام کرنے کے لیے مضبوط لائبریریاں آپ کو Bing سرچ نتائج کو تیزی اور آسانی سے اسکریپ کرنے دیتی ہیں۔

Google کے بجائے Bing پر توجہ کیوں دیں؟

Bing اپنے رینکنگ گائیڈلائنز اور کوالٹی سگنلز استعمال کرتا ہے، اس لیے اس کے نتائج اکثر Google سے مختلف ہوتے ہیں۔ یہ آرگینک سرچ اور لانگ ٹیل کوئریز میں اضافی مواقع دریافت کرنے کے لیے قیمتی ہے۔ ویب ماسٹر سفارشات میں، Bing اہمیت، معیار/اعتماد، صارف کی مشغولیت، تازگی، جغرافیائی عوامل، اور پیج اسپیڈ پر زور دیتا ہے—Google کے مقابلے میں سگنلز کا مختلف توازن۔ اسی لیے کچھ صفحات خاص طور پر Bing پر زیادہ رینک کرتے ہیں۔

Bing سرچ نتائج اسکریپ کرنے کے عملی استعمال:

  • اپنی لنک بلڈنگ ڈونر لسٹ میں اضافہ کرنا — یہ انجن بعض اوقات ایسی سائٹس کو اوپر لاتا ہے جو Google کے ٹاپ 10 میں نظر نہیں آتیں۔
  • PAA (“People also ask”) اور Bing کے یونیورسل SERP عناصر (ویڈیو، کیروسلز) کو ٹریک کرنا تاکہ اپنی مواد کی حکمت عملی کو ایڈجسٹ کیا جا سکے۔

Bing سرچ سے آپ کون سا ڈیٹا حاصل کر سکتے ہیں؟

ایک “کلاسک” SERP سے آپ اعتماد کے ساتھ یہ چیزیں نکال سکتے ہیں:

  • عنوان؛
  • URL (دستاویز کا لنک)؛
  • سنیپیٹ (تفصیل)؛
  • نتائج میں پوزیشن (ترتیبی انڈیکس)؛
  • بعض یونیورسل نتائج: “Related/People also ask”، ایمبیڈڈ امیج/ویڈیو نتائج (اگر مرکزی SERP میں براہِ راست شامل ہوں)۔

اہم: Bing کی مارک اپ وقتاً فوقتاً تبدیل ہوتی رہتی ہے، اس لیے نیچے موجود کوڈ کے سلیکٹرز کو ایڈجسٹمنٹ کی ضرورت پڑ سکتی ہے۔

Bing سرچ اسکریپ کرتے وقت قانونی اور اخلاقی پہلو

  • Microsoft کی Terms of Use پر عمل کریں: ویب ڈیٹا تک “آفیشل” رسائی کے لیے Microsoft اب Azure AI Agents کے حصے کے طور پر Grounding with Bing Search فراہم کرتا ہے۔ عوامی Bing Search APIs کو 11 اگست 2025 کو مکمل طور پر بند کر دیا گیا۔
  • Grounding with Bing Search کے اپنے TOU اور پابندیاں ہیں: اسے Azure ایجنٹس کے ذریعے استعمال کیا جاتا ہے، اور نتائج “خام” JSON SERP ڈیٹا کے بجائے ایجنٹ کے ریسپانس میں واپس آتے ہیں۔
  • robots.txt کا احترام کریں اور ہوسٹ پر زیادہ لوڈ مت ڈالیں — robots کی پابندی اسکریپنگ کی بنیادی اخلاقیات ہے۔

اسکریپنگ کے لیے اپنے Python ماحول کی ترتیب

بنیادی پیکجز انسٹال کریں:

pip install requests beautifulsoup4 lxml fake-useragent selenium
  • requests — HTTP کلائنٹ (جس سے آپ User-Agent جیسے ہیڈرز سیٹ کر سکتے ہیں)؛
  • beautifulsoup4 + lxml — HTML پارسنگ؛
  • fake-useragent — رینڈم UA جنریشن (یا اپنی فہرست خود بنائیں)؛
  • selenium — جب ضرورت ہو تو ڈائنامک بلاکس کو رینڈر کرنے کے لیے۔

میٹھڈ 1 – Requests اور BeautifulSoup کے ذریعے Bing اسکریپ کرنا

ہم اسے ورک فلو کو ظاہر کرنے کے بنیادی نمونے کے طور پر استعمال کریں گے: GET درخواستیں بھیجنا، User-Agent سیٹ کرنا، رزلٹ کارڈز کو پارس کرنا، اور عنوان، URL، سنیپیٹ اور پوزیشن جمع کرنا۔

import time
import random
from typing import List, Dict
import requests
from bs4 import BeautifulSoup

BING_URL = "https://www.bing.com/search"

HEADERS_POOL = [
    # You can add more — or use fake-useragent
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
    "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/605.1.15 "
    "(KHTML, like Gecko) Version/17.0 Safari/605.1.15",
]

def fetch_serp(query: str, count: int = 10, first: int = 1,
               proxy: str | None = None) -> List[Dict]:
    """
Returns a list of results: title, url, snippet, position.
`first` — starting position (pagination), `count` — how many records to fetch.

    """
    params = {"q": query, "count": count, "first": first}
    headers = {"User-Agent": random.choice(HEADERS_POOL)}
    proxies = {"http": proxy, "https": proxy} if proxy else None

    resp = requests.get(BING_URL, params=params, headers=headers,
                        proxies=proxies, timeout=15)
    resp.raise_for_status()
    soup = BeautifulSoup(resp.text, "lxml")

   # Typical Bing markup: <li class="b_algo"> ... <h2><a href="">Title</a></h2>
    items = []
    for idx, li in enumerate(soup.select("li.b_algo"), start=first):
        a = li.select_one("h2 a")
        if not a:
            continue
        title = a.get_text(strip=True)
        url = a.get("href")
         # Snippet is often in .b_caption p or simply the first <p>
        sn_el = li.select_one(".b_caption p") or li.select_one("p")
        snippet = sn_el.get_text(" ", strip=True) if sn_el else ""
        items.append({
            "position": idx,
            "title": title,
            "url": url,
            "snippet": snippet
        })
    return items

if __name__ == "__main__":
    data = fetch_serp("python web scraping tutorial", count=10)
    for row in data:
        print(f"{row['position']:>2}. {row['title']} -- {row['url']}")
        print(f"   {row['snippet']}\n")

وضاحت:

  • صفحہ بندی (pagination) کے لیے count/first پیرا میٹر استعمال کریں۔
  • سلیکٹرز li.b_algo h2 a اور .b_caption p بنیادی ہیں؛ لے آؤٹ تبدیل ہو سکتا ہے (DevTools میں معائنہ کریں)۔
  • ضرورت پڑنے پر پراکسی شامل کریں اور درخواستوں کے درمیان وقفوں کو منظم کریں۔
  • ہم اس مثال کو نیچے مزید بہتر بنائیں گے، کیونکہ موجودہ حالات میں یہ ہمارے مقصد کے لیے سب سے مؤثر طریقہ ہے۔

میٹھڈ 2 — API کے ذریعے Bing سرچ نتائج اسکریپ کرنا (2026 کی حالت)

Microsoft کا عوامی Bing scraper API اگست 2026 میں بند کر دیا گیا۔ Microsoft Azure AI Agents کے اندر Grounding with Bing Search پر منتقل ہونے کی تجویز دیتا ہے۔

عملی طور پر اس کا مطلب:

  • “خام” JSON SERP ڈیٹا والا کلاسک REST endpoint اب زیادہ تر ڈویلپرز کے لیے دستیاب نہیں ہے۔
  • Grounding with Bing Search ایک Azure ایجنٹ میں بطور ٹول جڑا ہوتا ہے؛ ایجنٹ ویب پر "lookup" کر سکتا ہے اور ایک مرکب (synthesized) جواب واپس بھیج سکتا ہے۔ اس سروس کے اپنے TOU اور مخصوص پابندیاں ہیں: اسے خام SERP نتائج کی بڑے پیمانے پر نکاسی (bulk extraction) کے لیے ڈیزائن نہیں کیا گیا۔

JSON میں raw SERP کا متبادل

تیسرے فریق کے SERP APIs/پلیٹ فارم (مثلاً Apify Bing Search Scraper) استعمال کریں جو ساختی نتائج واپس کرتے ہیں: عنوان، URL، سنیپیٹ، پوزیشن وغیرہ۔

کم سے کم Apify درخواست کی مثال:

import requests

API_TOKEN = "apify_xxx"  # store in ENV
actor = "tri_angle/bing-search-scraper"
payload = {
    "queries": ["python web scraping tutorial"],
    "countryCode": "US",
    "includeUnfilteredResults": False
}

r = requests.post(
    f"https://api.apify.com/v2/acts/{actor}/runs?token={API_TOKEN}",
    json=payload, timeout=30
)
run = r.json()
# Retrieve dataset items using run['data']['defaultDatasetId']

Apify کی دستاویزات میں آرگینک نتائج، PAA، متعلقہ سوالات اور دیگر فیچرز کا سپورٹ موجود ہے۔ یقینی بنائیں کہ آپ کا استعمال-کیس پلیٹ فارم کے قواعد اور آپ کے دائرہ اختیار کے قوانین کے مطابق ہو۔

مشورہ: اگر آپ Azure AI Agents اسٹیک میں کام کرتے ہیں اور صرف LLM کے لیے گراؤنڈڈ حوالہ جات چاہتے ہیں (raw JSON نہیں)، تو Grounding with Bing Search والی گائیڈ پڑھیں۔

میٹھڈ 3 – Selenium کے ساتھ ڈائنامک مواد کو پارس کرنا

جب SERP میں کیروسلز، انٹرایکٹو بلاکس، یا JavaScript کے ذریعے رینڈر کیا گیا مواد شامل ہو، تو Selenium (Headless Chrome/Firefox) پر سوئچ کریں۔

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

def selenium_bing(query: str, headless: bool = True):
    opts = Options()
    if headless:
        opts.add_argument("--headless=new")
    opts.add_argument("--disable-gpu")
    opts.add_argument("--no-sandbox")
    with webdriver.Chrome(options=opts) as driver:
        driver.get("https://www.bing.com/")
        box = driver.find_element(By.NAME, "q")
        box.send_keys(query)
        box.submit()

        # Consider adding explicit waits via WebDriverWait
        cards = driver.find_elements(By.CSS_SELECTOR, "li.b_algo h2 a")
        results = []
        for i, a in enumerate(cards, start=1):
            results.append({"position": i, "title": a.text, "url": a.get_attribute("href")})
        return results

if __name__ == "__main__":
    print(selenium_bing("site:docs.python.org requests headers"))

ڈرائیور انسٹالیشن اور WebDriverWait کی مثالوں کے لیے سرکاری Selenium دستاویزات دیکھیں۔

عملی حل: پارسنگ کی حکمتِ عملی اور مثال کوڈ

حتمی نفاذ کے لیے، ہم HTML سے براہِ راست Bing اسکریپنگ انجام دیں گے:

  1. https://www.bing.com/search پر HTTP درخواستیں بھیجیں۔
  2. User-Agent سیٹ کریں۔
  3. BeautifulSoup + lxml کے ذریعے HTML پارس کریں تاکہ عنوانات، URLs، اور سنیپیٹس نکالے جا سکیں۔

اس طرح آپ کو Microsoft اکاؤنٹس کی ضرورت نہیں پڑتی اور نہ ہی تیسری پارٹی کے پُر معاوضہ APIs پر انحصار کرنا پڑتا ہے۔ نتائج کے انتخاب کے لیے ہم li.b_algo ریزلٹ کارڈ کنٹینر استعمال کرتے ہیں، جو عام طور پر Bing کے آرگینک بلاکس میں ہوتا ہے۔

کام کرنے والی مثال (صفحہ بندی، وقفے، اختیاری پراکسی)

from __future__ import annotations

import argparse
import csv
import dataclasses
import pathlib
import random
import sys
import time
from typing import List, Optional, Tuple

import requests
from bs4 import BeautifulSoup, FeatureNotFound

BING_URL = "https://www.bing.com/search"

# Pool of user agents
UA_POOL = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
]

@dataclasses.dataclass
class SerpItem:
    position: int
    title: str
    url: str
    snippet: str


def build_session(proxy: Optional[str] = None) -> requests.Session:
    """Create a session with baseline headers and an optional proxy."""
    s = requests.Session()
    s.headers.update(
        {
            "User-Agent": random.choice(UA_POOL),
            "Accept-Language": "uk-UA,uk;q=0.9,en;q=0.8",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        }
    )
    if proxy:
        # Requests proxy dict format: {'http': 'http://host:port', 'https': 'http://host:port'}
        s.proxies.update({"http": proxy, "https": proxy})
    return s


def _soup_with_fallback(html: str) -> BeautifulSoup:
    """Parse HTML with a forgiving fallback chain: lxml -> html.parser -> html5lib (if available)."""
    for parser in ("lxml", "html.parser", "html5lib"):
        try:
            return BeautifulSoup(html, parser)
        except FeatureNotFound:
            continue
    # If none are installed, bs4 will raise; let it propagate
    return BeautifulSoup(html, "html.parser")


def parse_serp_html(html: str, start_pos: int) -> List[SerpItem]:
    """Extract organic results from Bing SERP HTML."""
    soup = _soup_with_fallback(html)
    items: List[SerpItem] = []

    # Organic blocks typically look like <li class="b_algo"> with h2>a and a snippet under .b_caption p or the first <p>.
    for i, li in enumerate(soup.select("li.b_algo"), start=start_pos):
        a = li.select_one("h2 > a")
        if not a:
            continue
        title = (a.get_text(strip=True) or "").strip()
        url = a.get("href") or ""
        p = li.select_one(".b_caption p") or li.select_one("p")
        snippet = (p.get_text(" ", strip=True) if p else "").strip()
        items.append(SerpItem(position=i, title=title, url=url, snippet=snippet))

    return items


def fetch_bing_page(
    session: requests.Session,
    query: str,
    first: int = 1,
    count: int = 10,
    cc: str = "UA",
    setlang: str = "uk",
    timeout: int = 20,
) -> List[SerpItem]:
    """Download one results page and return parsed items."""
    params = {
        "q": query,
        "count": count,   # 10, 15, 20...
        "first": first,   # 1, 11, 21...
        "cc": cc,         # country code for results
        "setlang": setlang,  # interface/snippet language
    }
    r = session.get(BING_URL, params=params, timeout=timeout)
    r.raise_for_status()
    return parse_serp_html(r.text, start_pos=first)


def search_bing(
    query: str,
    pages: int = 1,
    count: int = 10,
    pause_range: Tuple[float, float] = (1.2, 2.7),
    proxy: Optional[str] = None,
    cc: str = "UA",
    setlang: str = "uk",
    timeout: int = 20,
) -> List[SerpItem]:
    """Iterate over pages and return an aggregated list of results."""
    session = build_session(proxy=proxy)
    all_items: List[SerpItem] = []
    first = 1
    for _ in range(pages):
        items = fetch_bing_page(
            session, query, first=first, count=count, cc=cc, setlang=setlang, timeout=timeout
        )
        all_items.extend(items)
        time.sleep(random.uniform(*pause_range))  # polite delay
        first += count
    return all_items


def _normalize_cell(s: str) -> str:
    """Optional: collapse internal whitespace so simple viewers show one‑line cells."""
    # Convert tabs/newlines/multiple spaces to a single space
    return " ".join((s or "").split())


def save_csv(
    items: List[SerpItem],
    path: str,
    excel_friendly: bool = False,
    normalize: bool = False,
    delimiter: str = ",",
) -> int:
    """
Write results to CSV.
— excel_friendly=True -> write UTF‑8 with BOM (utf‑8‑sig) so Excel auto‑detects Unicode.
— normalize=True -> collapse whitespace inside string fields.
— delimiter -> change if your consumer expects ';', etc.
Returns the number of rows written (excluding header).

    """
    p = pathlib.Path(path)
    p.parent.mkdir(parents=True, exist_ok=True)

    encoding = "utf-8-sig" if excel_friendly else "utf-8"

    # newline='' is required so Python's csv handles line endings correctly on all platforms
    with p.open("w", newline="", encoding=encoding) as f:
        writer = csv.DictWriter(
            f,
            fieldnames=["position", "title", "url", "snippet"],
            delimiter=delimiter,
            quoting=csv.QUOTE_MINIMAL,
        )
        writer.writeheader()
        for it in items:
            row = dataclasses.asdict(it)
            if normalize:
                row = {k: _normalize_cell(v) if isinstance(v, str) else v for k, v in row.items()}
            writer.writerow(row)
    return len(items)


def main() -> int:
    ap = argparse.ArgumentParser(description="Bing SERP scraper (Requests + BS4)")
    ap.add_argument("-q", "--query", required=True, help="Search query")
    ap.add_argument("--pages", type=int, default=1, help="Number of pages (x count)")
    ap.add_argument("--count", type=int, default=10, help="Results per page")
    ap.add_argument("--cc", default="UA", help="Country code for results (cc)")
    ap.add_argument("--setlang", default="uk", help="Interface/snippet language (setlang)")
    ap.add_argument("--proxy", help="Proxy, e.g. http://user:pass@host:port")
    ap.add_argument("--csv", help="Path to CSV to save results")
    ap.add_argument(
        "--excel-friendly",
        action="store_true",
        help="Add BOM (UTF‑8‑SIG) so Excel opens the file correctly",
    )
    ap.add_argument(
        "--normalize-cells",
        action="store_true",
        help="Remove line breaks and extra spaces in cells",
    )
    ap.add_argument(
        "--delimiter",
        default=",",
        help="CSV delimiter (default ','); e.g.: ';'",
    )
    args = ap.parse_args()

    try:
        items = search_bing(
            args.query,
            pages=args.pages,
            count=args.count,
            proxy=args.proxy,
            cc=args.cc,
            setlang=args.setlang,
        )
    except requests.HTTPError as e:
        print(f"[ERROR] HTTP error: {e}", file=sys.stderr)
        return 2
    except requests.RequestException as e:
        print(f"[ERROR] Network error: {e}", file=sys.stderr)
        return 2

    if args.csv:
        try:
            n = save_csv(
                items,
                args.csv,
                excel_friendly=args.excel_friendly,
                normalize=args.normalize_cells,
                delimiter=args.delimiter,
            )
            print(f"Saved {n} rows to {args.csv}")
        except OSError as e:
            print(f"[ERROR] Could not write CSV to {args.csv}: {e}", file=sys.stderr)
            return 3
    else:
        for it in items:
            print(f"{it.position:>2}. {it.title} -- {it.url}")
            if it.snippet:
                print("   ", it.snippet[:180])

    return 0


if __name__ == "__main__":
    sys.exit(main())

اضافی پیرامیٹرز اور پراکسی کے ساتھ استعمال کی مثال:

python bing_scraper.py -q "Python web scraping" --pages 3 --csv out.csv \
  --proxy "http://username:password@proxy:port"

اسکرپٹ کیا کرتا ہے:

  1. Bing کو کنٹرول شدہ پیرامیٹرز (q، count، first) اور لوکیل سیٹنگز (cc، setlang) کے ساتھ GET درخواستیں بھیجتا ہے۔
  2. User-Agent کو اووررائیڈ کرتا ہے اور زیادہ مستحکم سنیپیٹس کے لیے Accept-Language شامل کرتا ہے۔
  3. BeautifulSoup(..., "lxml") کے ذریعے HTML پارس کرتا ہے، li.b_algo رزلٹ کارڈ تلاش کرتا ہے، اور عنوان، URL اور سنیپیٹ نکالتا ہے۔ BS4 میں .select() CSS سلیکٹر ایک معیاری اور لچکدار طریقہ ہے۔
  4. ایک اختیاری پراکسی کو سپورٹ کرتا ہے۔ Requests میں درست پراکسی فارمیٹ پروٹوکول→URL میپنگ ہوتا ہے۔

استحکام کے مشورے:

  • وقفے شامل کریں (درخواستوں کے درمیان وقفوں کو رینڈمائز کریں)۔
  • User-Agent گھمائیں (ڈائنامک طور پر یا اپنی فہرست سے)۔ Requests درست طریقے سے ہیڈرز سیٹ کرنے کا طریقہ دکھاتا ہے—ہم اسے کام کرنے والی مثال میں استعمال کرتے ہیں۔
  • ضرورت پڑنے پر پلیٹ فارم کی حدود کے اندر مؤثر اسکیلنگ کے لیے پراکسی انفراسٹرکچر/IP روٹیشن استعمال کریں۔
  • کل درخواستوں کی مقدار مناسب رکھیں اور CAPTCHA اشاروں کے لیے ردِ عمل چیک کریں۔
  • پیچیدہ صورتحال میں، منیجڈ SERP APIs (Apify وغیرہ) پر غور کریں جن میں اینٹی بوٹ انفراسٹرکچر شامل ہوتا ہے۔

ٹولز کے بارے میں مزید کہاں پڑھیں

مشورہ: اگر آپ کو مزید مستحکم ڈیٹا کلیکشن کے لیے پراکسی انفراسٹرکچر درکار ہو، تو Bing کے لیے بہترین پراکسیز دیکھیں۔

Bing اسکریپ کرتے وقت بلاکس سے کیسے بچیں

بنیادی اصول تاکہ آپ کا اسکریپر پہلے ہی سائیکل میں “مر” نہ جائے:

  • وقفے شامل کریں (درخواستوں کے درمیان وقفوں کو رینڈمائز کریں)۔
  • User-Agent گھمائیں (ڈائنامک طور پر یا اپنی فہرست سے)؛ Requests میں ہیڈرز سیٹ کرنے کا طریقہ دستاویزات میں بیان ہے — ہم اسے اپنی مثال میں استعمال کرتے ہیں۔
  • خدمت کی شرائط کا احترام کرتے ہوئے پراکسی یا IP روٹیشن استعمال کریں۔
  • درخواستوں کی کل تعداد محدود رکھیں اور CAPTCHA اشاروں کے لیے ردِ عمل کی نگرانی کریں۔
  • پیچیدہ کاموں کے لیے اینٹی بوٹ انفراسٹرکچر والے منیجڈ SERP APIs (Apify وغیرہ) پر غور کریں۔

نتیجہ

Bing اسکریپ کرنا مفید ہے جب آپ ریسرچ کو Google سے آگے بڑھانا چاہتے ہیں، اضافی ڈونر ڈومین جمع کرنا چاہتے ہیں، متبادل SERP فیچرز ٹریک کرنا چاہتے ہیں، اور پورے منظرنامے کا آزاد تجزیہ حاصل کرنا چاہتے ہیں۔ مستحکم اور “آفیشل” انٹیگریشن کے لیے Microsoft Azure AI Agents میں Grounding with Bing Search کو فروغ دیتا ہے؛ یہ سروس کی شرائط کے لحاظ سے زیادہ محفوظ ہے لیکن raw JSON SERP ڈیٹا واپس نہیں کرتا۔ اگر آپ کا کام ساختی نتائج نکالنا ہے، تو Requests/BS4 یا Selenium کے ذریعے براہِ راست HTML پارسنگ کو استعمال کریں، یا خصوصی SERP API کا انتخاب کریں۔ کام کے مطابق درست ٹول منتخب کریں: پروٹوٹائپس کے لیے تیز HTML پارسنگ، LLM-بیسیڈ جوابات کے لیے ایجنٹس، اور بڑے پیمانے پر کلیکشن کے لیے SERP APIs۔

تبصرے:

0 تبصرے