Skip to main content
Scraper API

How to Use Proxies with Selenium: The Complete 2026 Guide

7 min read

How to Use Proxies with Selenium

In the landscape of web scraping in 2025, relying on a single IP address is a recipe for failure. Modern anti-bot systems track IP frequency, request headers, and browser fingerprints. Integrating proxies with Selenium is the standard solution to these problems. This guide provides a technical deep dive into configuring HTTP, HTTPS, and SOCKS proxies in Selenium, handling authentication, and managing rotation.

---

Understanding Selenium Proxy Architecture

Selenium itself is just a bridge to a browser (Chrome, Firefox, Edge, etc.). It does not route traffic itself; rather, it instructs the browser on how to route traffic. Therefore, configuring a proxy in Selenium is technically an exercise in configuring the underlying browser's settings via code.

Why Proxy Integration is Critical

1. IP Rotation: Avoiding rate limits and bans by distributing requests across multiple IPs. 2. Geo-Targeting: Accessing location-specific content by using residential or mobile proxies in target regions. 3. Load Distribution: Reducing the load on a single server by balancing requests. 4. Stealth: Masking your true identity (datacenter IP) behind residential proxies to look like a real user.

---

Method 1: Selenium with Chrome (HTTP/HTTPS Proxies)

The most common use case involves using a rotating datacenter or residential proxy. Chrome makes this straightforward via command-line arguments.

Basic Configuration (Python)

You can set a proxy directly using the --proxy-server argument. This handles both HTTP and HTTPS traffic.

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

1. Setup Chrome Options

chrome_options = Options()

2. Define the proxy (IP:PORT)

Replace with your actual proxy IP and port

proxy_address = "192.168.1.10:8080"

3. Add the argument to Chrome

chrome_options.add_argument(f'--proxy-server={proxy_address}')

4. Ignore certificate errors (common with cheap proxies)

chrome_options.add_argument('--ignore-certificate-errors')

5. Launch the driver

driver = webdriver.Chrome(options=chrome_options)

Verification

print("Verifying IP address...") driver.get("https://httpbin.org/ip") print(driver.page_source) driver.quit()

Using Capabilities (Alternative Approach)

While command-line arguments work, defining DesiredCapabilities is the "classic" Selenium way. However, in Selenium 4, this is deprecated in favor of Options. The code below demonstrates how to structure it if you need specific protocol exclusion (e.g., bypass proxy for localhost).

---

Method 2: Handling SOCKS Proxies (Chrome)

SOCKS proxies (specifically SOCKS5) are preferred for high-performance scraping or when accessing content behind firewalls that block HTTP proxies. The syntax differs slightly.

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

opts = Options()

Note the protocol prefix

opts.add_argument('--proxy-server=socks5://127.0.0.1:9050')

driver = webdriver.Chrome(options=opts) driver.get("https://www.google.com")

*Note: Ensure your proxy provider supports SOCKS5 traffic, as not all do.*

---

Method 3: Selenium Wire (Advanced Interception)

This is the 2025 expert recommendation.

Standard Selenium has a significant limitation: it cannot handle username/password authentication natively. If you run a script with a protected proxy, the browser will pop up a dialog asking for a password, which will crash your script or cause it to hang.

Selenium-Wire extends Selenium's Python bindings to give you access to the underlying requests and responses. It allows you to inject headers (including Proxy-Authorization) before the browser ever makes the request.

Installation

pip install selenium-wire

Implementation

from seleniumwire import webdriver  # Import from seleniumwire, not selenium

1. Setup Proxy Configuration

