Skip to main content

A unified interface for different proxy providers

Project description

ProxyProviders

The Unified Python Proxy API for managing proxies with support for BrightData, WebShare, and more.

codecov Sponsor Me GitHub release (latest by date) GitHub Downloads Support Server LinkedIn

Table of Contents

Documentation

You can find the full documentation here

Note: If you want to learn how to web scrape websites check my free and open-source course for learning everything web scraping

How to Support The Project

  • Star the repo 😎
  • Consider sponsoring me on GitHub
  • Send me an email or a LinkedIn message about what you're doing with it :D
  • Submit PRs for issues or any new providers/features :)

Getting Started

To get started using this package follow the instructions below.

Installation

This package is installable via pip.

python -m pip install proxyproviders

Quick Start Guide

Here's a quick bit of code to get you started! There's also a few examples in the folder.

📺 Video Tutorial: Watch the quick start guide on YouTube for a walkthrough of getting started with ProxyProviders.

Note: If you want to learn how to web scrape websites check my free and open-source course for learning everything web scraping

Choose a Proxy Provider

If you already haven't, choose which proxy provider to use. You can find a list in the documentation. After choosing, look at the documentation around the specific provider you've choosen. Where needed, we've laid out steps to get api keys in the documentation. These steps will vary slightly by provider. For this example I'll be using the Webshare Provider because it's both easy to setup and they give you 10 free data center proxies to test out.

You can create an account on webshare here (affiliate link), then head into the API tab on the side and generate a new token. Keep this API token safe and don't post it publically.

Basic Example

After you can list out your proxies with

from proxyproviders import Webshare

proxy_provider = Webshare(api_key="your-api-key")

proxies = proxy_provider.list_proxies()

print(proxies)

For simple usage, you can get a proxy and use it immediately:

from proxyproviders import Webshare
import requests

provider = Webshare(api_key="your-api-key")

# Get a proxy (uses RoundRobin by default) and use it with requests
from proxyproviders.models.proxy import ProxyFormat

proxy = provider.get_proxy()
response = requests.get("https://httpbin.org/ip", proxies=proxy.format(ProxyFormat.REQUESTS))
print(response.json())

# Or in one-line
response = requests.get("https://httpbin.org/ip", proxies=provider.get_proxy().format(ProxyFormat.REQUESTS))

Each provider has their own custom options, the Webshare class lets you specify url params according to their api spec, here's an example which will only return proxies that are based in the US.

proxy_provider = Webshare(api_key="your-api-key", params={"country_code_in": "US"})

Using ProxyConfig

For any shared logic across all types of proxy providers, we use the ProxyConfig data class to configure them. The full docs for ProxyConfig are here. In this example we will configure it to use a shorter refresh_interval than default.

from proxyproviders import Webshare, ProxyConfig
import time

config = ProxyConfig(refresh_interval=3)
ws = Webshare(api_key="your-api-token", config=config)

proxies = ws.list_proxies() # calls API 

ws.list_proxies() # cached

time.sleep(5)
ws.list_proxies() # calls API since it's more than 3s later

Function Using Generic ProxyProvider

Since all proxy providers implement the same interface, we can make a function that allows us to easily swap out and utilize different providers. This is the main appeal of having a unified interface. It allows other modules to be provider agnostic, like my TikTokAPI package.

from proxyproviders import Webshare, BrightData, ProxyProvider, ProxyConfig

def some_function(provider: ProxyProvider):
    proxies = provider.list_proxies()
    print(proxies)

webshare = Webshare(api_key="your_api_key")
brightdata = BrightData(api_key="your_api_key", zone="my_zone")

some_function(webshare)
some_function(brightdata)

Here's a more meaningful example that takes the Proxy class and uses it to create a python requests http proxy.

Simple Usage

from proxyproviders import Webshare
from proxyproviders.algorithms import Random, RoundRobin
from proxyproviders.models.proxy import ProxyFormat
import requests

provider = Webshare(api_key="your_api_key")

# Get proxy using default RoundRobin and make request
proxy = provider.get_proxy()
response = requests.get("https://httpbin.org/ip", proxies=proxy.format(ProxyFormat.REQUESTS))

# Or in one-line
response = requests.get("https://httpbin.org/ip", proxies=provider.get_proxy().format(ProxyFormat.REQUESTS))

Built-in Algorithms

from proxyproviders import Webshare
from proxyproviders.algorithms import Random, RoundRobin, First

