🎯 कस्टमाइज़ करने योग्य, डिटेक्शन-प्रतिरोधी क्लाउड ब्राउज़र जो स्व-विकसित Chromium द्वारा संचालित है, वेब क्रॉलर और एआई एजेंट्स के लिए डिज़ाइन किया गया। 👉अभी आज़माएं
वापस ब्लॉग पर

curl_cffi वेब स्क्रैपिंग: पाइथन में ब्राउज़र TLS फ़िंगरप्रिंट्स

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

22-Jul-2026

TL;DR:

  • curl_cffi एक Python HTTP क्लाइंट है जो एक असली ब्राउज़र के TLS हैंडशेक की नकल करता है, ताकि एक सर्वर जो कनेक्शन को फ़िंगरप्रिंट करता है, उसे Chrome के रूप में देख सके न कि एक स्क्रिप्टिंग क्लाइंट के रूप में।
  • एक requests.get(url, impersonate="chrome") कॉल एक ब्राउज़र JA3 फ़िंगरप्रिंट प्रस्तुत करता है और HTTP/2 को नेगोशिएट करता है, बिना किसी ब्राउज़र प्रक्रिया की आवश्यकता के।
  • JA3 हैश हर बार बदलता है, और यही सही है: GREASE हैंडशेक में यादृच्छिक मान डालता है, जो असली Chrome भी करता है।
  • curl_cffi JavaScript नहीं चलाता, इसलिए क्लाइंट-Rendered पृष्ठ पर यह खाली शेल लौटाता है; गाइड इसे curl_cffi से 0 उद्धरण ब्लॉकों और Scrapeless से 10 ब्लॉकों के साथ रेंडरिंग के साथ साबित करता है।
  • जब एक TLS फ़िंगरप्रिंट बाधा होती है, तो curl_cffi का उपयोग करें, और जब पृष्ठ को रेंडरिंग की आवश्यकता होती है, चुनौतियों को साफ़ किया जाता है, या IP रोटेशन की आवश्यकता होती है, तो Scrapeless का उपयोग करें।
  • Scrapeless मुफ्त योजना पर शुरू करें क्योंकि पृष्ठ की TLS नकल अकेले नहीं पहुंच सकती।

एक साधारण Python HTTP क्लाइंट में एक ऐसा संकेत है जो लक्ष्य भेजने से पहले एक भी HTML बाइट भेजने से पहले पढ़ सकता है: इसका TLS हैंडशेक। ClientHello में सिफर और एक्सटेंशन का सेट ऐसा नहीं लगता जैसा एक ब्राउज़र का होता है, और एक सर्वर जो उस हैंडशेक को फ़िंगरप्रिंट करता है, केवल फ़िंगरप्रिंट के आधार पर अनुरोध को अवरुद्ध कर सकता है। curl_cffi एक असली ब्राउज़र के TLS सिग्नचर को उधार लेकर उस अंतर को बंद करता है।

यह गाइड curl_cffi को एक ब्राउज़र फ़िंगरप्रिंट प्रस्तुत करते हुए दिखाता है, समझाता है कि JA3 हैश क्यों लगातार नहीं है, और फिर उस रेखा को खींचता है जिसे curl_cffi पार नहीं कर सकता। जहां एक पृष्ठ को एक असली ब्राउज़र की आवश्यकता होती है, वहाँ Scrapeless यूनिवर्सल स्क्रैपिंग API कार्यभार संभालता है। नीचे दिए गए हर नंबर एक असली रन से आया है।

curl_cffi क्या करता है

curl_cffi एक requests-शैली का HTTP क्लाइंट है जो curl-impersonate पर आधारित है, और इसका काम TLS हैंडशेक को एक विशिष्ट ब्राउज़र जैसा दिखाना है। एक सर्वर जो हैंडशेक का निरीक्षण करता है, एक JA3 फ़िंगरप्रिंट की गणना करता है, जो ClientHello के संस्करण, सिफर और एक्सटेंशन का सारांश है जो TLS 1.3 हैंडशेक पर निर्धारित है। एक डिफ़ॉल्ट Python क्लाइंट एक ऐसा फ़िंगरप्रिंट उत्पन्न करता है जो कोई ब्राउज़र नहीं करेगा; curl_cffi एक ऐसा उत्पन्न करता है जो एक नामित ब्राउज़र करता है। curl_cffi रिपॉजिटरी उन ब्राउज़र संस्करणों की सूची देती है जिन्हें यह नकल कर सकता है।

curl_cffi जो नहीं करता वह है एक ब्राउज़र चलाना। इसमें कोई JavaScript इंजन नहीं है, कोई रेंडरिंग नहीं है, और कोई चुनौती हल नहीं करता है। यह एक फ़िंगरप्रिंट है, न कि एक ब्राउज़र।

इंस्टॉल करें

curl_cffi एकल pip इंस्टॉल है।

bash Copy
pip install curl_cffi

एक ब्राउज़र फ़िंगरप्रिंट का अनुकरण करें