proxy_options = { 'proxy': { 'https': 'https://user:pass@ip:port', # Supports auth directly in URL 'http': 'https://user:pass@ip:port', # or 'socks5://...' } }

2. Initialize Driver with options

driver = webdriver.Chrome(seleniumwire_options=proxy_options)

3. Run your script

driver.get('https://httpbin.org/ip') print(f"Current IP: {driver.page_source}")

Why use Selenium Wire?

  • No Pop-ups: Handles Basic Auth seamlessly.
  • Inspection: You can inspect headers and modify User-Agents per request.
  • Debugging: You can see exactly why a proxy request failed.
  • ---

    Method 4: Firefox Profile Configuration

    Firefox allows you to set preferences directly within the profile. This is useful if you need to disable the 'Remote DNS' feature (making DNS queries go through the proxy as well).

    from selenium import webdriver
    

    from selenium.webdriver.firefox.options import Options

    options = Options()

    Set the proxy settings

    options.set_preference("network.proxy.type", 1) options.set_preference("network.proxy.http", "192.168.1.10") options.set_preference("network.proxy.http_port", 8080) options.set_preference("network.proxy.ssl", "192.168.1.10") # Use same proxy for HTTPS options.set_preference("network.proxy.ssl_port", 8080)

    For SOCKS5 proxy:

    options.set_preference("network.proxy.type", 1)

    options.set_preference("network.proxy.socks", "127.0.0.1")

    options.set_preference("network.proxy.socks_port", 9050)

    options.set_preference("network.proxy.socks_version", 5)

    options.set_preference("network.proxy.socks_remote_dns", True) # Key for DNS anonymity

    driver = webdriver.Firefox(options=options) driver.get("https://httpbin.org/ip")

    ---

    Managing Proxy Rotation

    Static proxies get banned. For large-scale scraping, you must implement a rotation strategy.

    1. Middleware vs. Application-Level

    In frameworks like Scrapy, you use middleware. In Selenium, you handle rotation at the application level.

    2. IP Rotation Strategy

    Instead of setting a single proxy, you set a new proxy for every new driver instance (or tab, though new driver instances are cleaner).

    import random
    

    from selenium import webdriver from selenium.webdriver.chrome.options import Options

    proxy_list = [ "192.168.1.10:8080", "192.168.1.11:8080", "192.168.1.12:8080" ]

    def create_driver(proxy): options = Options() options.add_argument('--proxy-server=%s' % proxy) options.add_argument('--headless') # Run in background driver = webdriver.Chrome(options=options) return driver

    Rotate Logic

    for url in list_of_urls: proxy = random.choice(proxy_list) driver = create_driver(proxy) try: driver.get(url) # Scrape logic except Exception as e: print(f"Error with proxy {proxy}: {e}") finally: driver.quit() # IMPORTANT: Close driver to release resources

    ---

    Common Challenges and Troubleshooting

    1. Proxy Authentication Dialogs

    As mentioned, standard Selenium cannot handle 407 Proxy Authentication Required automatically. If you cannot use Selenium-Wire, you can use a custom browser extension or modify the URL structure (some providers allow auth via URL parameters like http://user:pass@ip:port), though the latter is deprecated in many modern browsers for security reasons.

    2. Bandwidth and Latency

    Proxies add latency. A request taking 0.1 seconds directly might take 2.0 seconds through a proxy.

  • *Solution:* Use multi-threading to spin up multiple Chrome drivers simultaneously.
  • 3. Browser Leaks (WebRTC & DNS)

    Even with a proxy, your browser can leak your real IP via WebRTC or DNS requests if not configured correctly.

  • *Solution:* Use chrome_options.add_argument("--disable-webrtc") and ensure Remote DNS is enabled in your proxy settings.

---

Summary Table: Proxy Methods

| Method | Best For | Auth Support | Difficulty | Performance | | :--- | :--- | :--- | :--- | :--- | | Chrome Args | Simple HTTP/HTTPS | No (Complex) | Low | High | | Firefox Prefs | Fine-tuned Control | No (Complex) | Medium | Medium | | Selenium Wire | Enterprise/Auth | Yes (Native) | Low | Medium | | Smart Proxy | Rotating/Gateways | Yes | Low | High |

In 2025, for serious scraping projects involving authentication and rotation, Selenium Wire or a rotating residential endpoint (where the proxy provider handles rotation via a single entry node) are the industry standards.

Share: