---
title: "Selenium Proxy Entegrasyonu"
description: "Selenium proxy ayarı için ChromeOptions ya da EdgeOptions'a --proxy-server ekleyin. Şifreli proxy için CDP yöntemi, SOCKS5, Firefox, Java ve rotasyon örnekleri."
url: https://proxynet.io/tr/blog/selenium
date: 2024-04-23
updated: 2026-09-25
author: "PXNET"
category: "Entegrasyon"
lang: tr
---

# Selenium Proxy Entegrasyonu

Selenium betiğiniz çalışıyor, ama sayfaları Almanya'daki bir ziyaretçinin gördüğü gibi görmeniz gerekiyor ya da betik, sitenin çoktan hız sınırı uyguladığı bir sunucuda çalışmak zorunda. Proxy'yi ekliyorsunuz ve karşınıza hata vermeyen boş bir sayfa çıkıyor. Sebep çoğu zaman şifredir: WebDriver standardında proxy kimlik bilgisi için bir alan yoktur, bu yüzden `user:pass@host:port` biçimindeki adres ya reddedilir ya da sessizce yok sayılır.

Bu yazıda Proxynet proxy'lerini Selenium'a nasıl entegre edeceğinizi Chrome, Edge ve Firefox için ayrı ayrı anlatıyoruz: bugün çalışan kimlik doğrulama yöntemleri, SOCKS5, HTTPS, IP rotasyonu ve hata mesajları. Python örneklerinin hepsini Windows 11 üzerinde Selenium 4.49, Chrome 154, Edge 153 ve Firefox 156 ile, kullanıcı adı ve şifre isteyen yerel bir test proxy'sine karşı çalıştırdık.

> **Not: Kısa cevap**
>
> `ChromeOptions`'a (ya da `EdgeOptions`'a) `--proxy-server=http://host:port` argümanını ekleyin ve sürücüyü bu seçeneklerle başlatın. Chrome bu adresin içine yazılan kimlik bilgilerini yok sayar. Bu yüzden ya sunucunuzun IP'sini proxy'nin izinli listesine (IP whitelist) ekleyin ya da proxy'nin `407` isteğini aşağıdaki kısa yardımcı kodla Chrome DevTools Protocol üzerinden yanıtlayın. Selenium Wire arşivlendi, Chrome 137 ve sonrası da komut satırından yüklenen eklentileri yok sayıyor; eski tarifler artık çalışmıyor.

## Selenium Nedir?

Selenium, web tarayıcılarını otomatikleştirmek için kullanılan bir otomasyon aracıdır. Özellikle web uygulamalarını test etmek için yaygın olarak kullanılır; yalnız JavaScript ile oluşan sayfalardan veri toplamak için de tercih edilir. Tarayıcıyı açmak, web sayfalarını yüklemek, tıklamak, metin girmek, form göndermek ve sayfa içeriğini okumak gibi işlemleri bir kullanıcının yapacağı şekilde yapar. Kodunuz Selenium kütüphanesini çağırır, kütüphane bir sürücüyle (ChromeDriver, msedgedriver ya da geckodriver) konuşur, sürücü de tarayıcıyı W3C WebDriver protokolüyle yönetir.

Selenium Chrome, Edge, Firefox ve Safari'yi destekler; Python, Java, C#, Ruby ve JavaScript için resmî kütüphaneleri vardır. Bu da geliştiricilere tercih ettikleri dilde çalışma esnekliği sağlar. 4.6 sürümünden beri [Selenium Manager](https://www.selenium.dev/documentation/selenium_manager/) ile birlikte gelir: kurulu tarayıcıyı bulur ve ona uygun sürücüyü kendisi indirir. Hâlâ araç seçiyorsanız [Playwright ve Selenium Farkı: Hangisini Seçmeli?](/tr/blog/playwright-vs-selenium) yazısına bakabilirsiniz.

## Selenium'da proxy nasıl çalışır?

Selenium'da proxy tek bir isteğe değil, tarayıcı oturumuna aittir:

