Python requests प्रॉक्सी सेटिंग, SOCKS5 और HTTP प्रॉक्सी कनेक्शन
यह गाइड Python requests लाइब्रेरी में Socks5Proxy के HTTP और SOCKS5 प्रॉक्सी को कनेक्ट करने का तरीका, username/password ऑथेंटिकेशन, लिस्ट रोटेशन और रिट्राय कोड को स्टेप-बाय-स्टेप समझाती है।
तैयारी के लिए क्या आवश्यक है?
Python 3.8 और requests लाइब्रेरी की आवश्यकता होती है। SOCKS5 का उपयोग करने के लिए SOCKS समर्थन बंडल को साथ में इंस्टॉल करना होता है। requests[socks] इंस्टॉल करने पर PySocks साथ में इंस्टॉल होता है और socks5 और socks5h पते का उपयोग किया जा सकता है।
प्रॉक्सी जानकारी डैशबोर्ड के 'मेरी प्रॉक्सी' पेज पर मिलेगी। उदाहरण: IP 198.51.100.23, HTTP पोर्ट 8000, SOCKS5 पोर्ट 1080, यूजरनेम spx_user, पासवर्ड spx_pass। वास्तविक मानों का उपयोग करें।
pip install "requests[socks]"HTTP प्रॉक्सी कैसे कनेक्ट करें?
requests में proxies शब्दकोश में पता डालें तो उस प्रॉक्सी से अनुरोध भेजा जाएगा। http और https दोनों कुंजियों में एक ही HTTP प्रॉक्सी पता डालना महत्वपूर्ण है। https कुंजी न होने पर HTTPS पते का अनुरोध प्रॉक्सी के बिना सीधे जाएगा।
HTTPS साइट अनुरोध CONNECT विधि के माध्यम से प्रॉक्सी को पास करते हैं, जिससे डेटा शुरू से अंत तक एन्क्रिप्टेड रहता है। नीचे दिया गया कोड IP चेक पते का अनुरोध करता है और प्रतिक्रिया में प्रॉक्सी IP दिखाई देता है या नहीं, इसकी जांच करता है।
import requests
proxy = "http://spx_user:spx_pass@198.51.100.23:8000"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.status_code, r.json()) # the "ip" field should show the proxy IPSOCKS5 प्रॉक्सी से कैसे कनेक्ट करें?
SOCKS5 के लिए एड्रेस में socks5h का उपयोग करने की सलाह दी जाती है। socks5h डोमेन नाम रिजॉल्यूशन को प्रॉक्सी साइड पर करता है, जिससे आपके सर्वर का DNS अनुरोध बाहर नहीं दिखाई देता और नाम प्रॉक्सी के देश के आधार पर रिजॉल्व होता है। socks5 का उपयोग करने पर नाम रिजॉल्यूशन आपके सर्वर पर होता है और सिर्फ IP प्रॉक्सी को भेजा जाता है।
पोर्ट के लिए SOCKS5 पोर्ट का उपयोग करना चाहिए। HTTP पोर्ट में SOCKS5 पता डालने से कनेक्शन नहीं होगा, इसलिए प्रत्येक पंक्ति में दो पोर्ट को अलग-अलग पहचानें।
import requests
proxy = "socks5h://spx_user:spx_pass@198.51.100.23:1080"
proxies = {"http": proxy, "https": proxy}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())कई प्रॉक्सी को रोटेट करके अनुरोध कैसे भेजें?
कई पेज स्क्रैप करते समय, प्रॉक्सी लिस्ट डाउनलोड करके हर रिक्वेस्ट के लिए अगला प्रॉक्सी इस्तेमाल करना बेसिक तरीका है। नीचे दिया गया कोड API से SOCKS5 लिस्ट लेकर उन्हें क्रम में इस्तेमाल करता है, और फेल हुई रिक्वेस्ट को अलग प्रॉक्सी से अधिकतम 3 बार रिट्राय करता है। एक ही डोमेन पर बहुत तेजी से रिक्वेस्ट न करने के लिए थोड़ा वेट टाइम भी जोड़ा गया है।
विफल प्रॉक्सी को तुरंत छोड़ने के बजाय थोड़ा आराम देकर फिर से उपयोग करना बेहतर है। अस्थायी त्रुटियाँ अक्सर टार्गेट साइट की स्थिति के कारण होती हैं।
import itertools
import time
import requests
API = "https://socks5proxy.io/api/v1"
KEY = "YOUR_API_KEY"
lines = requests.get(
API + "/proxies/download",
params={"format": "user:pass@ip:port", "protocol": "socks5"},
headers={"Authorization": "Bearer " + KEY},
timeout=30,
).text.split()
pool = itertools.cycle(lines)
def fetch(url, tries=3):
for _ in range(tries):
p = "socks5h://" + next(pool)
try:
r = requests.get(url, proxies={"http": p, "https": p}, timeout=20)
if r.status_code == 200:
return r.text
except requests.RequestException:
pass
time.sleep(1)
return None
for page in range(1, 6):
html = fetch("https://example.com/list?page=" + str(page))
print(page, "ok" if html else "failed")
time.sleep(0.5)सेशन और कुकी को मेंटेन करने के लिए क्या करें?
लॉगिन या पेज नेविगेशन जैसे कुकी-आधारित फ्लो के लिए requests.Session के साथ एक प्रॉक्सी को फिक्स करें। सत्र ऑब्जेक्ट के proxies गुण में पता डालने से उस सत्र के सभी अनुरोध एक ही आईपी से जाएंगे। फ्लो पूरा होने पर सत्र बंद करें और अगले प्रॉक्सी के लिए नया सत्र बनाएं।
हर सेशन के लिए User-Agent और Accept-Language हेडर भी सेट करें तो टारगेट साइट पर कंसिस्टेंट दिखाई देंगे।
import requests
s = requests.Session()
s.proxies = {
"http": "http://spx_user:spx_pass@198.51.100.23:8000",
"https": "http://spx_user:spx_pass@198.51.100.23:8000",
}
s.headers.update({"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"})
s.get("https://example.com/", timeout=20) # cookies are stored in the session
r = s.get("https://example.com/account", timeout=20) # same IP, same cookies
print(r.status_code)
s.close()IP ऑथराइजेशन से कनेक्ट करने पर कैसे इस्तेमाल करें?
डैशबोर्ड पर इस कोड को चलाने वाले सर्वर का IPv4 पंजीकृत करें, तो पते से यूजरनेम और पासवर्ड हटाकर इस्तेमाल कर सकते हैं। पासवर्ड को कोड या कॉन्फिग फाइल में रखने की जरूरत नहीं, जिससे मल्टीपल सर्वर पर एक ही कोड डिप्लॉय करना आसान होता है। सूची प्राप्त करते समय भी format को ip:port पर सेट करें।
import requests
proxy = "http://198.51.100.23:8000" # no user or password, server IP is authorized in the dashboard
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
print(r.text)कई अनुरोधों को एक साथ तेजी से कैसे भेजें?
requests एक अनुरोध समाप्त होने तक प्रतीक्षा करने वाला तरीका है, इसलिए कई पृष्ठों को तेजी से प्राप्त करने के लिए कई कार्यों को एक साथ चलाना होगा। सबसे आसान तरीका concurrent.futures का ThreadPoolExecutor है। कार्य संख्या को प्रॉक्सी संख्या से कम रखें तो एक IP पर अनुरोध नहीं जमा होंगे।
नीचे दिया गया कोड 20 कार्यकर्ताओं के साथ पते की सूची को विभाजित करके प्राप्त करता है, और प्रत्येक कार्य के लिए सूची से अगला प्रॉक्सी चुनता है। itertools.cycle का उपयोग करने पर कई थ्रेड्स के साथ उपयोग करने पर भी अगला मान प्राप्त करने में कोई समस्या नहीं होती है, लेकिन सटीक क्रम की आवश्यकता होने पर लॉक का उपयोग करें।
import itertools
from concurrent.futures import ThreadPoolExecutor
import requests
lines = open("proxies.txt").read().split() # user:pass@ip:port per line
pool = itertools.cycle(lines)
def get(url):
p = "http://" + next(pool)
try:
return url, requests.get(url, proxies={"http": p, "https": p}, timeout=20).status_code
except requests.RequestException as e:
return url, type(e).__name__
urls = ["https://example.com/item/" + str(i) for i in range(200)]
with ThreadPoolExecutor(max_workers=20) as ex:
for url, result in ex.map(get, urls):
print(url, result)क्या httpx या aiohttp जैसे एसिंक्रोनस लाइब्रेरी का उपयोग कर सकते हैं?
हां। httpx में क्लाइंट बनाते समय proxy पैरामीटर में पता डालना होता है, और SOCKS5 के लिए httpx[socks] इंस्टॉल करने पर socks5 पता उपयोग किया जा सकता है। एसिंक्रोनस क्लाइंट AsyncClient भी समान पैरामीटर स्वीकार करता है।
aiohttp में हर रिक्वेस्ट के proxy पैरामीटर में HTTP प्रॉक्सी एड्रेस डालें, और proxy_auth में aiohttp.BasicAuth पास करें। aiohttp डिफ़ॉल्ट रूप से SOCKS सपोर्ट नहीं करता, इसलिए SOCKS5 के लिए aiohttp-socks पैकेज के कनेक्टर का इस्तेमाल करना होगा।
एसिंक्रोनस मेथड्स हजारों रिक्वेस्ट्स को कम रिसोर्सेज में हैंडल कर सकते हैं, लेकिन अगर कंकरेंट रिक्वेस्ट्स लिमिट नहीं की गई तो टारगेट साइट और प्रॉक्सी पर एक साथ भारी लोड पड़ सकता है। asyncio.Semaphore का उपयोग करके कंकरेंट रिक्वेस्ट्स की संख्या लिमिट करें।
import httpx
with httpx.Client(proxy="http://spx_user:spx_pass@198.51.100.23:8000", timeout=20) as client:
print(client.get("https://api.ipify.org").text)सामान्य त्रुटियों को कैसे हल करें?
SOCKS समर्थन के लिए गायब निर्भरता त्रुटि का मतलब है कि requests[socks] इंस्टॉल नहीं है। कृपया उसी वर्चुअल एनवायरनमेंट में फिर से इंस्टॉल करें।
407 Proxy Authentication Required तब होता है जब यूजरनेम या पासवर्ड गलत हो, या IP प्रमाणीकरण का उपयोग कर रहे हों और सर्वर IP पंजीकृत न हो। यदि पासवर्ड में विशेष वर्ण हैं, तो उन्हें urllib.parse.quote से बदलना होगा।
कनेक्शन टाइमआउट अक्सर गलत पोर्ट के कारण होता है। सुनिश्चित करें कि HTTP एड्रेस के लिए HTTP पोर्ट और socks5h एड्रेस के लिए SOCKS5 पोर्ट का उपयोग किया गया है। timeout मान सेट करने से नॉन-रिस्पॉन्सिव अनुरोधों के कारण पूरे कार्य को रोकने से बचा जा सकता है।
- SOCKS त्रुटि: pip install "requests[socks]"
- 407: यूजरनेम·पासवर्ड या पंजीकृत IP जांचें
- समय सीमा: HTTP पोर्ट और SOCKS5 पोर्ट अलग करें
- सभी अनुरोधों में टाइमआउट डालें