
Rajinder Singh
Deep Learning Researcher

AI आर्डरिंग प्रणालियों के लिए रेस्तरां मेनू डेटा को एक प्रमाण-प्राथमिक डेटा उत्पाद के रूप में बनाया जाना चाहिए, न कि केवल व्यंजन नाम और मूल्य के संग्रह के रूप में। सबसे विश्वसनीय पाइपलाइन मालिक-नियंत्रित स्रोत जैसे Google Business Profile फूड मेनू, POS मेनू API, निर्यात और प्रथम-पक्ष संरचित डेटा से शुरू होती है। फिर यह स्थान, मेनू, खंड, आइटम, विकल्प, मूल्य, मुद्रा, भाषा, आहार लेबल, एलर्जन, उपलब्धता और अवलोकन समय को एक स्थिर स्कीमा में सामान्यीकृत करता है। प्रत्येक क्षेत्र को अपने स्रोत से ट्रैक करना आवश्यक है, विशेष रूप से जब एक AI प्रणाली प्रश्नों के उत्तर देती है, विकल्पों की तुलना करती है या आर्डर तैयार करती है। रेंडर किए गए पृष्ठ संग्रह एक कम प्राथमिकता फॉलबैक है और केवल अनुमति, दर सीमा और सख्त चुनौति प्रबंधन के साथ काम करना चाहिए। यह गाइड इनपुट से सत्यापन और समीक्षा तक इस पाइपलाइन के डिजाइन को दिखाता है।
एक रेस्तरां आमतौर पर एक असीमित मेनू नहीं होता है। डेटा अलग-अलग हो सकता है:
एक AI आर्डरिंग प्रणाली जो इन अंतरों को समाप्त कर देती है, गलत कीमत बता सकती है, आवश्यक विकल्प छोड़ सकती है या आहार सूचना गलत बता सकती है।
CapSolver वेब-स्क्रैपिंग ब्लॉग में संबंधित निकालने के निर्देश हैं, जबकि वेब-स्क्रैपिंग FAQ स्रोत और ऑपरेशनल विचारों की व्याख्या करता है।
सबसे अधिक विश्वसनीय और संरचित स्रोत से शुरू करें।
| प्राथमिकता | स्रोत | शक्ति | मुख्य नियंत्रण |
|---|---|---|---|
| 1 | मालिक या POS API | संरचित और अधिकारित | प्राधिकरण और संकल्प सीमा |
| 2 | मालिक निर्यात या फीड | स्थिर बैच आगमन | संस्करण और ताजगी मेटाडेटा |
| 3 | व्यवसाय प्रोफाइल मेनू API | संरचित स्थान-स्तरीय मेनू डेटा | खाता और स्थान प्राधिकरण |
| 4 | प्रथम-पक्ष JSON-LD या एम्बेडेड डेटा | सार्वजनिक और मशीन-पठनीय | स्कीमा सत्यापन और स्रोत URL |
| 5 | अनुमोदित रेंडर पृष्ठ | जब कोई फीड उपलब्ध नहीं होता है | दर सीमा, पृष्ठ स्थिति, साक्ष्य |
| 6 | OCR या छवि प्रक्रिया | अंतिम विकल्प | कम विश्वास और अनिवार्य समीक्षा |
तृतीय-पक्ष एग्रीगेटर को रेस्तरां के स्वयं के मेनू के बराबर नहीं मानें।
Google Business Profile के FoodMenus मॉडल मेनू, खंड, आइटम, लेबल, विकल्प, मूल्य, व्यंजन, एलर्जन, आहार सीमाएं, पोषण, घटक, तैयारी विधियां, आयतन और मीडिया की कुंजी परिभाषित करता है।
Google के फूड-मेनू अपडेट गाइड भी स्थान पात्रता और मालिक-नियंत्रित रीड-एंड-अपडेट फ्लो का वर्णन करता है।
Schema.org के Menu प्रकार एक संरचित मेनू का वर्णन करता है जिसमें hasMenuSection और hasMenuItem संबंध शामिल हैं।
Toast के Menus API गाइड से पहले मेनू प्राप्त करने के लिए मेटाडेटा की जांच करने की सिफारिश की जाती है ताकि कैश किए गए डेटा की ताजगी निर्धारित की जा सके।
इन मॉडल सामान्य डिजाइन के समर्थन करते हैं: एक लेख के रूप में सब कुछ फ्लैट करने के बजाय जड़ता और ताजगी को संरक्षित करें।
from datetime import datetime
from decimal import Decimal
from typing import Literal
from pydantic import BaseModel, Field, HttpUrl
class Money(BaseModel):
currency: str = Field(min_length=3, max_length=3)
amount: Decimal
tax_included: bool | None = None
class Evidence(BaseModel):
source_type: Literal[
"OWNER_API",
"OWNER_EXPORT",
"BUSINESS_PROFILE",
"JSON_LD",
"AUTHORIZED_PAGE",
"IMAGE_REVIEW",
]
source_url: HttpUrl | None = None
source_record_id: str | None = None
observed_at: datetime
source_modified_at: datetime | None = None
content_hash: str
language: str
class MenuOption(BaseModel):
option_id: str
name: str
price_delta: Money | None = None
available: bool | None = None
class MenuItem(BaseModel):
item_id: str
restaurant_id: str
location_id: str
menu_id: str
section_id: str
name: str
description: str | None = None
base_price: Money | None = None
options: list[MenuOption] = []
dietary_labels: list[str] = []
allergens: list[str] = []
ingredients: list[str] = []
available: bool | None = None
evidence: Evidence
प्रत्येक रिकॉर्ड के साथ स्रोत साक्ष्य जोड़ें। जब व्यक्तिगत आइटम अलग-अलग स्रोत से आते हैं, तो मेनू-स्तर का समय टैग पर्याप्त नहीं होता है।
class Restaurant(BaseModel):
restaurant_id: str
brand_name: str
legal_name: str | None = None
class Location(BaseModel):
location_id: str
restaurant_id: str
address_line: str
city: str
region: str | None = None
postal_code: str | None = None
country_code: str
timezone: str
class Menu(BaseModel):
menu_id: str
location_id: str
name: str
service_modes: list[str]
dayparts: list[str]
valid_from: datetime | None = None
valid_until: datetime | None = None
language: str
मेनू ID को एक विशिष्ट स्थान और संदर्भ का प्रतिनिधित्व करना चाहिए। बिना स्पष्ट नियमों के लंच और डिनर मूल्यों को मिलाएं या डिलीवरी और डाइन-इन मेनू को मिलाएं।
from hashlib import sha256
import json
def canonical_hash(payload: dict) -> str:
encoded = json.dumps(
payload,
sort_keys=True,
ensure_ascii=False,
separators=(",", ":"),
).encode("utf-8")
return sha256(encoded).hexdigest()
async def ingest_owner_menu(api, location_id: str) -> list[MenuItem]:
metadata = await api.get_menu_metadata(location_id)
if metadata.not_modified:
return []
payload = await api.get_menu(location_id)
observed_at = utc_now()
records = []
for menu in payload["menus"]:
for section in menu.get("sections", []):
for item in section.get("items", []):
records.append(
normalize_owner_item(
location_id=location_id,
menu=menu,
section=section,
item=item,
observed_at=observed_at,
content_hash=canonical_hash(item),
)
)
return records
उपलब्ध होने पर शर्ती अनुरोध, मेटाडेटा एंडपॉइंट, ETags या स्रोत संशोधन समय का उपयोग करें। अपरिवर्तित मेनू को बार-बार डाउनलोड करने से बचें।
मेनू मूल्य सामान्यीकरण मूल प्रस्तुति को बरकरार रखना चाहिए।
class NormalizedPrice(BaseModel):
amount: Decimal
currency: str
original_text: str | None = None
price_type: Literal[
"FIXED",
"FROM",
"RANGE",
"MARKET_PRICE",
"INCLUDED",
"UNKNOWN",
]
upper_amount: Decimal | None = None
def normalize_price(raw: dict, currency: str) -> NormalizedPrice | None:
if raw.get("market_price"):
return NormalizedPrice(
amount=Decimal("0"),
currency=currency,
original_text=raw.get("display"),
price_type="MARKET_PRICE",
)
if raw.get("min") is not None and raw.get("max") is not None:
return NormalizedPrice(
amount=Decimal(str(raw["min"])),
upper_amount=Decimal(str(raw["max"])),
currency=currency,
original_text=raw.get("display"),
price_type="RANGE",
)
if raw.get("amount") is not None:
return NormalizedPrice(
amount=Decimal(str(raw["amount"])),
currency=currency,
original_text=raw.get("display"),
price_type="FIXED",
)
return None
मार्केट मूल्य को नीचे रखे बिना शून्य में बदलें। सेंटीनल को वास्तविक संख्यात्मक मूल्य से अलग रखें।
class ModifierChoice(BaseModel):
choice_id: str
name: str
price_delta: Money | None = None
available: bool | None = None
class ModifierGroup(BaseModel):
group_id: str
name: str
minimum_selections: int
maximum_selections: int
choices: list[ModifierChoice]
class OrderableItem(MenuItem):
modifier_groups: list[ModifierGroup] = []
आर्डरिंग प्रणाली को विकल्प नामों के साथ-साथ चयन सीमाओं की आवश्यकता होती है। "एक आकार चुनें" और "अधिकतम तीन टॉपिंग चुनें" अलग-अलग नियम हैं।
class LocalizedText(BaseModel):
language: str
value: str
source_value: str
translated: bool = False
translation_model: str | None = None
class LocalizedMenuItem(BaseModel):
item_id: str
names: list[LocalizedText]
descriptions: list[LocalizedText]
मूल पाठ को जनरेटेड अनुवाद से बदलें। मूल भाषा, अनुवादित चिह्न, मॉडल संस्करण और समीक्षा स्थिति को बरकरार रखें।
Google के FoodMenus मॉडल एलर्जन और आहार सीमाओं का समर्थन करता है, लेकिन निम्न-स्तरीय प्रणालियां केवल स्रोत द्वारा समर्थित दावों को प्रस्तुत करना चाहिए।
संयुक्त राज्य अमेरिका खाद्य एवं औषधि प्राधिकरण के खाद्य-एलर्जी दिशा-निर्देश एलर्जन सूचना सुरक्षा-संबंधी क्यों है, इसका उदाहरण प्रस्तुत करता है।
class SafetyClaim(BaseModel):
claim: str
source_type: str
explicit_source_text: str
confidence: float
reviewed: bool
reviewer_id: str | None = None
def allow_safety_claim(claim: SafetyClaim) -> bool:
return (
claim.source_type in {"OWNER_API", "OWNER_EXPORT", "BUSINESS_PROFILE"}
and bool(claim.explicit_source_text.strip())
and claim.reviewed
)
अवयव, व्यंजन, छवि या AI मॉडल के अनुमानों से "नट-फ्री", "ग्लूटेन-फ्री", "हलाल", "कोशर" या समान दावों को निष्कर्ष न निकालें।
import json
from bs4 import BeautifulSoup
def extract_json_ld_menu(html: str) -> list[dict]:
soup = BeautifulSoup(html, "html.parser")
menus = []
for script in soup.select('script[type="application/ld+json"]'):
try:
payload = json.loads(script.string or "")
except json.JSONDecodeError:
continue
nodes = payload if isinstance(payload, list) else [payload]
for node in nodes:
if not isinstance(node, dict):
continue
if node.get("@type") == "Menu":
menus.append(node)
graph = node.get("@graph", [])
menus.extend(
entry
for entry in graph
if isinstance(entry, dict) and entry.get("@type") == "Menu"
)
return menus
स्कीमा की पुष्टि करें और प्रत्येक सामान्यीकृत रिकॉर्ड के साथ स्रोत URL, अवलोकित समय और साक्ष्य हैश को बरकरार रखें।
अनुमोदित रेस्तरां द्वारा कोई API, फीड या संरचित डेटा प्रकाशित नहीं करने पर रेंडर किए गए पृष्ठ संग्रह आवश्यक हो सकता है। नेविगेट करने से पहले:
CapSolver कानूनी वेब-स्क्रैपिंग गाइड अतिरिक्त सुसंगतता संदर्भ प्रदान करता है।
एक प्रथम-पक्ष मेनू पृष्ठ अनुमोदित संग्रह चलाते समय एक समर्थित चुनौती प्रस्तुत कर सकता है। CapSolver को एपीआई और संरचित-डेटा विकल्पों के बाद इस संकीर्ण पाइपलाइन में फिट करें।
class CollectionDecision(BaseModel):
source_type: str
authorized: bool
public_fields_only: bool
challenge_type: str | None = None
rate_limit_ok: bool
def may_use_challenge_service(decision: CollectionDecision) -> bool:
return (
decision.source_type == "AUTHORIZED_PAGE"
and decision.authorized
and decision.public_fields_only
and decision.rate_limit_ok
and decision.challenge_type in {
"RECAPTCHA_V2",
"RECAPTCHA_V3",
"CLOUDFLARE_TURNSTILE",
"CLOUDFLARE_CHALLENGE",
}
)
CapSolver उत्पाद पृष्ठ समर्थित कार्य परिवारों की पुष्टि में मदद करता है। कभी भी एक चुनौती के रूप में अनुपलब्ध मेनू डेटा की व्याख्या न करें।
class SourceLedgerEntry(BaseModel):
run_id: str
restaurant_id: str
location_id: str
source_type: str
source_url: str | None
permission_basis: str
observed_at: datetime
source_modified_at: datetime | None
record_count: int
content_hash: str
challenge_observed: bool
human_review_required: bool
लेजर एक समीक्षक को बताता है कि मूल्य कहां से आया, जब अवलोकित किया गया, और कौन सा पाइपलाइन संस्करण उत्पन्न किया।
from datetime import timedelta
FRESHNESS = {
"availability": timedelta(minutes=15),
"price": timedelta(hours=6),
"description": timedelta(days=7),
"dietary_labels": timedelta(days=7),
"allergens": timedelta(days=1),
"media": timedelta(days=30),
}
def is_fresh(field: str, observed_at: datetime, now: datetime) -> bool:
maximum_age = FRESHNESS[field]
return now - observed_at <= maximum_age
ये उदाहरण आ inter नीतियां हैं, सार्वभौमिक तथ्य नहीं। स्रोत व्यवहार, संकल्प शर्तें, उपयोगकर्ता अपेक्षाओं और जोखिम के अनुसार सीमाएं निर्धारित करें।
class MenuChange(BaseModel):
restaurant_id: str
location_id: str
item_id: str
field: str
before: object
after: object
source_before: str
source_after: str
requires_review: bool
HIGH_RISK_FIELDS = {"allergens", "dietary_labels", "availability", "price"}
def compare_items(previous: MenuItem, current: MenuItem) -> list[MenuChange]:
changes = []
for field in [
"name",
"description",
"base_price",
"options",
"dietary_labels",
"allergens",
"available",
]:
before = getattr(previous, field)
after = getattr(current, field)
if before != after:
changes.append(
MenuChange(
restaurant_id=current.restaurant_id,
location_id=current.location_id,
item_id=current.item_id,
field=field,
before=before,
after=after,
source_before=previous.evidence.content_hash,
source_after=current.evidence.content_hash,
requires_review=field in HIGH_RISK_FIELDS,
)
)
return changes
क्रम अंतर या स्पेस वाले परिवर्तनों पर चेतावनी न दें। नॉर्मलाइज्ड रिकॉर्ड की तुलना करें।
एआई लेयर को वेरिफाइड रिकॉर्ड से जवाब देना चाहिए और कोई आर्डर कभी भी अलग पुष्टि चरण के बिना नहीं रखना चाहिए।
class OrderProposal(BaseModel):
location_id: str
item_id: str
option_ids: list[str]
quoted_total: Money
menu_observed_at: datetime
source_record_id: str
safety_claims_reviewed: bool
def may_present_for_confirmation(proposal: OrderProposal, now: datetime) -> bool:
return (
is_fresh("price", proposal.menu_observed_at, now)
and proposal.safety_claims_reviewed
and proposal.quoted_total.amount >= 0
)
पुष्टि के लिए स्पष्ट उपयोगकर्ता की आवश्यकता के पहले स्थान, आइटम, विकल्प, मात्रा, उपयोग करें, अस्थायी रूप से, शुल्क, कर, स्रोत समय और रद्दी की शर्तें प्रस्तुत करें।
| पाइपलाइन डिज़ाइन | स्रोत गुणवत्ता | ताजगी | सुरक्षा | सिफारिश |
|---|---|---|---|---|
| फ्लैटेड पृष्ठ पाठ | कम | अज्ञात | कम | बचें |
| तीसरे पक्ष के संग्रह के साथ | चर | चर | मध्यम | सावधानी से उपयोग करें |
| ओनर एपीआई और नॉर्मलाइज्ड लेजर | उच्च | उच्च | उच्च | प्रिय |
| पहले पक्ष पृष्ठ फॉलबैक के साथ समीक्षा | मध्यम | मापनीय | मध्यम से उच्च | अधिकृत होने पर उपयोग करें |
प्रिय आर्किटेक्चर में ओनर-नियंत्रित संरचित स्रोत शुरू होता है और प्रत्येक क्षेत्र के साथ साक्ष्य जुड़ा रहता है।
class QualityResult(BaseModel):
accepted: bool
reasons: list[str]
def validate_item(item: MenuItem) -> QualityResult:
reasons = []
if not item.name.strip():
reasons.append("missing_name")
if item.base_price and item.base_price.amount < 0:
reasons.append("negative_price")
if item.evidence.source_type == "IMAGE_REVIEW":
reasons.append("image_source_requires_review")
if item.allergens and item.evidence.source_type not in {
"OWNER_API",
"OWNER_EXPORT",
"BUSINESS_PROFILE",
}:
reasons.append("allergen_source_requires_review")
return QualityResult(accepted=not reasons, reasons=reasons)
जांच के बजाय विफल रिकॉर्ड को क्वारंटाइन करें।
ट्रैक करें:
API कुंजियां, कुकीज, निजी ग्राहक डेटा, भुगतान डेटा या पूर्ण ब्राउजर स्टोरेज स्थिति के बजाय लॉग न करें।
CapSolver AI और ऑटोमेशन FAQ टूल और स्वीकृति सीमा डिज़ाइन के लिए समर्थन कर सकता है।
import pytest
def test_market_price_is_not_zero_price():
value = normalize_price(
{"market_price": True, "display": "Market price"},
"USD",
)
assert value.price_type == "MARKET_PRICE"
assert value.original_text == "Market price"
def test_unreviewed_allergen_claim_is_blocked():
claim = SafetyClaim(
claim="contains peanuts",
source_type="JSON_LD",
explicit_source_text="contains peanuts",
confidence=1.0,
reviewed=False,
reviewer_id=None,
)
assert allow_safety_claim(claim) is False
मुद्रा अंकित, स्थान अलगाव, बहुभाषी लेबल, विकल्प सीमाएं, ताजा मूल्य, दोहराए गए आइटम आईडी, स्रोत प्राथमिकता, चुनौति-पृष्ठ वर्गीकरण और आर्डर-पुष्टि गेट के साथ परीक्षण करें।
बोनस कोड: CapSolver डैशबोर्ड पर WEBS कोड का उपयोग करके प्रत्येक भरोसे पर 5% बोनस प्राप्त करें।
CapSolver CAPTCHA-हल करने वाला FAQ अधिकृत चुनौति चरणों के लिए अतिरिक्त दिशा-निर्देश प्रदान करता है।
केवल मालिक-नियंत्रित, लाइसेंस, सार्वजनिक या स्पष्ट अनुमोदित स्रोतों से रेस्तरां मेनू डेटा एकत्र करें। API समझौतों, शर्तों, robots निर्देशों, दर सीमाओं, कॉपीराइट, गोपनीयता और डेटाबेस अधिकारों का सम्मान करें। ग्राहक, भुगतान, लॉयल्टी या निजी आर्डर डेटा का एकत्रीकरण न करें। एलर्जी या आहार उपयुक्तता का अनुमान न लगाएं। एक एआई प्रणाली स्रोत समय और अनिश्चितता प्रस्तुत करनी चाहिए, और निर्णायक चयनों के लिए एक मानव को पुष्टि करनी चाहिए।
एआई ऑर्डरिंग प्रणालियों के लिए रेस्तरां मेनू डेटा के लिए हियरार्की, मूल, ताजगी और सुरक्षा नियंत्रण आवश्यक हैं। मालिक एपीआई और पॉज फीड के पक्ष में रहें, स्थान और मेनू संदर्भ बरकरार रखें, आइटम विकल्प और मूल्य को नॉर्मलाइज करें, भाषा विविधता के साथ जुड़े रहें, और एलर्जी और आहार लेबल के लिए स्पष्ट साक्ष्य की आवश्यकता होती है। अधिकृत रूप से रेंडर किए गए पृष्ठ केवल एक नियंत्रित फॉलबैक के रूप में उपयोग करें, और समर्थित चुनौति निपटान को एक निर्दिष्ट बुनियादी चरण के रूप में नहीं, बल्कि एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्रोत के अनुमोदन के बजाय एक स्र
Rust में वेब स्क्रैपिंग के स्केलेबल आर्किटेक्चर सीखें, reqwest, scraper, असिंक्रोनस स्क्रैपिंग, हेडलेस ब्राउज़र स्क्रैपिंग, प्रॉक्सी रोटेशन, और संगत CAPTCHA का निपटारा।

CapSolver के साथ RoxyBrowser के एकीकरण करें ताकि ब्राउज़र के कार्यों को स्वचालित किया जा सके और reCAPTCHA, Turnstile और अन्य CAPTCHAs को बायपास किया जा सके।
