Selenium proxy ayarları, Chrome ve Firefox'a SOCKS5·HTTP proxy bağlantısı kurma
Bu rehber, Selenium 4 ile Chrome ve Firefox'u çalıştırırken Socks5Proxy'nin HTTP ve SOCKS5 proxy'lerini bağlama yöntemini ve Chrome çalıştırma argümanlarının proxy şifresini kabul etmediği için IP yetkilendirmesi kullanma ayarını açıklar.
Selenium'da proxy kimlik doğrulaması neden zordur?
Chrome --proxy-server başlatma argümanı ile proxy adresini kabul eder, ancak adres içindeki kullanıcı adı ve şifreyi kabul etmez. Kullanıcı adı ve şifre gerektiren bir proxy'ye bağlanırsa tarayıcı bir kimlik doğrulama penceresi açar, Selenium ile bu pencereye değer girmek zordur.
En temiz çözüm IP yetkilendirmedir. Panoya Selenium'un çalıştığı sunucu veya bilgisayarın IPv4'sini kaydederseniz, proxy bu IP'nin bağlantısını kullanıcı adı ve şifre olmadan kabul eder. Böylece Chrome'a sadece ip:port yazmanız yeterlidir. En fazla 10 IP kaydedebilirsiniz, böylece birden çok sunucudan birlikte kullanabilirsiniz.
Örnekte IP 198.51.100.23, HTTP port 8000 ve SOCKS5 port 1080 kullanılmaktadır.
pip install seleniumChrome'da HTTP proxy nasıl bağlanır?
IP yetkilendirmeyi kaydettikten sonra ChromeOptions'a --proxy-server argümanı olarak adresi ekleyin. Selenium 4.6 ve üzeri Selenium Manager doğru chromedriver'ı otomatik indirir, ayrıca kurmaya gerek yoktur.
Headless modda da aynı parametreler geçerlidir. Bağlantıyı kontrol etmek için IP kontrol adresini açın ve ekrandaki IP'nin proxy IP'si olup olmadığını görün.
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'da SOCKS5 proxy nasıl kullanılır?
--proxy-server'e socks5:// adresini girmeniz yeterli. Chrome, SOCKS5 kullanırken alan adı çözümlemesini proxy tarafında yapar, ancak bazı ortamlarda yerel DNS çözümlemesi kalabilir, bu nedenle --host-resolver-rules argümanıyla yerel ad çözümlemesini engellemek yaygın olarak kullanılır.
SOCKS5 için de IP yetkilendirme kullanın. Chrome, SOCKS proxy'ler için kullanıcı adı ve şifre kimlik doğrulamasını desteklemez.
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'a nasıl bağlanır?
Firefox tercihler aracılığıyla proxy belirleyebilir. network.proxy.type'ı 1(manuel) olarak ayarlayın ve HTTP veya SOCKS adresi ile portunu girin. SOCKS5 için network.proxy.socks_version'ı 5, network.proxy.socks_remote_dns'i True olarak ayarlayın.
Firefox'ta da başlatma ayarları ile proxy şifresi girme yöntemi olmadığından IP yetkilendirme kullanmak en basit çözümdür.
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()Farklı IP'lerle birden fazla tarayıcı nasıl açılır?
Her tarayıcıya farklı proxy adresi ekleyerek ayrı ayrı çalıştırabilirsiniz. Aşağıdaki kod, API ile ip:port listesini alarak 3 tarayıcıyı farklı IP'lerle açan bir örnektir. Bir tarayıcı çok fazla bellek kullandığından, sunucu boyutuna göre aynı anda açılacak sayıyı belirleyin.
Giriş oturumu gibi uzun süreli bir tarayıcı kullanımı için bir IP'yi sabitleyip işlem bitene kadar değiştirmemek iyi bir fikirdir.
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()Kullanıcı adı/şifre ile kimlik doğrulama kullanmak zorundaysanız ne yapmalısınız?
IP yetkilendirme kullanılamayan ortamlarda, örneğin çıkış IP'si sürekli değişen ortamlarda iki yöntem vardır. Birincisi selenium-wire gibi ara proxy kütüphaneleriyle kimlik bilgilerini eklemek, ikincisi aynı sunucuda kimlik doğrulamasız yerel ara proxy çalıştırıp Chrome'u yerel adrese, yerel ara proxy'yi kullanıcı adı·şifreyle Socks5Proxy'e bağlamaktır.
Her iki yöntem de bir bileşen daha ekleyerek yönetilecek şeyleri artırır. Mümkünse sabit IP sunucusunda IP yetkilendirme kullanmak en basit ve hızlı yöntemdir.
Tarayıcı ortamını o ülkeye göre ayarlamak için ne yapmalıyım?
IP ülkesine göre Chrome'un --lang argümanını ve Accept-Language ayarını değiştirirseniz sayfa o ülkenin dilinde açılır. Zaman dilimi önemli siteler için CDP komutu Emulation.setTimezoneOverride ile zaman dilimini de ayarlayabilirsiniz.
Pencere boyutunu --window-size argümanı ile ayarlayın, mobil ekran gerekiyorsa mobil cihaz taklidi ayarlarını kullanın. Bu değerleri ülkeye özgü ayar grupları halinde oluşturursanız, aynı testi birden çok ülkede tutarlı bir şekilde çalıştırabilirsiniz.
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 veya uzak tarayıcılarda da aynı ayarlar kullanılır mı?
Evet. ChromeOptions ve FirefoxOptions uzaktan çalıştırmada da aynen geçerlidir. webdriver.Remote'a aynı seçenekleri eklerseniz Grid node'daki tarayıcı bu proxy üzerinden bağlanır. IP yetkilendirmede kaydedilecek IP, kodu çalıştıran PC değil tarayıcının çalıştığı Grid node'un çıkış IP'sidir.
Birden fazla düğüm varsa, her düğümün IP'sini kaydedin. En fazla 10 IP ekleyebilirsiniz. Bulut düğümlerinizin IP'si sık değişiyorsa, sabit IP kullanmak yönetimi kolaylaştırır.
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()Bağlantı olmuyorsa ne kontrol edilmeli?
ERR_PROXY_CONNECTION_FAILED genellikle yanlış adres veya port nedeniyle oluşur. HTTP adresine SOCKS5 portu eklenmediğinden emin olun. ERR_TUNNEL_CONNECTION_FAILED alıyorsanız veya kimlik doğrulama penceresi açılıyorsa, IP yetkilendirmeye kayıtlı IP ile gerçek çıkış IP'niz farklı olabilir. Sunucuda cURL ile api.ipify.org'u proxy olmadan açarak çıkış IP'nizi kontrol edin ve bu değeri kaydedin.
Bulut sunucular yeniden başlatıldığında giden IP değişebilir. Sabit IP kullanın veya IP değiştiğinde kontrol panelindeki kayıtlı listeyi de güncelleyin.