वेब स्क्रैपिंग वेब से डेटा निकालने के लिए एक प्रभावी तरीका है। कई डेवलपर्स वेब स्क्रैपिंग प्रोजेक्ट्स को ले जाने के लिए पायथन रिक्वेस्ट लाइब्रेरी का उपयोग करना पसंद करते हैं क्योंकि यह सरल और प्रभावी है। हालांकि, जैसा कि यह है, अनुरोध पुस्तकालय की अपनी सीमाएं हैं। वेब स्क्रैपिंग में हम एक विशिष्ट समस्या का सामना कर सकते हैं, यह विफल अनुरोध है, जो अक्सर अस्थिर डेटा निष्कर्षण की ओर ले जाता है। इस लेख में, हम पायथन में अनुरोध रिट्रीज को लागू करने की प्रक्रिया से गुजरेंगे, ताकि आप HTTP त्रुटियों को संभाल सकें और अपनी वेब स्क्रैपिंग स्क्रिप्ट को स्थिर और विश्वसनीय रख सकें।
आइए पहले हमारे वातावरण को सेट करें। सुनिश्चित करें कि आपके पास पायथन स्थापित है और अपनी पसंद का कोई भी आईडीई है। फिर अनुरोध लाइब्रेरी स्थापित करें यदि आपके पास यह पहले से ही नहीं है।
pip install requests
एक बार स्थापित होने के बाद, आइए पायथन के अनुरोध मॉड्यूल का उपयोग करके Example.com पर एक अनुरोध भेजें। यहाँ एक सरल कार्य है जो बस यही करता है:
import requests
def send_request(url):
"""
निर्दिष्ट URL के लिए HTTP GET अनुरोध भेजता है और प्रतिक्रिया स्थिति कोड प्रिंट करता है।
Parameters:
url (str): अनुरोध भेजने के लिए URL।
"""
response = requests.get(url)
print('Response Status Code: ', response.status_code)
send_request('https://example.com')
कोड आउटपुट नीचे दिखाया गया है:
आइए उन्हें बेहतर समझने के लिए HTTP स्टेटस कोड पर करीब से नज़र डालें।
सर्वर अनुरोध के परिणाम को इंगित करने वाले स्टेटस कोड के साथ HTTP अनुरोध का जवाब देता है। यहाँ एक त्वरित रंडन है:
हमारे उदाहरण में, स्थिति कोड 200 का अर्थ है https://example.com का अनुरोध पूरा हो गया। यह सर्वर का कहने का तरीका है, "यहां सब कुछ अच्छा है, आपका अनुरोध एक सफलता थी"।
ये स्थिति कोड बॉट का पता लगाने में भी भूमिका निभा सकते हैं और यह संकेत देते हैं कि बॉट जैसे व्यवहार के कारण पहुंच कब प्रतिबंधित है।
नीचे HTTP त्रुटि कोड का एक त्वरित रनडाउन है जो मुख्य रूप से बॉट का पता लगाने और प्रमाणीकरण मुद्दों के कारण होता है।
आइए अब HTTP को अनुरोध लाइब्रेरी के साथ अनुरोध करने के लिए पायथन में एक सरल रिट्री तंत्र लिखें। ऐसे समय होते हैं जब नेटवर्क अनुरोध कुछ नेटवर्क समस्या या सर्वर अधिभार के कारण विफल हो जाते हैं। इसलिए यदि हमारा अनुरोध विफल हो जाता है, तो हमें इन अनुरोधों को पुनः प्राप्त करना चाहिए।
फ़ंक्शन send_request_with_basic_retry_mechanism HTTP को किसी दिए गए URL को एक बुनियादी रिट्री तंत्र के साथ अनुरोध करता है, जो केवल तभी पुन: प्रयास करेगा जब कोई नेटवर्क या अनुरोध अपवाद जैसे कनेक्शन त्रुटि का सामना करना पड़ता है। यह अधिकतम MAX_RERTRIES के अनुरोध को पुनः प्राप्त करेगा। यदि सभी इस तरह के अपवाद के साथ विफल हो जाते हैं, तो यह अंतिम सामना अपवाद को बढ़ाता है।
import requests
import time
def send_request_with_basic_retry_mechanism(url, max_retries=2):
"""
एक बुनियादी रिट्री तंत्र के साथ एक URL के लिए एक HTTP GET अनुरोध भेजता है।
Parameters:
url (str): अनुरोध भेजने के लिए URL।
max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या।
Raises:
requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।
"""
for attempt in range(max_retries):
try:
response = requests.get(url)
print('Response status: ', response.status_code)
break # बाहर निकलें लूप यदि सफल अनुरोध करें
except requests.RequestException as error:
print(f"Attempt {attempt+1} failed:", error)
if attempt < max_retries - 1:
print(f"Retrying...")
time.sleep(delay) # पुन: प्रयास करने से पहले प्रतीक्षा करें
else:
print("Max retries exceeded.")
# अंतिम अपवाद को फिर से बढ़ाएं यदि मैक्स रिट्रीज़ पहुंच गया
raise
send_request_with_basic_retry_mechanism('https://example.com')
आइए अब उन परिदृश्यों को संभालने के लिए बेसिक रिट्री मैकेनिज्म को अनुकूलित करें जहां हम जिस वेबसाइट को बॉट डिटेक्शन मैकेनिज्म को स्क्रैप करने की कोशिश कर रहे हैं, उसके परिणामस्वरूप ब्लॉकिंग हो सकती है। इस तरह के परिदृश्यों को संबोधित करने के लिए, हमें कई बार अनुरोध को फिर से प्राप्त करने की आवश्यकता है, क्योंकि वे केवल बॉट डिटेक्शन ब्लॉक नहीं हो सकते हैं, बल्कि नेटवर्क या सर्वर समस्याओं के कारण भी हो सकते हैं।
नीचे फ़ंक्शन Send_Request_with_advance_retry_mechanism वैकल्पिक रिट्री प्रयासों के साथ प्रदान किए गए URL को HTTP GET अनुरोध भेजता है और देरी को पुनः प्राप्त करता है। यह अनुरोधों की निर्दिष्ट संख्या के लिए कई बार अनुरोध भेजने की कोशिश करता है और यदि अनुरोध को सफलतापूर्वक प्रतिक्रिया मिलती है तो प्रतिक्रिया स्थिति कोड को प्रिंट करता है। यदि यह अनुरोध ऑपरेशन के दौरान एक त्रुटि का सामना करता है, तो यह त्रुटि संदेश को प्रिंट करता है और इसे वापस ले जाता है। यह प्रत्येक प्रयास के बीच निर्दिष्ट रिट्री देरी का इंतजार करता है। यदि अनुरोध रिट्री प्रयासों की निर्दिष्ट संख्या के बाद भी विफल हो जाता है, तो यह अंतिम सामना किए गए अपवाद को बढ़ाता है।
विलंब पैरामीटर महत्वपूर्ण है क्योंकि यह एक करीबी अंतराल पर कई अनुरोधों के साथ सर्वर पर बमबारी करने से बचता है। इसके बजाय, यह सर्वर के पास अनुरोध को संसाधित करने के लिए पर्याप्त समय होने का इंतजार करता है, जिससे सर्वर को लगता है कि एक मानव और बॉट नहीं अनुरोध कर रहा है। तो, सर्वर अधिभार या धीमी सर्वर प्रतिक्रिया से बचने के लिए रिट्री तंत्र को देरी होनी चाहिए जो एंटी-बॉट तंत्र को ट्रिगर कर सकती है।
import requests
import time
def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1):
"""
एक उन्नत रिट्री तंत्र के साथ निर्दिष्ट URL के लिए एक HTTP GET अनुरोध भेजता है।
Parameters:
url (str): अनुरोध भेजने के लिए URL।
max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या। डिफ़ॉल्ट 3 है।
delay (int): रिट्रीज के बीच देरी (सेकंड में)। डिफ़ॉल्ट 1 है।
Raises:
requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।
"""
for attempt in range(max_retries):
try:
response = requests.get(url)
# 4xx या 5xx स्थिति कोड के लिए एक अपवाद बढ़ाएं
response.raise_for_status()
print('Response Status Code:', response.status_code)
except requests.RequestException as e:
# प्रिंट त्रुटि संदेश और प्रयास संख्या यदि अनुरोध विफल हो जाता है
print(f"Attempt {attempt+1} failed:", e)
if attempt < max_retries - 1:
# रिट्री मैसेज प्रिंट करें और रिट्री करने से पहले प्रतीक्षा करें
print(f"Retrying in {delay} seconds...")
time.sleep(delay)
else:
# यदि मैक्स रिट्रीज़ पार हो जाता है, तो संदेश प्रिंट करें और अपवाद को फिर से बढ़ाएं
print("Max retries exceeded.")
raise
# उदाहरण उपयोग
send_request_with_advance_retry_mechanism('https://httpbin.org/status/404')
यहां कमियों को संबोधित करने वाली टिप्पणियों के साथ सही कोड है:
import requests
import time
def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1, min_content_length=10):
"""
एक उन्नत रिट्री तंत्र के साथ निर्दिष्ट URL के लिए एक HTTP GET अनुरोध भेजता है।
Parameters:
url (str): अनुरोध भेजने के लिए URL।
max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या। डिफ़ॉल्ट 3 है।
delay (int): रिट्रीज के बीच देरी (सेकंड में)। डिफ़ॉल्ट 1 है।
min_content_length (int): मान्य पर विचार करने के लिए प्रतिक्रिया सामग्री की न्यूनतम लंबाई। डिफ़ॉल्ट 10 है।
Raises:
requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।
"""
for attempt in range(max_retries):
try:
response = requests.get(url)
# 4xx या 5xx स्थिति कोड के लिए एक अपवाद बढ़ाएं
response.raise_for_status()
# जाँच करें कि क्या प्रतिक्रिया स्थिति कोड 404 है
if response.status_code == 404:
print("404 Error: Not Found")
break # Exit loop for 404 errors
# जाँच करें कि क्या प्रतिक्रिया पाठ की लंबाई निर्दिष्ट न्यूनतम सामग्री लंबाई से कम है
if len(response.text) < min_content_length:
print("Response text length is less than specified minimum. Retrying...")
time.sleep(delay)
continue # अनुरोध करें
print('Response Status Code:', response.status_code)
# यदि शर्तें पूरी होती हैं, तो लूप से बाहर निकलें
break
except requests.RequestException as e:
print(f"Attempt {attempt+1} failed:", e)
if attempt < max_retries - 1:
print(f"Retrying in {delay} seconds...")
time.sleep(delay)
else:
print("Max retries exceeded.")
# अंतिम अपवाद को फिर से बढ़ाएं यदि मैक्स रिट्रीज़ पहुंच गया
raise
# उदाहरण उपयोग
send_request_with_advance_retry_mechanism('https://httpbin.org/status/404')
429 बहुत सारे अनुरोधों जैसी कुछ त्रुटियों के लिए, घूर्णन प्रॉक्सी का उपयोग करने से आपके अनुरोधों को वितरित करने और दर सीमित करने से बचने में मदद मिल सकती है।
नीचे दिया गया कोड प्रॉक्सी के उपयोग के साथ एक उन्नत रिट्री रणनीति को लागू करता है। इस तरह, हम एक पायथन अनुरोधों को लागू करने के लिए लागू कर सकते हैं। उच्च गुणवत्ता वाले वेब स्क्रैपिंग प्रॉक्सी का उपयोग करना भी महत्वपूर्ण है। इन परदे के पीछे प्रॉक्सी रोटेशन और एक विश्वसनीय पूल के लिए एक अच्छा एल्गोरिथ्म होना चाहिए।
import requests
import time
def send_request_with_advance_retry_mechanism(url, max_retries=3, delay=1, min_content_length=10):
"""
एक उन्नत रिट्री तंत्र के साथ निर्दिष्ट URL के लिए एक HTTP GET अनुरोध भेजता है।
Parameters:
url (str): अनुरोध भेजने के लिए URL।
max_retries (int): अनुरोध को पुनः प्राप्त करने के लिए अधिकतम संख्या। डिफ़ॉल्ट 3 है।
delay (int): रिट्रीज के बीच देरी (सेकंड में)। डिफ़ॉल्ट 1 है।
Raises:
requests.RequestException: यदि सभी पुनर्विचार विफल हो जाते हैं तो अंतिम अपवाद उठाता है।
"""
proxies = {
"http": "http://USER:PASS@HOST:PORT",
"https": "https://USER:PASS@HOST:PORT"
}
for attempt in range(max_retries):
try:
response = requests.get(url, proxies=proxies, verify=False)
# 4xx या 5xx स्थिति कोड के लिए एक अपवाद बढ़ाएं
response.raise_for_status()
# जाँच करें कि क्या प्रतिक्रिया स्थिति कोड 404 है
if response.status_code == 404:
print("404 Error: Not Found")
break # 404 त्रुटियों के लिए लूप से बाहर निकलें
# जाँच करें कि क्या प्रतिक्रिया पाठ की लंबाई 10 वर्णों से कम है
if len(response.text) < min_content_length:
print("Response text length is less than 10 characters. Retrying...")
time.sleep(delay)
continue # अनुरोध करें
print('Response Status Code:', response.status_code)
# यदि शर्तें पूरी होती हैं, तो लूप से बाहर निकलें
break
except requests.RequestException as e:
print(f"Attempt {attempt+1} failed:", e)
if attempt < max_retries - 1:
print(f"Retrying in {delay} seconds...")
time.sleep(delay)
else:
print("Max retries exceeded.")
# अंतिम अपवाद को फिर से बढ़ाएं यदि मैक्स रिट्रीज़ पहुंच गया
raise
send_request_with_advance_retry_mechanism('https://httpbin.org/status/404')
पायथन में अनुरोध रिट्रीज प्रभावी वेब स्क्रैपिंग के लिए महत्वपूर्ण हैं। जिन तरीकों से हमने रिट्रीज का प्रबंधन करने के लिए चर्चा की है, वे डेटा संग्रह की दक्षता और विश्वसनीयता को अवरुद्ध करने और बढ़ाने से रोकने में मदद कर सकते हैं। इन तकनीकों को लागू करने से आपकी वेब स्क्रैपिंग स्क्रिप्ट को अधिक मजबूत और बॉट प्रोटेक्शन सिस्टम द्वारा पता लगाने के लिए अतिसंवेदनशील बना देगा।
टिप्पणियाँ: 0