impersonate के साथ एक ब्राउज़र नाम पास करें और curl_cffi उस ब्राउज़र का TLS हैंडशेक बनाएगा। नीचे दिया गया अनुरोध एक फ़िंगरप्रिंटिंग सेवा से रिपोर्ट करने के लिए कहता है कि उसने क्या देखा।

python Copy
from curl_cffi import requests

response = requests.get("https://tls.peet.ws/api/all", impersonate="chrome", timeout=30)
fingerprint = response.json()
print("http version:", fingerprint["http_version"])
print("ja3 hash:", fingerprint["tls"]["ja3_hash"])

सेवा HTTP/2 की रिपोर्ट करती है, जिसे एक ब्राउज़र नेगोशिएट करता है और एक डिफ़ॉल्ट क्लाइंट आमतौर पर नहीं करता, और एक JA3 हैश।

text Copy
http version: h2
ja3 hash: 9a23d5cedcea13483954537602158034

उपरोक्त ja3 हैश मान एक रन का परिणाम है; स्क्रिप्ट को फिर से चलाएंगे तो यह बदल जाएगा। यह एक बग नहीं है। GREASE तंत्र ClientHello में यादृच्छिक आरक्षित मान डालता है, और असली Chrome भी ऐसा ही करता है, इसलिए JA3 हैश कनेक्शन से कनेक्शन में भिन्न होता है। जो चीज़ ब्राउज़र जैसी रहती है वह हैंडशेक का आकार है, जो एक फ़िंगरप्रिंट जांच वास्तव में मूल्यांकित करती है।

जहाँ curl_cffi रुकता है

एक ब्राउज़र TLS फ़िंगरप्रिंट अनुरोध को एक हैंडशेक जांच के पार ले जाता है, लेकिन यह पृष्ठ को रेंडर नहीं करता। एक ऐसी साइट पर जो अपने सामग्री को JavaScript के साथ बनाती है, curl_cffi ठीक वही लौटाता है जो सर्वर ने भेजा है, जो एक खाली शेल है, और TLS अनुकरण का कोई भी मात्रा इसे नहीं भरता। यही वह स्थान है जहाँ रेंडरिंग टूल की आवश्यकता होती है।

शेल में अपना Scrapeless कुंजी सेट करें। रन टाइम पर असली कुंजी का उपयोग करें और अपने स्रोत से प्लेसहोल्डर को बाहर रखें।

bash Copy
export SCRAPELESS_API_KEY="sk_your_key_here"

नीचे दिया गया स्क्रिप्ट JavaScript-Rendered उद्धरण पृष्ठ को दो तरीकों से लाता है: curl_cffi के साथ एक संपूर्ण Chrome फ़िंगरप्रिंट के साथ, और Scrapeless के साथ रेंडरिंग चालू।

python Copy
import json
import os
import urllib.request

from curl_cffi import requests

JS_PAGE = "https://quotes.toscrape.com/js/"

response = requests.get(JS_PAGE, impersonate="chrome", timeout=30)
print("curl_cffi स्थिति:", response.status_code)
print("curl_cffi उद्धरण ब्लॉक्स:", response.text.count('class="quote"'))


def scrapeless(url: str) -> str:
    payload = json.dumps(
{"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": True, "headless": True}} 
    ).encode() 
    request = urllib.request.Request( 
        "https://api.scrapeless.com/api/v2/unlocker/request", 
        data=payload, 
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"}, 
        method="POST", 
    ) 
    with urllib.request.urlopen(request, timeout=90) as response: 
        return json.loads(response.read())["data"] 


html = scrapeless(JS_PAGE) 
print("scrapeless quote blocks:", html.count('class="quote"')) 