1. Proxy'yi tarayıcı seçeneklerine yazarsınız: Chrome argümanı `--proxy-server` olarak ya da `Proxy` nesnesi olarak (WebDriver standardındaki `proxy` yeteneği).
2. Sürücü tarayıcıyı bu ayarla başlatır ve ayar `driver.quit()` çağrılana kadar bütün sekmelerde geçerli olur.
3. `https://` bir sayfa için tarayıcı proxy'ye `CONNECT host:443` gönderir ve şifreli bir tünel açar. `http://` bir sayfada ise tam adresi proxy'ye gönderir.
4. Proxy giriş istiyorsa `407 Proxy Authentication Required` ile yanıt verir. WebDriver standardının karşılamadığı adım budur.
5. Hedef site proxy'nin çıkış IP'sini görür. Başka bir proxy için yeni bir tarayıcı başlatırsınız.

Chrome kendi arka plan trafiğini de (güncellemeler, hesap servisleri) proxy üzerinden gönderir. Gigabayt başına ücretlendirilen bir pakette bu trafik de sayılır.

## Python'da Selenium ile proxy nasıl kullanılır?

**Adım 1: Selenium Kurulumu.** Öncelikle Python kurulu olmalı; Selenium 4.49, Python 3.10 ya da daha yeni bir sürüm ister. Selenium kütüphanesini şu komutla yükleyebilirsiniz:

```bash
pip install selenium
```

**Adım 2: Proxy Sunucusu Edinme.** [Proxy sayfasından](/tr/proxy) size uygun ürünü seçin. Proxynet panelindeki Endpoint Oluşturucu size gateway adresini, portu ve seçtiğiniz ülke, şehir ve oturumu taşıyan bir kullanıcı adını verir. HTTP ve SOCKS5 aynı gateway'de ayrı portları kullanır.

**Adım 3: Selenium WebDriver.** Bu yazının eski sürümünde ChromeDriver'ı elle indirip `executable_path` ile vermeniz gerektiği yazıyordu. O parametre artık yok: Selenium Manager sürücüyü ilk çalıştırmada kendisi indirir. Makinenin internete çıkmak için proxy'ye ihtiyacı varsa, Selenium Manager'ın indirmeleri için `SE_PROXY` ortam değişkenini tanımlayın.

**Adım 4: Selenium ile Proxy Entegrasyonu.** Şifre istemeyen bir proxy için (aşağıda anlatılan IP whitelist yöntemi) tarayıcıyı proxy ile şöyle başlatırsınız:

```python
from selenium import webdriver
from selenium.webdriver.common.by import By

PROXY = "http://pr.proxynet.io:8000"

options = webdriver.ChromeOptions()
options.add_argument(f"--proxy-server={PROXY}")
options.add_argument("--headless")  # tarayıcıyı izlemek için bu satırı kaldırın

driver = webdriver.Chrome(options=options)
try:
    driver.get("https://api.ipify.org/?format=json")
    print(driver.find_element(By.TAG_NAME, "body").text)  # {"ip": "<çıkış IP'si>"}
finally:
    driver.quit()
```

Ekrana basılan IP, proxy'nin çıkış IP'si olmalıdır. Selenium'un `Proxy` nesnesi de aynı işi görür (`options.proxy = Proxy({"proxyType": ProxyType.MANUAL, "httpProxy": "host:port", "sslProxy": "host:port"})`); testimizde iki biçim de trafiği aynı şekilde proxy'ye yönlendirdi.

## Selenium'da kullanıcı adı ve şifreli proxy nasıl kullanılır?

