Socks5Proxy

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 selenium

Chrome-এ 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 সেট করুন, যাতে প্রোক্সি DNS রেজোলিউশন করে।

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 তালিকা নিয়ে তিনটি ব্রাউজার আলাদা IP তে চালানোর উদাহরণ। একটি ব্রাউজার বেশি মেমরি ব্যবহার করে, তাই সার্ভার সাইজ অনুযায়ী একসাথে চালানোর সংখ্যা নির্ধারণ করুন।

লগইন সেশনের মতো ব্রাউজার দীর্ঘ সময় ব্যবহার করার জন্য একটি IP ঠিকানা নির্দিষ্ট করে রাখা ভাল, এবং কাজ শেষ না হওয়া পর্যন্ত এটি পরিবর্তন করবেন না।

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 সার্ভার থেকে IP প্রমাণীকরণ ব্যবহার করা সবচেয়ে সহজ এবং দ্রুততম পদ্ধতি।

ব্রাউজার পরিবেশ দেশ অনুযায়ী সেট করতে চান?

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 প্রায়শই পরিবর্তিত হয়, নোডে একটি স্থির 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 বদলালে ড্যাশবোর্ডের অ্যালাউড IP লিস্ট আপডেট করুন।

Selenium প্রোক্সি সেটিং, Chrome·Firefox কানেক্ট পদ্ধতি | Socks5Proxy