Which proxies are best for web scraping?
For most scraping of public pages, rotating datacenter proxies are the best value: a new IP per connection, priced per thread, unlimited bandwidth. Switch a target to residential IPs only when it keeps blocking datacenter ranges, and keep static IPs for logged-in work. Size the plan by concurrent connections, not by page count.
You’re here because your scraper works on your laptop for a hundred pages, then starts getting 403s, CAPTCHAs or empty responses once you scale it. Or because you’re about to buy proxies and every provider says theirs is “the best for scraping”. The honest answer is that no proxy type is best everywhere. The right choice depends on three things: how strictly the target site treats datacenter IPs, whether your scraper needs to stay logged in, and how many pages you need per hour.
The usual mistakes are expensive in different ways. Buying residential bandwidth for sites that would happily serve datacenter IPs costs you money on every gigabyte. Running a big crawl through a handful of static IPs gets those addresses rate-limited in an afternoon. And running more parallel connections than your plan allows looks exactly like “the proxies are not working”, which is the most common complaint we hear.
This guide gives you a decision path, the cost math behind per-GB versus per-thread pricing, worked sizing for real job sizes, a test script to compare proxy types on your own targets, and the errors that tell you which way to adjust.
Which Storm plan fits
Start with rotating proxies on the Main gateway: 40 threads for $39 covers most single-machine scrapers, and the price stays flat whether you pull 10 GB or 2 TB a month. If one target keeps answering datacenter IPs with blocks or CAPTCHAs, add a small residential package for that site only (5 ports for $50) rather than moving everything. For scrapers that log in, a private dedicated proxy per account is the cleaner fit.
Rotating proxies (from $14/mo): 700,000+ IPs behind fixed gateway IP:PORTs. New IP on every request, or every 3 or 15 minutes. USA, EU, USA+EU or Worldwide. Unlimited bandwidth on every plan.
Get 40 threads for $39/mo See all rotating proxies plansBefore you start
- Log in to the member area and copy your gateway
IP:PORTs. They never change; the rotation happens on our side. - Add the public IP of the computer or server that will run your tool under Authorized IPs, click Save, and allow up to 15 minutes before testing. Rotating and residential proxies use IP authentication, so there is no username or password.
- Dedicated proxies work with either IP authentication or a username and password. Use user:pass if your IP changes or the tool runs on several machines.
- Count your threads: the tool’s total open connections must stay within your plan (for example 40 threads on the 40-thread plan).
- Set up a scraping job with Storm, step by step
- Compare proxy types on your own targets
- Datacenter, residential, ISP or mobile: what each is good for
- Per-GB vs per-thread pricing: run the numbers
- How many proxies you need: worked sizing
- When rotating datacenter is the wrong tool
- Scrape politely and keep it legal
- Common errors and fixes
- FAQ
Set up a scraping job with Storm, step by step
- Sort your targets by how strict they are
List the domains you’ll scrape. Blogs, documentation, news sites, directories and most small shops rarely care whether a visitor comes from a datacenter. Large marketplaces, search engines and big-box retailers often do. Put the lenient ones on rotating datacenter IPs from day one and mark the strict ones for a test.
- Pick the product and gateway
On a rotating plan, use the Main gateway for page-by-page scraping: every new connection leaves from a different IP. Use the 15-minute gateway only for short flows that must keep one IP, such as paging through a filtered search that stores state in a cookie. Choose USA, EU, USA+EU, or Worldwide to match the version of the site you want to see.
- Authorize the machine that runs the scraper
Rotating and residential plans use IP authorization. Add the public IP of your server or computer under Authorized IPs in the member area, save, and give it up to 15 minutes. If the scraper runs somewhere with a changing outgoing IP, like a serverless function or a hosted notebook, move it to a VPS with a fixed IP, or use dedicated proxies with a username and password.
- Size threads from your target rate
Threads needed ≈ pages per second × average seconds per page. Measure the second number on a small run rather than guessing. Add every other tool that shares the plan, then leave about 10 percent headroom. The worked examples below show the math for common job sizes.
- Configure the scraper
Point the HTTP client at
http://GATEWAY_IP:PORTfor both http and https URLs, set the worker count to your thread budget, add timeouts and retries with backoff, and send realistic headers. Setup details per tool: Python requests, Scrapy, Playwright. - Run a pilot of a few hundred pages per target
Count status codes, CAPTCHA pages and timeouts per domain. A target that returns clean 200s on the rotating gateway stays there. A target that shows blocks on datacenter IPs even at low speed is your candidate for residential ports.
- Scale in steps and watch the error rate
Double the workers, run again, compare. If errors climb faster than throughput, you’ve found the target’s limit, not the plan’s. If you’re simply out of threads, upgrade in the member area; the unused part of your current plan is credited and the old plan stops automatically.
Compare proxy types on your own targets
Don’t pick a proxy type from a review site. Run the same URLs through each option and read the numbers. Replace GATEWAY_IP:PORT with gateways from your member area.
import collections, time, requests
GATEWAYS = {
"rotating-main": "http://GATEWAY_IP:PORT",
"residential": "http://GATEWAY_IP:PORT",
}
URLS = [line.strip() for line in open("sample_urls.txt") if line.strip()][:200]
BLOCK_MARKERS = ("captcha", "access denied", "unusual traffic", "robot check")
def classify(r):
body = r.text[:20000].lower()
if r.status_code in (403, 429, 503) or any(m in body for m in BLOCK_MARKERS):
return "blocked"
return "ok" if r.status_code == 200 else f"http_{r.status_code}"
for name, proxy in GATEWAYS.items():
tally, started = collections.Counter(), time.time()
for url in URLS:
try:
r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=(10, 30),
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Accept-Language": "en-US,en;q=0.9"})
tally[classify(r)] += 1
except requests.RequestException as e:
tally[type(e).__name__] += 1
time.sleep(1) # pilot at a polite pace first
secs = (time.time() - started) / max(len(URLS), 1)
print(name, dict(tally), f"{secs:.1f}s per page")# middlewares.py
from urllib.parse import urlparse
ROTATING = "http://GATEWAY_IP:PORT" # Main gateway, datacenter
RESIDENTIAL = "http://GATEWAY_IP:PORT" # residential port
STRICT = {"www.example-marketplace.com", "www.example-retailer.com"}
class SplitProxyMiddleware:
def process_request(self, request, spider):
if "proxy" not in request.meta:
host = urlparse(request.url).hostname or ""
request.meta["proxy"] = RESIDENTIAL if host in STRICT else ROTATING
# settings.py
DOWNLOADER_MIDDLEWARES = {"myproject.middlewares.SplitProxyMiddleware": 350}
CONCURRENT_REQUESTS = 36 # 40-thread plan minus headroomDatacenter, residential, ISP or mobile: what each is good for
- Rotating datacenter. IPs from hosting networks behind a gateway that changes the exit IP per connection. Cheapest per request and usually the fastest. Works for the large majority of public pages. Weak spot: some big sites treat whole hosting ranges as suspicious.
- Residential. IPs that home internet providers assign to households. Sites tend to trust them more, so they help on targets that block datacenter ranges. They cost more and are slower per request, and most providers bill them per GB.
- Static (dedicated or ISP). One IP that stays yours. Right for logins, carts and anything with a session that must survive for hours. Wrong for volume crawling of one site, because every request lands on the same few addresses.
- Mobile. Carrier IPs shared by many phones. The most expensive type. Storm doesn’t sell mobile or ISP proxies, so if a target truly only answers mobile IPs, you’d need another provider for that site.
- Free public proxy lists. Slow, short-lived, often already flagged, and you can’t know who reads your traffic.
For a side-by-side of the rotation side, see rotating vs static proxies.
Per-GB vs per-thread pricing: run the numbers
Most residential and many datacenter providers charge per gigabyte. That model punishes exactly what scrapers do: fetch lots of full HTML pages, plus retries. Heavy retail pages can run past a megabyte of HTML alone. At 2 MB a page, 500,000 pages a month is about 1 TB of traffic, and every failed attempt adds more.
Storm prices by concurrency instead. A 40-thread rotating plan is $39 a month whether that month moves 20 GB or 1 TB, and residential ports are priced per port, not per GB. So the question you answer when buying is “how many connections do I run at once”, not “how much data will I pull”. If you render pages in a browser, that matters even more, because a browser downloads scripts, fonts and images too. More on this in unlimited bandwidth proxies.
How many proxies you need: worked sizing
Thread math: threads = pages per second × seconds per page. One thread is one open connection at a time (explained in depth in proxy threads explained).
- 100,000 pages a day, plain HTTP, 3 s per page. 100,000 ÷ 86,400 = 1.2 pages/s × 3 = about 4 threads on average. The 40-thread plan ($39) covers it with room for retries and a second job. The 10-thread package ($14) is for testing, not for this.
- 1 million pages a day, plain HTTP, 4 s per page. 11.6 pages/s × 4 = about 47 threads around the clock. Take the 80-thread plan ($59); if you also scrape search engines from the same plan, go to 150 threads ($97) so the search share stays small.
- 20,000 pages a day rendered in a headless browser. Plan for around 10 threads per open tab. Four tabs in parallel means 40 threads, so the 40-thread plan is the floor and 80 threads gives breathing room.
- One strict marketplace, 30,000 pages a day. Put it on residential ports. 30,000 ÷ 86,400 × 300 s = about 104 requests per 5-minute IP window in total. Spread over 10 ports ($90), each IP carries about 10 requests per window, which is a gentle pace. With 1 port, one IP would carry all 104.
Residential sizing works differently: each port is one IP at a time, shared by up to 50 threads. More ports means more different IPs in parallel, which is what keeps per-IP request counts low on strict sites.
When rotating datacenter is the wrong tool
If the pilot shows blocks on datacenter IPs even at one request every few seconds, adding threads won’t help; it makes the pattern louder. That target belongs on residential ports, or needs a slower schedule.
If the job needs one identity for longer than 15 minutes (a logged-in dashboard, a B2B portal you have an account on), rotation works against you. Use a private dedicated proxy per account. And if the scraper runs on a platform whose outgoing IP changes every run, IP authorization can’t work there; dedicated proxies with user:pass can.
Scrape politely and keep it legal
Proxies spread load; they don’t change a site’s rules. Read the site’s terms and robots.txt, stick to public pages, don’t scrape behind a login you aren’t allowed to automate, and don’t collect personal data you have no basis to hold. Keep per-domain concurrency modest even when your plan allows more: a 150-thread plan pointed at one small shop is a load problem for them and a ban for you. Storm doesn’t allow hacking, reselling, torrents or illegal activity, and outgoing email ports are blocked.
Common errors and fixes
FAQ
What type of proxy is best for web scraping?
Rotating datacenter proxies for most public sites, because they’re fast and cheap per request. Residential proxies for targets that block datacenter ranges. Static dedicated IPs for anything that needs a login. Test your actual targets before committing.
How many proxies do I need for web scraping?
Count concurrent connections, not IPs. Multiply pages per second by seconds per page, add headroom, and pick the plan with at least that many threads. With a rotating gateway, each connection already gets a different IP from the pool.
Are residential proxies always better for scraping?
No. They help on strict targets, but they’re slower and usually cost more. On sites that serve datacenter IPs normally, residential just raises your cost per page.
Can I use one Storm plan for several scrapers?
Yes. Every scraper uses the same gateways, and the thread limit applies to all of them together. Two scrapers on a 40-thread plan could run 20 workers each.
Does Storm charge for bandwidth on scraping plans?
No. Every plan has unlimited bandwidth; you pay per thread, port or proxy. Retries and heavy pages don’t change the bill.
Can I try a plan before scaling up?
There is no free trial, but the smallest package of each proxy type has a 24-hour money-back guarantee on your first order. Run your pilot test inside that window, then upgrade from the member area.
Still have questions? Contact us here. A real person answers.
Related guides
Tool facts checked against the official documentation (October 2026): RFC 9309: Robots Exclusion Protocol · Scrapy docs: Downloader middleware (HttpProxyMiddleware) · Requests docs: Proxies. Storm Proxies facts: our plans page and refund policy.
Unlimited bandwidth. One flat monthly price.
Access is live the moment you pay, and the smallest package of each proxy type has a 24-hour money-back guarantee on your first order.