Selenium प्रॉक्सी सेटअप, Chrome और Firefox में SOCKS5·HTTP प्रॉक्सी कनेक्शन
यह गाइड Selenium 4 से Chrome और Firefox चलाते समय Socks5Proxy के HTTP और SOCKS5 प्रॉक्सी को कनेक्ट करने का तरीका, और Chrome एक्जीक्यूशन आर्ग्युमेंट्स में प्रॉक्सी पासवर्ड न लेने के कारण IP ऑथराइजेशन का उपयोग करने की सेटिंग समझाती है।
Selenium में प्रॉक्सी ऑथेंटिकेशन कठिन क्यों है?
Chrome --proxy-server कमांड लाइन ऑप्शन के माध्यम से प्रॉक्सी पता स्वीकार करता है, लेकिन उस पते में यूजरनेम और पासवर्ड नहीं लेता है। यदि आप एक प्रॉक्सी से कनेक्ट करते हैं जिसमें यूजरनेम और पासवर्ड की आवश्यकता होती है, तो ब्राउज़र एक प्रमाणीकरण विंडो दिखाएगा, जिसे Selenium के माध्यम से भरना मुश्किल हो सकता है।
सबसे क्लीन सॉल्यूशन है IP ऑथराइजेशन। डैशबोर्ड पर Selenium चलाने वाले सर्वर/PC का IPv4 रजिस्टर करने पर प्रॉक्सी उस IP से यूजरनेम-पासवर्ड के बिना कनेक्शन स्वीकार करता है। Chrome में केवल ip:port डालना होता है। अधिकतम 10 IP रजिस्टर किए जा सकते हैं, जिससे मल्टीपल सर्वर से उपयोग संभव है।
उदाहरण में IP 198.51.100.23, HTTP पोर्ट 8000, SOCKS5 पोर्ट 1080 का उपयोग किया गया है।
pip install seleniumChrome में HTTP प्रॉक्सी कैसे जोड़ें?
IP ऑथराइजेशन रजिस्टर करने के बाद ChromeOptions में --proxy-server पैरामीटर के साथ एड्रेस डालें। Selenium 4.6 और ऊपर में Selenium Manager सही chromedriver को ऑटोमेटिक डाउनलोड करता है, इसलिए अलग से इंस्टॉल करने की ज़रूरत नहीं है।
हेडलेस मोड में भी समान पैरामीटर लागू होते हैं। कनेक्शन जांचने के लिए IP जांच पते को खोलें और स्क्रीन पर IP प्रॉक्सी IP है या नहीं देखें।
from selenium import webdriver
from selenium.webdriver.common.by import By
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000") # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")
driver = webdriver.Chrome(options=opts)
try:
driver.get("https://api.ipify.org")
print(driver.find_element(By.TAG_NAME, "body").text) # should print the proxy IP
finally:
driver.quit()Chrome में SOCKS5 प्रॉक्सी कैसे उपयोग करें?
--proxy-server में socks5:// एड्रेस डालें। Chrome SOCKS5 का उपयोग करते समय डोमेन नाम रिज़ॉल्यूशन प्रॉक्सी की ओर से करता है, लेकिन कुछ वातावरण में आंतरिक DNS रिज़ॉल्यूशन बच सकता है, इसलिए --host-resolver-rules तर्क का उपयोग करके स्थानीय नाम रिज़ॉल्यूशन को ब्लॉक करना एक आम तरीका है।
SOCKS5 भी IP अथॉरिजेशन द्वारा कनेक्ट होता है। क्योंकि Chrome SOCKS प्रॉक्सी के यूजरनेम और पासवर्ड ऑथेंटिकेशन को सपोर्ट नहीं करता।
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')
driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()Firefox में कैसे कनेक्ट करें?
Firefox प्रॉक्सी को पर्यावरण सेटिंग्स के माध्यम से निर्दिष्ट करता है। network.proxy.type को 1 (मैनुअल) पर सेट करें और HTTP या SOCKS पता और पोर्ट डालें। SOCKS5 के लिए, network.proxy.socks_version को 5 पर और network.proxy.socks_remote_dns को True पर सेट करें ताकि डोमेन नेम रिज़ॉल्यूशन प्रॉक्सी के माध्यम से हो।
Firefox में भी लॉन्च सेटिंग्स के माध्यम से प्रॉक्सी पासवर्ड डालने का कोई तरीका नहीं है, इसलिए IP प्रमाणीकरण का उपयोग करना सबसे सरल है।
from selenium import webdriver
opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)
driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()कई ब्राउज़रों को अलग-अलग आईपी के साथ एक साथ कैसे खोलें?
प्रत्येक ब्राउज़र को अलग-अलग प्रॉक्सी एड्रेस असाइन करके अलग-अलग रन करें। नीचे दिया गया कोड API से ip:port लिस्ट फ़ेच करके 3 ब्राउज़र्स को अलग-अलग IPs से लॉन्च करने का उदाहरण है। चूंकि एक ब्राउज़र ज्यादा मेमोरी यूज़ करता है, सर्वर साइज़ के अनुसार कंकरेंट इंस्टेंसेस की संख्या तय करें।
लंबे समय तक ब्राउज़र का उपयोग करने वाले कार्यों के लिए, एक ब्राउज़र के लिए एक आईपी को फिक्स करें और कार्य पूरा होने तक इसे न बदलें।
import requests
from selenium import webdriver
KEY = "YOUR_API_KEY"
lines = requests.get(
"https://socks5proxy.io/api/v1/proxies/download",
params={"format": "ip:port", "protocol": "http"},
headers={"Authorization": "Bearer " + KEY},
timeout=30,
).text.split()
drivers = []
for line in lines[:3]:
opts = webdriver.ChromeOptions()
opts.add_argument("--headless=new")
opts.add_argument("--proxy-server=http://" + line)
drivers.append(webdriver.Chrome(options=opts))
for d in drivers:
d.get("https://api.ipify.org")
print(d.page_source)
d.quit()यदि यूजरनेम·पासवर्ड प्रमाणीकरण का उपयोग करना आवश्यक है तो क्या करें?
IP ऑथराइजेशन इस्तेमाल नहीं कर सकने वाले एनवायरनमेंट, जैसे आउटगोइंग IP बदलते रहने वाले एनवायरनमेंट में दो तरीके हैं। पहला selenium-wire जैसे मिडलवेयर प्रॉक्सी लाइब्रेरी से ऑथराइजेशन इंफो डालने का तरीका है, और दूसरा उसी सर्वर पर ऑथराइजेशन के बिना लोकल रिले प्रॉक्सी चलाकर Chrome को लोकल एड्रेस से और लोकल रिले को यूजरनेम·पासवर्ड से Socks5Proxy से कनेक्ट करने का तरीका है।
दोनों विधियों में एक अतिरिक्त घटक जुड़ जाता है, जिससे प्रबंधन अधिक जटिल हो जाता है। यदि संभव हो, तो फिक्स्ड आईपी सर्वर पर आईपी प्रमाणीकरण का उपयोग करना सबसे सरल और तेज़ तरीका है।
लोकलाइज्ड ब्राउज़र एनवायरनमेंट के लिए क्या सेट करें?
IP देश के अनुसार Chrome के --lang पैरामीटर और Accept-Language सेटिंग बदलने से पेज उस देश की भाषा में खुलेगा। अगर टाइमज़ोन महत्वपूर्ण है तो CDP कमांड Emulation.setTimezoneOverride से टाइमज़ोन भी सेट कर सकते हैं।
विंडो का आकार --window-size पैरामीटर से सेट करें, और अगर मोबाइल स्क्रीन की आवश्यकता है तो मोबाइल डिवाइस एमुलेशन सेटिंग का उपयोग करें। इन मानों को देश-विशिष्ट सेटिंग्स के रूप में सेव करने से आप एक ही टेस्ट को कई देशों में सुसंगत रूप से चला सकते हैं।
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")
driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()क्या Selenium Grid या रिमोट ब्राउज़र में भी यही सेटिंग काम करती है?
हां। ChromeOptions और FirefoxOptions रिमोट एक्सेक्यूशन में भी उसी तरह पास होते हैं। webdriver.Remote में समान विकल्प डालने पर Grid नोड का ब्राउज़र उस प्रॉक्सी से कनेक्ट होता है। इस स्थिति में, IP प्रमाणीकरण के लिए पंजीकृत IP कोड को चलाने वाले PC का नहीं, बल्कि ब्राउज़र को वास्तव में चलाने वाले Grid नोड के आउटगोइंग IP का होना चाहिए।
यदि कई नोड्स हैं, तो प्रत्येक नोड के सभी IP पते रजिस्टर करें। आप अधिकतम 10 IP पते जोड़ सकते हैं। यदि क्लाउड नोड्स बार-बार बदलते हैं, तो नोड्स को फिक्स्ड IP से जोड़ना प्रबंधन को आसान बनाता है।
from selenium import webdriver
opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000") # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()कनेक्शन न होने पर क्या जांचें?
ERR_PROXY_CONNECTION_FAILED आमतौर पर गलत पते या पोर्ट के कारण होता है। सुनिश्चित करें कि आपने HTTP पते में SOCKS5 पोर्ट नहीं डाला है। यदि आपको ERR_TUNNEL_CONNECTION_FAILED मिलता है या प्रमाणीकरण विंडो दिखाई देती है, तो यह संभव है कि IP प्रमाणीकरण में पंजीकृत IP और वास्तविक आउटगोइंग IP अलग हैं। सर्वर पर cURL के माध्यम से api.ipify.org को प्रॉक्सी के बिना खोलें और आउटगोइंग IP की जांच करें, फिर उस मान को पंजीकृत करें।
क्लाउड सर्वर रीस्टार्ट करने पर आउटगोइंग IP बदल सकता है। स्थिर IP उपयोग करें, या IP बदलने पर डैशबोर्ड की पंजीकरण सूची को भी अपडेट करें।