```text 
curl_cffi status: 200 
curl_cffi quote blocks: 0 
scrapeless quote blocks: 10 

200 जाल में एक जाल है: अनुरोध सफल होता है, इसलिए कुछ गलत नहीं लगता, लेकिन सामग्री वहाँ नहीं है। ये दो उपकरण विभिन्न समस्याओं का उत्तर देते हैं। curl_cffi एक TLS पहचान की जांच को हराता है; यह न तो प्रस्तुत करता है, न ही एक चुनौती को स्पष्ट करता है, या आईपी को घुमाता है। उंगलियों के निशान के पीछे की अवधारणा के लिए, TLS पहचान को बायपास करने के तरीके पर मार्गदर्शिका बताती है कि एक सर्वर क्या मापता है और क्यों।

किसी भी साइट पर यह सब चलाने से पहले, इसके robots.txt और शर्तों को पढ़ें। रोबोट्स बहिष्कार प्रोटोकॉल बताता है कि एक साइट स्वचालित ग्राहकों से किन पथों को टालने के लिए कहती है, और इसे आदर करना एक स्क्रेपर को टिकाऊ बनाए रखता है।

क्या आप उन पृष्ठों के लिए तैयार हैं जो केवल एक उंगली का निशान नहीं पहुंच सकता? एक मुफ्त Scrapeless खाता बनाएँ और उन्हें प्रस्तुत करें।

निष्कर्ष

curl_cffi एक काम के लिए सही उपकरण है: एक Python अनुरोध के TLS हैंडशेक को एक ब्राउज़र के रूप में दिखाना, जो बिना ब्राउज़र प्रक्रिया के पहचान जांच को साफ करता है। यह सटीक है, और इसकी सीमा भी उतनी ही सटीक है, क्योंकि यह कोई JavaScript नहीं चलाता है और एक खाली शेल लौटाता है। इसे तब इस्तेमाल करें जब दीवार हैंडशेक हो, और जब इसे प्रस्तुत करने, एक साफ चुनौती, या एक ताजा आईपी की आवश्यकता हो तो पृष्ठ को Scrapeless के पास सौंप दें। ऊपर दिए गए स्क्रिप्ट से शुरू करें और उस दीवार के अनुसार उपकरण से मेल करें जो आपके सामने है।

Scrapeless मुफ्त योजना से शुरू करें संरक्षित पृष्ठों के लिए, और जब आप एक आवर्ती कार्य का आकार तय करें तो Scrapeless मूल्य निर्धारण देखें।

अक्सर पूछे जाने वाले प्रश्न

प्रश्न: curl_cffi वास्तव में किसकी नकल करता है?

curl_cffi एक ब्राउज़र के TLS हैंडशेक और इसके HTTP/2 सेटिंग्स की नकल करता है, ताकि सर्वर द्वारा देखी गई ClientHello एक ब्राउज़र संस्करण के नाम से मेल खाती है न कि एक डिफ़ॉल्ट Python क्लाइंट से। यह एक ब्राउज़र के JavaScript इंजन या प्रस्तुतिकरण की नकल नहीं करता, केवल नेटवर्क स्तर के पहचान को।

प्रश्न: मैं अनुरोध चलाने पर JA3 हैश क्यों बदलता है?

GREASE के कारण, जो TLS ClientHello में यादृच्छिक आरक्षित मान डालता है। असली Chrome भी ऐसा करता है, इसलिए JA3 हैश कनेक्शनों के बीच भिन्न होता है जबकि हैंडशेक का सार्थक आकार ब्राउज़र जैसा रहता है। बदलता हुआ हैश अपेक्षित होता है, न कि यह संकेत कि नकल विफल हो गई।

प्रश्न: क्या curl_cffi एक JavaScript-प्रस्तुत पृष्ठ को खींच सकता है?

नहीं। curl_cffi में कोई JavaScript इंजन नहीं है, इसलिए एक क्लाइंट-प्रस्तुत पृष्ठ पर यह एक 200 स्थिति के साथ प्रारंभिक HTML शेल लौटाता है और प्रस्तुत सामग्री में से कोई नहीं। उन पृष्ठों के लिए एक प्रस्तुत उपकरण जैसे Scrapeless का उपयोग करें, और curl_cffi को उन एंडपॉइंट्स के लिए रखें जिनकी सामग्री पहले से प्रतिक्रिया में है।

प्रश्न: curl_cffi और requests में क्या अंतर है?

requests पुस्तकालय एक मानक Python TLS हैंडशेक भेजता है जिसे एक पहचान करने वाला सर्वर फ्लैग कर सकता है, जबकि curl_cffi अपने impersonate तर्क के माध्यम से एक ब्राउज़र का हैंडशेक भेजता है। API अन्यथा परिचित है, इसलिए requests.get(url, impersonate="chrome") ऐसे कोड के लिए एक ड्रॉप-इन के करीब है जिसे इसके पहचान पर अवरुद्ध किया जा रहा था।

प्रश्न: क्या एक ब्राउज़र TLS पहचान अवरोधन से बचने के लिए पर्याप्त है?

यह एक TLS-उंगली पहचान जांच के लिए पर्याप्त है और कुछ नहीं। चुनौती पृष्ठ, व्यवहारात्मक विश्लेषण, और आईपी प्रतिष्ठा अलग-अलग सुरक्षा उपाय हैं जिन पर curl_cffi कोई छुआ नहीं करता, इसलिए जब वे कार्य में हों तो आपको पहचान के शीर्ष पर प्रस्तुतिकरण, चुनौती प्रबंधन या प्रॉक्सी परिवर्तनों की आवश्यकता होती है।

स्क्रैपलेस में, हम केवल सार्वजनिक रूप से उपलब्ध डेटा का उपयोग करते हैं, जबकि लागू कानूनों, विनियमों और वेबसाइट गोपनीयता नीतियों का सख्ती से अनुपालन करते हैं। इस ब्लॉग में सामग्री केवल प्रदर्शन उद्देश्यों के लिए है और इसमें कोई अवैध या उल्लंघन करने वाली गतिविधियों को शामिल नहीं किया गया है। हम इस ब्लॉग या तृतीय-पक्ष लिंक से जानकारी के उपयोग के लिए सभी देयता को कोई गारंटी नहीं देते हैं और सभी देयता का खुलासा करते हैं। किसी भी स्क्रैपिंग गतिविधियों में संलग्न होने से पहले, अपने कानूनी सलाहकार से परामर्श करें और लक्ष्य वेबसाइट की सेवा की शर्तों की समीक्षा करें या आवश्यक अनुमतियाँ प्राप्त करें।

सबसे लोकप्रिय लेख

सूची