Proxy Providers for Python Developers, Compared
Six proxy providers compared on what a Python scraper needs: SOCKS5, session control, billing unit and a free way to test, from vendor pages.
Any mainstream proxy provider works with requests, httpx, aiohttp and Scrapy, because they all accept a standard http://user:pass@host:port URL. What separates them for a Python developer is where SOCKS5 works, how sessions are controlled from the username, the billing unit, and whether you can test before paying. To test SOCKS5 free with no end date, Webshare's free plan includes it; Oxylabs' one-time datacenter trial also works. For a no-card residential trial, Bright Data. For long fixed residential sessions, IPRoyal or Oxylabs. For owned datacenter exits in the US, Italy or Spain plus residential on one credential, Node4.
The six providers were compared on those four things. Node4 publishes this comparison and sells one of the six products. Competitor facts link to each vendor's own page, checked October 5, 2026. Nothing here is a speed or success-rate test.
The same request, any provider
Write the client once and swap credentials. Use socks5h rather than socks5 so DNS resolves at the proxy; with plain socks5 your machine resolves the hostname and a geo-targeted exit can be sent to an address meant for your own region.
import requests
PROXY = "socks5h://USER:PASS@HOST:PORT" # pip install "requests[socks]"
proxies = {"http": PROXY, "https": PROXY}
try:
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=(5, 30))
except requests.exceptions.ConnectionError as exc:
# SOCKS5 has no HTTP status, so a rejected login is never a 407:
# it arrives here, and the reason text says which step failed.
raise SystemExit(f"proxy step failed: {exc}")
print(r.status_code, r.text[:200])Branch on the failure type. Over SOCKS5 a rejected login is an exception, not a status code: the reason reads SOCKS5 authentication failed on some gateways and 0x02: Connection not allowed by ruleset on others, Node4's among them, which also send 0x02 when a Rotating Unmetered plan has every connection open. Through an http:// proxy URL the same mistake is a 407; for an HTTPS target like the one above, requests raises it as a ProxyError (a ConnectionError, so the same except catches it) with the 407 in the message, not as r.status_code. A 403 or 429 from the target is a block or a rate limit, so retry on a new connection or slow down. A connect timeout means the exit or gateway did not answer, and a retry through a new connection usually picks a different exit. Python proxy integration covers httpx and session reuse.
Six providers on the terms a script depends on
| SOCKS5 | Session control | Billing unit | Test before paying | |
|---|---|---|---|---|
| Node4 | Paid plans, every product | Session id in username; rotating datacenter up to 30 minutes, residential best effort | Per proxy (static), per GB (residential, rotating), per connection (Rotating Unmetered) | Free plan: shared datacenter, HTTP(S) only |
| Bright Data | SOCKS5 through its Proxy Manager on residential, datacenter, ISP and mobile | sticky and rotating sessions; length not stated | Per GB (residential), per IP (datacenter, ISP) | a free trial with no credit card required |
| Oxylabs | Residential, datacenter and ISP | Residential: the same residential IP for up to 24 hours | Per GB (residential), per IP or per GB (datacenter) | 5 free shared datacenter IPs with no card, available once; residential: a free trial through sales or support, available once |
| Decodo | Residential, datacenter and ISP | Product page: sticky sessions of minutes to days; pricing FAQ: one IP kept for up to 30 minutes | Per GB (residential) | a 3-day free trial with 100 MB (the chosen plan starts automatically after the trial unless canceled, and using the trial voids the 14-day money-back) |
| IPRoyal | Residential, datacenter and ISP | the same proxy kept for up to 7 days | Per GB from 1 GB; residential traffic that never expires | Trial button; terms not stated |
| Webshare | HTTP and SOCKS5 on the free plan and paid plans | Not stated on the pricing page | Per proxy per month (datacenter), per GB (rotating residential) | 10 datacenter proxies with up to 1 GB of data a month, with no expiry |
SOCKS5 sources for the rows without a citation in the cell: Oxylabs residential, datacenter and ISP; Decodo residential, datacenter and ISP; IPRoyal residential, datacenter and ISP. Decodo's two pages disagree on session length, so both are shown.
Where each one fits a Python workload
Node4. Datacenter, shared and rotating datacenter exits run on IP blocks Node4 owns in the US, Italy and Spain; residential comes from a partner network in 170+ countries. One username and password works on every product the account holds. On the rotating gateways an exit is chosen per HTTPS tunnel, per SOCKS5 connection and per plain-HTTP request, so a requests.Session that reuses one HTTPS tunnel keeps that tunnel's exit, while plain-HTTP requests rotate even on a reused connection. Open a new session (or a new connection) when you want a new HTTPS address. Rotating Unmetered is priced by concurrent connections, from $29.00 a month for 250, which maps directly to an asyncio.Semaphore or a Scrapy CONCURRENT_REQUESTS value. The free plan is 3 free shared proxies, 1 GB a month, no card required; it has no end date, and if your free proxies carry no traffic for 30 days we pause them, and you can reactivate a fresh set from your dashboard in one click. It is HTTP(S) only, so SOCKS5 testing starts on a paid plan. Account automation such as listing proxies or reading usage goes through a REST API at https://node4.io/api/v1 with a bearer key (API reference). Where it loses: owned datacenter locations stop at three countries, and residential sessions top out at 30 minutes.
Bright Data. One account prices residential, datacenter and ISP, and residential comes with a no-card trial. Volume goes to sales: IP products get a custom per-IP price through sales above 1,000 IPs, and residential gets a custom per-GB price through sales above 1 TB. It suits a team that wants several proxy types from one vendor.
Oxylabs. Residential sessions up to 24 hours and a no-card datacenter trial for testing client code. Residential trials go through sales, and there is no pay-as-you-go residential plan. It suits teams whose residential sessions need to run for hours, within that published maximum.
Decodo. A self-serve residential trial with a stated allowance, and continent, country, state, city, ZIP and ASN targeting included at no extra cost. It suits a scraper whose correctness depends on postcode-level location.
IPRoyal. Residential traffic that never expires and sessions up to 7 days. It suits irregular jobs, a weekly crawl for example, where unused gigabytes should carry over.
Webshare. Its free plan gives more proxies and more data than Node4's and includes SOCKS5. Datacenter coverage is an advertised 50 or more countries, so check your target countries first.
Which one to start with
Decide on the requirement your code cannot work around. If SOCKS5 must work on day one at no cost, start on Webshare's free plan. If residential exits must hold one address for hours, compare IPRoyal and Oxylabs. If the work is mostly datacenter traffic in the US, Italy or Spain, with residential for the targets that refuse hosting ranges, Node4 puts both behind one credential; see proxy plans. For the async version of the snippet above, read SOCKS5 proxies for aiohttp; for a deeper look at residential terms, see residential providers compared.