provider = Webshare(api_key="your_api_key")

# Default: RoundRobin (cycles through proxies for load balancing)
proxy = provider.get_proxy()

# Random selection
proxy = provider.get_proxy(Random())

# Always first proxy (deterministic)
proxy = provider.get_proxy(First())

# Algorithm can maintain state when reused
round_robin = RoundRobin()
proxy1 = provider.get_proxy(round_robin)
proxy2 = provider.get_proxy(round_robin)  # Next in sequence

Algorithm State Management

from proxyproviders import Webshare
from proxyproviders.algorithms import RoundRobin, Random

provider = Webshare(api_key="your_api_key")

# Create reusable algorithm for state management
round_robin = RoundRobin()  # Maintains state across calls
random_algo = Random()      # Stateless but reusable

# Each call to round_robin will cycle to next proxy
for i in range(3):
    proxy = provider.get_proxy(round_robin)
    print(f"RoundRobin {i}: {proxy.proxy_address}")

# Provider also maintains its own default RoundRobin state when not specified
for i in range(3):
    proxy = provider.get_proxy()  # Uses provider's default RoundRobin
    print(f"Default {i}: {proxy.proxy_address}")

Custom Algorithms

from proxyproviders.algorithms import Algorithm
from typing import List
from proxyproviders.models.proxy import Proxy

class USProxyAlgorithm(Algorithm):
    """Prefers US proxies, falls back to first available."""

    def select(self, proxies: List[Proxy]) -> Proxy:
        # Try to find a US proxy
        for proxy in proxies:
            if proxy.country_code == "US":
                return proxy
        # Fall back to first proxy
        return proxies[0]

# Use your custom algorithm
proxy = provider.get_proxy(USProxyAlgorithm())

Making Your Own Proxy Provider

Here's a skeleton of how you can make your very own ProxyProvider class. You'll need to implemenet all the required functions of the ProxyProvider which may be more than what's here at the time of writing.

If you do find yourself making one of these, consider contributing it back to the repository so everyone can use them :D

from proxyproviders import ProxyProvider, ProxyConfig, Proxy
from typing import List, Optional

class MyProxyProvider(ProxyProvider):
    def __init__(self, config: Optional[ProxyConfig] = None):
        super().__init__(config=config)

    def _fetch_proxies(self):
        proxies: List[Proxy] = []

        for i in range(10):
            # TODO: your real proxy fetching logic

            # There are required fields on the Proxy class, be sure that these are filled out properly
            # especially if you're using it with another library.
            proxy = Proxy(
                id=str(i),
                username="username",
                password="password",
                proxy_address="192.168.1.1",
                port=80,
            )

            proxies.append(proxy)

        return proxies

def some_function(provider: ProxyProvider):
    proxies = provider.list_proxies()
    for proxy in proxies:
        print(proxy)

provider = MyProxyProvider()
some_function(provider) # calls the function with the provider

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

proxyproviders-0.2.2.tar.gz (15.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

proxyproviders-0.2.2-py3-none-any.whl (16.4 kB view details)

Uploaded Python 3

File details

Details for the file proxyproviders-0.2.2.tar.gz.

File metadata

  • Download URL: proxyproviders-0.2.2.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for proxyproviders-0.2.2.tar.gz
Algorithm Hash digest
SHA256 2970d77bc9452a7528f0566a499eb11b3b89cb4b2d8a9a6eda8289760e13dacd
MD5 261b1bc0faffb89a31b146a95d2f5024
BLAKE2b-256 d3ecd76bd8a06c4b7788dede6beca5f6eb87438b96776ec46e52b72d0bdea999

See more details on using hashes here.

Provenance

The following attestation bundles were made for proxyproviders-0.2.2.tar.gz:

Publisher: publish.yml on davidteather/proxyproviders

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file proxyproviders-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: proxyproviders-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 16.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for proxyproviders-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e94a05b46ccd95029eb4cbaa6f396f0af527b860172a715f5953846a337c5123
MD5 0d95df5ad93a1aa05082000c34c49e75
BLAKE2b-256 d07c66f907969fdca37a0fce78cdffcf72d5d6d874fbbef1408c1f4dd10a3016

See more details on using hashes here.

Provenance

The following attestation bundles were made for proxyproviders-0.2.2-py3-none-any.whl:

Publisher: publish.yml on davidteather/proxyproviders

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page