[W3C WebDriver proxy tanımında](https://www.w3.org/TR/webdriver2/#proxy) proxy adresleri için alanlar var, ama kullanıcı adı ya da şifre için yok. [Chromium'un proxy dokümanı](https://chromium.googlesource.com/chromium/src/+/HEAD/net/docs/proxy.md) da Chrome'un proxy ayarlarına gömülen kimlik bilgilerini kullanmadığını söylüyor. `--proxy-auth` diye bir argüman da yok; bu yazının eski kodu böyle bir argüman kullanıyordu. Giriş isteyen bir proxy'ye karşı yaptığımız testler:

| Ne denedik | Ne oldu |
|---|---|
| `--proxy-server=http://host:port`, kimlik bilgisi yok | Proxy `407` döndü; istisna yok, boş sayfa |
| `--proxy-server=http://user:pass@host:port` | `ERR_NO_SUPPORTED_PROXIES` hata sayfası, istisna yok |
| `Proxy` nesnesinde `user:pass@host:port` | Sayfa açıldı, ama Chrome proxy'yi atlayıp doğrudan bizim IP'mizle bağlandı |
| Selenium BiDi `driver.network.add_auth_handler()`, Chrome | İsteği yanıtlarken `Invalid InterceptionId`, ardından zaman aşımı |
| CDP `Fetch.continueWithAuth` (aşağıdaki yardımcı) | Chrome 154 ve Edge 153'te çalıştı |
| Girişsiz port (IP whitelist) | Çalıştı |

Tehlikeli olan üçüncü satırdır: betik çalışıyor gibi görünür, oysa trafik proxy'den hiç geçmez.

### 1. yol: IP whitelist

Betiği çalıştıran makinenin genel (public) IP'sini proxy'nin izinli listesine ekleyin; proxy artık şifre sormaz. Adım 4'teki kod olduğu gibi çalışır, Edge ve Firefox sürümleri de öyle. Proxynet en fazla 10 IP kabul eder. Bu yöntem sabit IP'li bir sunucuya uyar, IP'si sürekli değişen bir dizüstü bilgisayara uymaz. Ayrıntılar: [Proxy Kimlik Doğrulama: User:Pass ve IP Whitelist](/tr/blog/proxy-authentication-methods).

### 2. yol: 407'yi Chrome DevTools Protocol üzerinden yanıtlamak

Chrome ve Edge, [DevTools Protocol'de Fetch alanını](https://chromedevtools.github.io/devtools-protocol/tot/Fetch/) sunar. `handleAuthRequests` açıkken tarayıcı kimlik bilgisi isteyen bir isteği bekletir ve `Fetch.authRequired` olayını gönderir; bu olayın `source` değeri `Server` ya da `Proxy` olur. Aşağıdaki yardımcı yalnız proxy'den gelen istekleri yanıtlar. Kullandığı `websocket-client` paketi Selenium ile birlikte kurulur.

```python
# proxy_auth.py
import json
import threading
import urllib.request

import websocket  # selenium ile birlikte kurulur (websocket-client)

def attach_proxy_auth(driver, username, password):
    """Sekmedeki proxy 407 isteklerini Chrome DevTools Protocol üzerinden yanıtlar."""
    caps = driver.capabilities
    vendor = caps.get("goog:chromeOptions") or caps.get("ms:edgeOptions")  # Chrome ya da Edge
    address = vendor["debuggerAddress"]
    with urllib.request.urlopen(f"http://{address}/json") as resp:
        targets = json.load(resp)
    page = next(t for t in targets if t["type"] == "page")
    ws = websocket.create_connection(page["webSocketDebuggerUrl"], suppress_origin=True)

    counter = {"id": 0}

    def send(method, params=None):
        counter["id"] += 1
        ws.send(json.dumps({"id": counter["id"], "method": method, "params": params or {}}))

    def listen():
        while True:
            try:
                msg = json.loads(ws.recv())
            except Exception:
                return  # tarayıcı kapatıldı
            method = msg.get("method")
            params = msg.get("params", {})
            if method == "Fetch.requestPaused":
                send("Fetch.continueRequest", {"requestId": params["requestId"]})
            elif method == "Fetch.authRequired":
                if params["authChallenge"]["source"] == "Proxy":
                    answer = {"response": "ProvideCredentials",
                              "username": username, "password": password}
                else:
                    answer = {"response": "Default"}  # sitenin kendi giriş ekranını yanıtlamak bize düşmez
                send("Fetch.continueWithAuth", {"requestId": params["requestId"],
                                                "authChallengeResponse": answer})

    send("Fetch.enable", {"handleAuthRequests": True})
    while json.loads(ws.recv()).get("id") != counter["id"]:
        pass  # ilk driver.get() çağrısından önce yakalamanın açılmasını bekle
    threading.Thread(target=listen, daemon=True).start()
    return ws
```

Kullanmak için sürücü başladıktan sonra tek satır yeterlidir:

```python
from selenium import webdriver
from proxy_auth import attach_proxy_auth

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://pr.proxynet.io:8000")
driver = webdriver.Chrome(options=options)
attach_proxy_auth(driver, "user", "pass")
driver.get("https://api.ipify.org/?format=json")
```

Sınırlar: yardımcı yalnız bağlandığı sekmeyi kapsar, yeni açılan bir pencere onsuz başlar. Şifre yanlışsa Chrome `ERR_TOO_MANY_RETRIES` gösterir.

### Selenium Wire ve proxy eklentileri ne durumda?

[Selenium Wire deposu](https://github.com/wkeeling/selenium-wire) 3 Ocak 2024'te arşivlendi. Temiz bir Python 3.13 ortamında `from seleniumwire import webdriver` satırı bizde `ModuleNotFoundError: No module named 'pkg_resources'` hatasıyla durdu. Kimlik doğrulama eklentileri `--load-extension` anahtarına dayanıyordu; resmî Chrome sürümleri 137'den itibaren bu anahtarı yok sayıyor, yalnız Chrome for Testing ve Chromium hâlâ kabul ediyor. SeleniumBase ise `proxy="user:pass@host:port"` değerini kabul eder ve girişi kendisi halleder: [SeleniumBase ile Proxy Nasıl Kullanılır?](/tr/blog/seleniumbase-ile-proxy)

## Selenium'da hangi proxy yöntemini kullanmalısınız?

| Yöntem | Chrome / Edge | Firefox | Şifre | 2026'daki durumu |
|---|---|---|---|---|
| `--proxy-server` argümanı | Evet | Hayır, tercihleri kullanın | Hayır | Güncel |
| `Proxy` nesnesi | Evet | Evet | Yok sayılır | Güncel |
| IP whitelist | Evet | Evet | Gerekmez | Güncel |
| CDP yardımcısı | Evet | Hayır | Evet | Test edildi, çalışıyor |
| BiDi `add_auth_handler` | Chrome'da başarısız | Giriş penceresi hatası | Teoride | Henüz güvenilir değil |
| Selenium Wire | Import başarısız | Import başarısız | Evet | Arşivlendi |
| Kimlik doğrulama eklentisi | Yalnız Chrome for Testing | Ayrı biçim | Evet | Chrome 137+ ile bozuk |

## Selenium'da Microsoft Edge için proxy nasıl ayarlanır?

Edge Chromium tabanlıdır; bu yüzden `EdgeOptions` aynı argümanı alır, msedgedriver'ı da Selenium Manager indirir:

```python
from selenium import webdriver

options = webdriver.EdgeOptions()
options.add_argument("--proxy-server=http://pr.proxynet.io:8000")
driver = webdriver.Edge(options=options)
```

CDP yardımcısı Edge ile de çalışır: Edge 153'te, şifreli test proxy'siyle sayfa proxy üzerinden açıldı.

## Selenium'da Firefox ile proxy nasıl ayarlanır?

Firefox `--proxy-server` argümanını okumaz. Ya ağ tercihlerini (preferences) ayarlarsınız ya da `Proxy` nesnesini verirsiniz; geckodriver bu nesneyi aynı tercihlere çevirir. Test makinemizde Firefox kurulu değildi; Selenium Manager ilk çalıştırmada Firefox 156'yı indirdi.

```python
from selenium import webdriver

options = webdriver.FirefoxOptions()
options.set_preference("network.proxy.type", 1)  # 1 = elle yapılandırma
options.set_preference("network.proxy.http", "pr.proxynet.io")
options.set_preference("network.proxy.http_port", 8000)
options.set_preference("network.proxy.ssl", "pr.proxynet.io")  # https:// sayfalar için kullanılır
options.set_preference("network.proxy.ssl_port", 8000)
driver = webdriver.Firefox(options=options)
```

SOCKS5 için `network.proxy.socks`, `network.proxy.socks_port` tercihlerini ayarlayın ve `network.proxy.socks_version` değerini `5` yapın. Firefox bu durumda alan adını proxy'ye gönderir, çünkü `network.proxy.socks5_remote_dns` varsayılan olarak açıktır. Pek çok eğitimde hâlâ geçen eski `network.proxy.socks_remote_dns` tercihi Firefox 156'da SOCKS5 için hiçbir şey değiştirmedi; `socks5_remote_dns` değerini `False` yaptığımızda ise Firefox adları yerelde çözdü. Firefox'ta proxy kimlik bilgisi için bir tercih yoktur ve CDP yardımcısı Firefox'a uygulanmaz. Selenium'un BiDi `add_auth_handler` yöntemi kimlik bilgilerimizi gönderdi, ama proxy giriş penceresi yüzünden sayfa yüklemesi yine `UnexpectedAlertPresentException` ile düştü. Firefox'ta IP whitelist kullanın.

## Selenium SOCKS5 proxy kullanabilir mi?

Şifresiz olarak evet: `--proxy-server=socks5://host:port`. Testimizde Chrome alan adını yerelde çözmek yerine proxy'ye gönderdi; Chromium dokümanı da SOCKS5 ile ad çözümlemenin her zaman proxy tarafında yapıldığını doğruluyor.

Şifreyle hayır: Chromium SOCKS5 kimlik doğrulamasını desteklemiyor ve `driver.get()` çağrısı `net::ERR_SOCKS_CONNECTION_FAILED` hatası verdi. CDP yardımcısı da işe yaramaz, çünkü SOCKS'ta yanıtlanacak bir `407` yoktur. SOCKS5 portunu IP whitelist ile, ya da HTTP portunu yardımcıyla kullanın. Daha fazlası için [SOCKS5 Proxyler Nedir?](/tr/blog/socks5-proxy-101) ve [SOCKS ve HTTP Proxy Farkı](/tr/blog/socks-vs-http-proxy) yazılarına bakın. Proxynet'in [SOCKS5 Proxy](https://proxynet.io/tr/socks5-proxy) hizmeti aynı gateway'in kendi portunda çalışır.

## Selenium proxy üzerinden HTTPS sitelerle çalışır mı?

Evet. Sayfaların hepsi `https://` olsa bile proxy adresi `http://` şemasıyla kalır: tarayıcı bir `CONNECT` tüneli açar ve TLS şifrelemesi tarayıcı ile site arasında uçtan uca sürer. Proxy sunucu adını görür, içeriği görmez. `Proxy` nesnesinin `httpProxy` yanında `sslProxy` de istemesinin sebebi budur; yalnız `httpProxy` verdiğimizde `https://` sayfalarımız proxy'siz, doğrudan gitti.

`--proxy-server` içindeki `https://` şeması ise proxy'ye giden bağlantının kendisini şifreler; bkz. [HTTPS Proxy](https://proxynet.io/tr/https-proxy).

## Java kullanarak proxy'leri Selenium ile nasıl entegre edebilirim?

Java aynı `Proxy` nesnesini kullanır. Bu yazıdaki eski örnek `user:pass@` bilgisini `setHttpProxy` içine yazıyordu; testimizde bu ayar Chrome'un proxy'yi atlamasına yol açtı. Bu yüzden düzeltilmiş sürüm IP whitelist'e dayanıyor. `System.setProperty("webdriver.chrome.driver", …)` satırı da çıkarıldı, çünkü sürücüyü Selenium Manager buluyor. Selenium 4, Java 11 ya da daha yeni bir sürüm ister.

```java
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class SeleniumProxyExample {
    public static void main(String[] args) {
        // Burada kimlik bilgisi yok: makinenin IP'si proxy'nin izinli listesinde (whitelist)
        String proxyAddress = "pr.proxynet.io:8000";

        Proxy proxy = new Proxy();
        proxy.setHttpProxy(proxyAddress);
        proxy.setSslProxy(proxyAddress);

        ChromeOptions options = new ChromeOptions();
        options.setProxy(proxy);

        // Selenium Manager uygun ChromeDriver'ı bulur ya da indirir
        WebDriver driver = new ChromeDriver(options);
        try {
            driver.get("https://api.ipify.org/?format=json");
            System.out.println(driver.getPageSource());
        } finally {
            driver.quit();
        }
    }
}
```

Python'daki argümanın Java karşılığı `options.addArguments("--proxy-server=http://pr.proxynet.io:8000")` satırıdır. Bu örneği Selenium dokümanına göre yazdık ve çalıştırmadık, çünkü test makinesinde yalnız Java 8 var.

## Selenium'da residential proxy rotasyonu nasıl yapılır?

Proxy bir tarayıcının ömrü boyunca sabittir; bu yüzden IP değiştirmek yeni bir tarayıcı başlatmak demektir:

- **Dönen (rotating) gateway.** [Rotating Proxy](https://proxynet.io/tr/rotating-proxy) ile çıkış IP'si gateway tarafında değişir, kodunuz tek adresle çalışmaya devam eder. Bir sayfa yüklemesinin bağlantıları farklı IP'lerden çıkabilir: ürün listeleri için sorun olmaz, bir giriş akışı için olur.
- **Sticky oturum.** [Sticky Proxy](https://proxynet.io/tr/sticky-proxy) ile IP 1 ila 60 dakika aynı kalır. Her tarayıcıya Endpoint Oluşturucu'dan ayrı bir oturum kullanıcı adı verin: bir tarayıcı, bir oturum, bir çıkış IP'si.

İki yöntem de [Residential Proxy](https://proxynet.io/tr/residential-proxy) IP'leriyle çalışır. Ayrıntılar: [IP Rotasyonu Nedir ve Nasıl Çalışır?](/tr/blog/ip-rotation-explained) ve [Python'da Proxy'ler Nasıl Döndürülür?](/tr/blog/rotating-proxy-python)

## Tam örnek: yeniden deneyen paralel tarayıcılar

Aşağıdaki betik, alıştırma sitesi quotes.toscrape.com'un JavaScript ile oluşan altı sayfasını okur. Aynı anda üç Chrome çalıştırır, her denemede yeni bir tarayıcı başlatır, trafikten tasarruf için görselleri engeller ve geçici hataları artan beklemeyle yeniden dener. Yeniden denemenin düzeltemeyeceği hatalar, yalnız Chrome'un hata sayfasında görünenler dahil, görevi hemen durdurur.

```python
import random
import re
import time
from concurrent.futures import ThreadPoolExecutor, as_completed

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, WebDriverException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

from proxy_auth import attach_proxy_auth

PROXY_SERVER = "http://pr.proxynet.io:8000"
PROXY_USER = "user"
PROXY_PASS = "pass"
URLS = [f"https://quotes.toscrape.com/js/page/{n}/" for n in range(1, 7)]
WORKERS = 3  # aynı anda açık tarayıcı sayısı
ATTEMPTS = 3
# Bunları yeniden deneme düzeltmez: önce adresi, portu ve kimlik bilgilerini kontrol edin
FATAL = ("ERR_PROXY_CONNECTION_FAILED", "ERR_NO_SUPPORTED_PROXIES",
         "ERR_SOCKS_CONNECTION_FAILED", "ERR_TOO_MANY_RETRIES")

def new_driver():
    options = webdriver.ChromeOptions()
    options.add_argument(f"--proxy-server={PROXY_SERVER}")
    options.add_argument("--headless")
    # Görselleri atla: proxy'den daha az trafik geçer
    options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
    driver = webdriver.Chrome(options=options)
    driver.set_page_load_timeout(30)
    attach_proxy_auth(driver, PROXY_USER, PROXY_PASS)
    return driver

def scrape(url):
    for attempt in range(ATTEMPTS):
        driver = new_driver()  # her denemede yeni tarayıcı ve yeni proxy bağlantısı
        try:
            driver.get(url)
            # Bazı proxy hataları istisna fırlatmadan Chrome'un hata sayfasını açar
            if driver.execute_script("return document.body.className") == "neterror":
                code = re.search(r"ERR_[A-Z_]+", driver.page_source)
                raise WebDriverException(code.group(0) if code else "Chrome error page")
            WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, "div.quote span.text"))
            )
            quotes = driver.find_elements(By.CSS_SELECTOR, "div.quote span.text")
            return url, [q.text for q in quotes]
        except (TimeoutException, WebDriverException) as exc:
            if any(code in str(exc) for code in FATAL) or attempt == ATTEMPTS - 1:
                raise
            time.sleep(2**attempt + random.random())  # rastgele sapmalı üstel bekleme
        finally:
            driver.quit()

with ThreadPoolExecutor(max_workers=WORKERS) as pool:
    futures = [pool.submit(scrape, url) for url in URLS]
    for future in as_completed(futures):
        try:
            url, quotes = future.result()
            print(f"{url}: {len(quotes)} quotes")
        except Exception as exc:
            print("failed:", str(exc).splitlines()[0])
```

Altı sayfanın hepsi 10'ar alıntı döndürdü; toplam süre yaklaşık 22 saniyeydi. Kapalı bir port her görevi `net::ERR_PROXY_CONNECTION_FAILED` ile, yanlış şifre ise `ERR_TOO_MANY_RETRIES` ile durdurdu. Worker sayısını makul tutun: her worker tam bir Chrome'dur ve çok sayıda paralel oturum [429 Too Many Requests](/tr/blog/http-429-too-many-requests) hatasına yol açar.

## Selenium'un proxy'yi gerçekten kullandığı nasıl kontrol edilir?

Proxy'li tarayıcıda `api.ipify.org` gibi IP'nizi gösteren bir sayfa açın ve sonucu kendi IP'nizle karşılaştırın. İkisi aynıysa trafik proxy'den geçmiyordur. Panelinizde de trafik görünmelidir. WebRTC yerel IP'nizi yine de açığa çıkarabilir; bkz. [WebRTC ve DNS Sızıntısı Nedir, Nasıl Önlenir?](/tr/blog/webrtc-dns-leak) Adım adım bir kontrol için [Proxy Çalışıyor mu? Proxy Nasıl Test Edilir?](/tr/blog/how-to-test-a-proxy), terminalden tek satırlık kontrol için [cURL ile Proxy Nasıl Kullanılır?](/tr/blog/curl-proxy) yazısına bakabilirsiniz.

## Sık görülen Selenium proxy hataları ve çözümleri

Aşağıdaki mesajlar testlerimizden geliyor. Chrome hata kodları ya istisnanın içinde (`unknown error: net::ERR_…`) ya da yalnız hata sayfasında görünür.

| Mesaj | Sebep | Çözüm |
|---|---|---|
| Boş sayfa, boş `driver.title`, istisna yok | Proxy `407` döndü, kimlik bilgisi gönderilmedi | IP'yi whitelist'e ekleyin ya da CDP yardımcısını kullanın |
| `ERR_NO_SUPPORTED_PROXIES` (hata sayfası) | Kimlik bilgisi `--proxy-server` içinde | Argümandan `user:pass@` kısmını çıkarın |
| `net::ERR_PROXY_CONNECTION_FAILED` | O adres ve portta dinleyen bir şey yok | Adresi, portu ve güvenlik duvarını kontrol edin |
| `net::ERR_TUNNEL_CONNECTION_FAILED` | Proxy tüneli açamadı | Önce hedef sunucuyu, sonra proxy'yi kontrol edin |
| `net::ERR_SOCKS_CONNECTION_FAILED` | SOCKS5 proxy şifre istiyor | Yardımcıyla HTTP portu ya da whitelist |
| `ERR_TOO_MANY_RETRIES` (hata sayfası) | Proxy yardımcının gönderdiği kimlik bilgilerini reddetti | Kullanıcı adını ve şifreyi yeniden kopyalayın |
| `TypeError: WebDriver.__init__() got an unexpected keyword argument 'executable_path'` | Selenium 3 kodu | Parametreyi silin; sürücüyü Selenium Manager bulur |
| `… unexpected keyword argument 'chrome_options'` | Aynı sorun, eski ad | `options=` kullanın |
| `Timed out receiving message from renderer` | Bir sayfa yüklemesi hiç bitmedi | Proxy'yi kontrol edin, sonra yeniden deneyin |

Düz Python HTTP istemcilerinin bağlantı hataları [Max Retries Exceeded With URL Hatası Nedir, Nasıl Çözülür?](/tr/blog/max-retries-exceeded-with-url) yazısında satır satır okunuyor.

## Kullanım alanları

- **Fiyat takibi:** JavaScript ağırlıklı mağazaları sattığınız pazardan görmek için: [rakip fiyat takibi](/tr/blog/competitor-price-tracking) ve [fiyat izleme](/tr/price-monitoring).
- **Yerelleştirme ve QA:** yayın öncesi kendi sitenizi birkaç ülkeden açmak için, bkz. [uygulama testi](/tr/app-testing).
- **Reklam doğrulama:** reklamlarınızı ödeme yaptığınız bölgelerde kontrol etmek için, bkz. [reklam doğrulama](/tr/ad-verification).
- **Veri toplama:** JavaScript gerektiren sayfalardan: [veri kazıma](/tr/data-scraping).

Proxy isteğin nereden geldiğini değiştirir, sitenin neye izin verdiğini değiştirmez. Sitenin [robots.txt](/tr/blog/robots-txt) dosyasını ve kullanım şartlarını okuyun, istek hızını düşük tutun ve varsa resmî API'yi tercih edin. Proxy otomasyonu da gizlemez: WebDriver kontrolündeki bir tarayıcı, standardın gereği olarak `navigator.webdriver` değerini `true` bildirir.

## Karar rehberi

| İhtiyaç | Öneri |
|---|---|
| Sabit IP'li sunucu | IP whitelist + `--proxy-server`, kodda şifre yok |
| IP'si değişen dizüstü bilgisayar ya da CI makinesi | HTTP portu + CDP yardımcısı |
| Firefox | Ağ tercihleri + IP whitelist |
| SOCKS5 | `--proxy-server` içinde `socks5://`, yalnız whitelist ile |
| Giriş ya da ödeme akışı | Sticky oturum, oturum başına bir tarayıcı |
| Birbirinden bağımsız çok sayıda sayfa | Dönen (rotating) gateway |
| Tek tarayıcıda her sayfaya farklı proxy | Playwright'ın context başına proxy'si, bkz. [Playwright Nedir ve Proxy ile Nasıl Kullanılır?](/tr/blog/playwright-proxy) |

## Sıkça sorulan sorular

### Selenium kullanıcı adı ve şifreli proxy kullanabilir mi?

Standart seçeneklerle hayır, çünkü bu seçeneklerde kimlik bilgisi alanı yok. Chrome ve Edge'de bu yazıdaki DevTools yardımcısı proxy'nin `407` isteğini yanıtlar. Hangi tarayıcı olursa olsun IP whitelist şifre ihtiyacını ortadan kaldırır.

### Selenium Wire 2026'da hâlâ çalışıyor mu?

3 Ocak 2024'te arşivlendi. Temiz bir Python 3.13 ortamında bizde import edilemedi, çünkü güncel setuptools sürümlerinin artık içermediği `pkg_resources` modülüne dayanıyor. Yardımcıyı ya da whitelist'i kullanın.

### Tarayıcıyı yeniden başlatmadan proxy nasıl değiştirilir?

Proxy oturum başlarken sabitlenir: `driver.quit()` çağırın ve yeni bir sürücü başlatın. Tek tarayıcıda her sayfaya yeni IP istiyorsanız dönen bir gateway kullanın ya da context başına proxy alan Playwright'a geçin.

### Proxy headless modda çalışır mı?

Evet. `--proxy-server` ve CDP yardımcısı `--headless` ile de, onsuz da aynı davranır; bu yazıdaki örneklerin hepsi headless çalıştı.

### Selenium'da kimlik doğrulamalı SOCKS5 proxy kullanabilir miyim?

Chrome ve Edge'de hayır, ikisi de SOCKS5 kimlik doğrulamasını desteklemiyor. Firefox 156 da SOCKS5 el sıkışmasında proxy'mize yalnız şifresiz yöntemi önerdi. SOCKS5'i whitelist ile, şifreli kullanım için HTTP portunu tercih edin.

### Site neden hâlâ gerçek IP'mi gösteriyor?

Genellikle proxy hiç uygulanmamıştır: `Proxy` nesnesine yazılan kimlik bilgileri Chrome'un doğrudan bağlanmasına yol açar, `sslProxy` içermeyen bir `Proxy` nesnesi de `https://` sayfaları proxy'siz bırakır. IP doğru ama konum yanlış görünüyorsa WebRTC sızıntısını test edin.

## Özet

Selenium proxy'yi tarayıcı oturumu başına bir kez ayarlar: Chrome ve Edge için `--proxy-server`, Firefox için tercihler ya da `Proxy` nesnesi. Kimlik doğrulama için IP whitelist kullanın ya da Chrome ve Edge'de `407` isteğini yanıtlayan DevTools yardımcısını çalıştırın; Selenium Wire ve komut satırından yüklenen eklentiler ise artık çalışmıyor. SOCKS5 yalnız şifresiz çalışır, IP rotasyonu da IP ya da oturum başına bir tarayıcı demektir. Kurulum hazır olduğunda [Proxynet proxy sayfasından](/tr/proxy) bir paket seçin ve gateway bilgilerini Endpoint Oluşturucu'dan alın.
