आपने रेजिडेंट प्रॉक्सी खरीदी, ताजा User-Agent Chrome सेट किया, फिर भी साइट पहले ही अनुरोध पर 403 दे रही है। क्या यह परिचित है? समस्या IP में नहीं है और न ही हेडर में। आपको सर्वर द्वारा एक भी HTTP हेडर पढ़े जाने से पहले ही पहचान लिया गया है - TLS-हैंडशेक के माध्यम से। 2026 में, यह पहचानने का नंबर 1 तरीका है, और सामान्य requests इसे स्वचालित रूप से असफल कर देता है। आइए समझते हैं कि यह कैसे काम करता है और इसे curl_cffi के माध्यम से कुछ कोड की पंक्तियों में कैसे ठीक किया जा सकता है।
क्या हो रहा है: आपको TLS-हैंडशेक द्वारा पहचाना जा रहा है
जब क्लाइंट HTTPS कनेक्शन स्थापित करता है, तो वह सबसे पहले ClientHello पैकेट भेजता है - HTTP से पहले। इसमें शामिल हैं: TLS का संस्करण, समर्थित सिफर सेट (cipher suites) की सूची, TLS एक्सटेंशन (SNI, ALPN, supported_groups), अंडाकार वक्र और बिंदुओं के प्रारूप। इन फ़ील्ड्स का क्रम और सामग्री विभिन्न क्लाइंट्स के लिए भिन्न होती है - और इसके माध्यम से क्लाइंट को पहचानना संभव है इससे पहले कि वह एक शब्द भी कहे।
इन फ़ील्ड्स से एक फ़िंगरप्रिंट बनाया जाता है। JA3 (2017 का मानक) एक स्ट्रिंग लेता है जैसे TLSVersion,Ciphers,Extensions,EllipticCurves,ECPointFormats और इसे MD5 के माध्यम से हैश करता है, जिससे 32-चरित्र का सिग्नेचर प्राप्त होता है। JA3 की समस्या यह है कि जनवरी 2023 से Chrome एक्सटेंशनों के क्रम को यादृच्छिक करता है - 16 एक्सटेंशनों से 16! (20 ट्रिलियन से अधिक) विकल्प मिलते हैं, और एक ही ब्राउज़र विभिन्न JA3 देता है।
इसलिए उद्योग JA4 (FoxIO, बड़े पैमाने पर कार्यान्वयन 2024-2025) पर चला गया है। JA4 हैशिंग से पहले एक्सटेंशन कोड को hex मान के अनुसार क्रमबद्ध करता है - Chrome की यादृच्छिकता इसे और नहीं तोड़ती। हैश - संक्षिप्त SHA-256, मानव-पठनीय और तीन-भागीय प्रारूप में (a_b_c) है, जिसमें ALPN और QUIC/HTTP3 का समर्थन शामिल है। उदाहरण: Chrome 124 t13d1516h2 देता है (15 सिफर, 16 एक्सटेंशन, ALPN h2), जबकि सामान्य Python requests t13d1715h2 देता है। एंटी-बॉट के लिए, दूसरा सिग्नेचर - "यह स्क्रिप्ट है" का सीधा मार्कर है।
क्यों 2026 में इसके बिना कोई रास्ता नहीं है
JA4-डिटेक सभी बड़े विक्रेताओं में अंतर्निहित है: Cloudflare फ़िंगरप्रिंट को allowlist के खिलाफ मिलाता है, Akamai HTTP/2 SETTINGS-फ्रेम का एक अलग हैश जोड़ता है, DataDome ज्ञात बॉट्स के डेटाबेस के साथ तुलना करता है। लॉजिक सरल और विनाशकारी है: यदि आप User-Agent: Chrome 131 भेजते हैं, जबकि TLS-फ़िंगरप्रिंट "urllib3/OpenSSL" चिल्लाता है - तो यह असंगति है, और आपको तुरंत ब्लॉक कर दिया जाता है। कोई प्रॉक्सी मदद नहीं करती: एक आदर्श रेजिडेंट IP जो Python requests का फ़िंगरप्रिंट है, फिर भी असफल हो जाता है।
इसीलिए "प्रॉक्सी + फ़िंगरप्रिंट की नकल" का संयोजन 2026 में स्क्रैपिंग की बुनियादी स्वच्छता बन गया है, न कि उन्नत के लिए एक विकल्प।
समाधान: curl_cffi 5 मिनट में
curl_cffi - यह curl-impersonate (संशोधित curl, जो Chrome के BoringSSL या Firefox के NSS के साथ OpenSSL के बजाय बनाया गया है) के लिए एक Python लपेटन है। यह वास्तविक ब्राउज़र हैंडशेक का अनुकरण करता है और इसमें एक API है, जो लगभग सामान्य requests के समान है।
चरण 1. स्थापना। Windows/macOS/Linux के लिए curl-impersonate बाइनरी स्वचालित रूप से खींची जाती हैं:
pip install curl-cffi
चरण 2. मूल अनुरोध। आप आयात बदलते हैं और एक पैरामीटर जोड़ते हैं:
from curl_cffi import requests
resp = requests.get("https://target.com/", impersonate="chrome")
print(resp.status_code)
print(resp.http_version) # HTTP/2 — जैसे असली ब्राउज़र में
एक पंक्ति impersonate="chrome" चार स्तरों की नकल करती है: TLS-फ़िंगरप्रिंट (JA3/JA4), HTTP का संस्करण (HTTP/2 के बजाय HTTP/1.1), हेडर्स का क्रम और ALPN-वार्ता।
चरण 3. हमेशा सामान्य उपनाम का उपयोग करें, न कि संस्करण को पिन करें। लिखें impersonate="chrome" (या "safari", "safari_ios") - उपनाम स्वचालित रूप से सबसे ताजा प्रोफ़ाइल में हल हो जाता है। हार्डकोडेड impersonate="chrome124" पुराना हो जाएगा: Chrome हर ~4 सप्ताह में अपडेट होता है, और पुरानी प्रोफ़ाइल स्वयं एक विसंगति बन जाएगी। विश्वसनीय लक्ष्य - Chrome, Edge और Safari/iOS (chrome99 से chrome131, safari15–18 तक प्रोफाइल)।
चरण 4. प्रॉक्सी और सत्र। वास्तविक स्क्रैपिंग के लिए, सत्र में स्थिति बनाए रखें और प्रॉक्सी संलग्न करें। रेजिडेंट या मोबाइल IP यहां अनिवार्य है - डेटा सेंटर TLS से अलग ASN द्वारा पहचाने जाते हैं:
from curl_cffi import requests
session = requests.Session(impersonate="chrome")
headers = {
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://www.google.com/",
}
proxies = {
"http": "http://user:pass@proxy-host:port",
"https": "http://user:pass@proxy-host:port",
}
resp = session.get("https://target.com", headers=headers, proxies=proxies)
चरण 5. मात्रा के लिए असिंक्रोनस। requests के विपरीत, curl_cffi में डिफ़ॉल्ट रूप से async और HTTP/2 है:
import asyncio
from curl_cffi.requests import AsyncSession
async def fetch(session, url):
r = await session.get(url, impersonate="chrome")
return r.status_code
async def main(urls):
async with AsyncSession() as session:
return await asyncio.gather(*[fetch(session, u) for u in urls])
asyncio.run(main(["https://target.com"] * 20))
अपने फ़िंगरप्रिंट की जांच करें - अनुमान न लगाएं
युद्ध के ट्रैफ़िक को भेजने से पहले, सुनिश्चित करें कि नकल वास्तव में काम कर रही है। सार्वजनिक सत्यापनकर्ताओं पर अनुरोध भेजें और JA4 की तुलना मानक ब्राउज़र से करें:
- tls.peet.ws - JA3, JA4, Akamai-फ़िंगरप्रिंट और HTTP/2-फ्रेम JSON में लौटाता है। इसे
curl_cffiऔर वास्तविक Chrome के माध्यम से अनुरोध करें, हैश की तुलना करें। - ja4db.com - ज्ञात JA4 का डेटाबेस, यह समझने में मदद करता है कि आप किस पर हैं।
- browserleaks.com/tls और Scrapfly का JA3/JA4 उपकरण - फ़ील्ड्स का विस्तृत विवरण।
स्टेजिंग में, स्क्रैपर और लक्ष्य के बीच mitmproxy स्थापित करना और प्रत्येक अनुरोध के वास्तविक JA4-हैश की निगरानी करना सुविधाजनक है।
डायग्नोस्टिक्स: क्या आप अभी भी 403/429 प्राप्त कर रहे हैं
यदि फ़िंगरप्रिंट सही है, और ब्लॉकिंग बनी हुई है - तो सामान्य से दुर्लभ तक चेकलिस्ट के अनुसार आगे बढ़ें:
- डेटा सेंटर IP. कारण #1। रेजिडेंट प्रॉक्सी या मोबाइल पर जाएं - क्यों एक फ़िंगरप्रिंट पर्याप्त नहीं है, इस पर विस्तार से चर्चा की गई है IP Intelligence के माध्यम से रेजिडेंट प्रॉक्सी का पता लगाने में।
- पुराना प्रोफ़ाइल।
pip install -U curl-cffiऔर सामान्य उपनाम"chrome"। - बहुत उच्च दर। अनुरोधों के बीच 1-3 सेकंड के यादृच्छिक विराम जोड़ें।
- नंगे हेडर। सुनिश्चित करें कि आप
Accept-Language,Accept-Encoding,Refererभेजते हैं - इनकी अनुपस्थिति भी एक विसंगति है। - सत्र और IP के बीच असंगति। नियम: एक सत्र - उसकी पूरी जीवन अवधि के लिए एक IP।
- स्टेटस 200 ≠ सफलता। प्रतिक्रिया के शरीर की जांच करें: कोड 200 के तहत CAPTCHA के साथ एक पृष्ठ हो सकता है।
कहाँ curl_cffi दीवार से टकराता है
curl_cffi नेटवर्क स्तर को बंद करता है - और यही है। यह JavaScript को निष्पादित नहीं करता है। इसलिए JS-चुनौतियों के खिलाफ यह बेकार है: Cloudflare Turnstile, "आपके ब्राउज़र की जांच कर रहा है..." (IUAM) पृष्ठ, कुकी cf_clearance, जिसे स्क्रिप्ट जांच के बाद सेट करती है - ये सभी वास्तविक ब्राउज़र वातावरण की आवश्यकता होती है। क्यों 2026 में कैप्चा सॉल्वर ऐसे पूर्व-निवारक सिस्टम के खिलाफ लगभग काम करना बंद कर दिए, हमने एक अलग विश्लेषण में CAPTCHA को बायपास करने पर चर्चा की।
जब आप JS-दीवार में टकराते हैं, तो क्या करें:
- हाइब्रिड। Playwright या Nodriver चुनौती को चलाता है और
cf_clearanceप्राप्त करता है, फिर कुकी को मुख्य अनुरोधों के लिए तेज़curl_cffiमें भेजा जाता है - इस तरह आप भारी ब्राउज़र के लिए एक बार भुगतान करते हैं। - Solver-सेवाएँ (CapSolver, 2Captcha) स्वचालित रूप से टोकन प्रदान करने के लिए।
- Managed-स्क्रैपिंग API, यदि आप बुनियादी ढांचे को बनाए रखना नहीं चाहते।
और धागा-सुरक्षा के बारे में याद रखें: प्रत्येक धागे के लिए - अपना सत्र। curl-cffi के संस्करण को requirements.txt में फिक्स करें और हर 6-12 सप्ताह में प्रोफाइल की समीक्षा करें, जब ब्राउज़र अपडेट हों।
curl_cffi के विकल्प
- tls-client - Go पुस्तकालय के आधार पर uTLS के लिए एक लपेटन, प्रोफाइल के साथ (
chrome_124,safari_ios_17) औरrandom_tls_extension_order=Trueका ध्वज। फ़िंगरप्रिंट का लचीला समायोजन। - primp - Rust पर आधारित क्लाइंट,
impersonate_osको स्वतंत्र रूप से सेट करने की अनुमति देता है और उच्च बैंडविड्थ प्रदान करता है; नकारात्मक - API पूरी तरह सेrequestsके साथ मेल नहीं खाता है और पुस्तकालय युवा है।
कौन सा प्रॉक्सी चाहिए और क्यों
फ़िंगरप्रिंट की नकल और प्रॉक्सी एक ही कार्य के विभिन्न आधे हिस्सों को हल करते हैं: curl_cffi "कनेक्शन कैसा दिखता है" के प्रश्न को हल करता है, प्रॉक्सी - "यह कहाँ से आ रहा है"। एंटी-बॉट दोनों संकेतों की स्वतंत्र रूप से जांच करता है, इसलिए एक आदर्श JA4 काले डेटा सेंटर-ASN के साथ बेकार है। सुरक्षित लक्ष्यों (मार्केटप्लेस, सोशल मीडिया, ट्रैवल एग्रीगेटर्स) के लिए, रेजिडेंट या मोबाइल प्रॉक्सी लें: उनके पास स्वच्छ ऑपरेटर उत्पत्ति है, और मोबाइल तो CGNAT "भीड़ प्रभाव" के पीछे भी छिपते हैं। डेटा सेंटर को असंवेदनशील लक्ष्यों और उच्च मात्रा के लिए छोड़ दें।
निष्कर्ष
2026 में स्क्रैपिंग पहचान की एक खेल है, न कि केवल IP की। सामान्य requests TLS-हैंडशेक स्तर पर एक स्क्रिप्ट के रूप में प्रस्तुत होता है और पहले हेडर से पहले ही हार जाता है। curl_cffi के साथ impersonate="chrome" में आयात को बदलना इस विफलता को पांच मिनट में हटा देता है, लेकिन यह केवल एक साफ रेजिडेंट या मोबाइल IP के साथ और सीमा को समझने के साथ काम करता है: नेटवर्क स्तर - हाँ, JavaScript-चुनौतियाँ - नहीं। ईमानदारी से स्टैक इकट्ठा करें: सही फ़िंगरप्रिंट, सही प्रॉक्सी, जहां JS-दीवार है वहां ब्राउज़र के साथ हाइब्रिड - और पहले अनुरोध पर 403 अतीत में रहेगा।
