Web data collection
Collect public web pages from the country whose version you need, on a schedule and at a rate the site can handle. These web scraping proxies use rotating or sticky sessions and are billed per GB.
Your client
USERNAME:PASSWORD
netdash gateway
-us or -eu
Exit IP
-cc-{CC}
Website
HTTPS via CONNECT
- No per-account concurrency limit
- Purchased GB never expire
- Pay for the traffic you use
Web scraping proxies for scheduled collection
A collector that runs from one server sees one country’s version of every page. And a schedule that grows from a few hundred pages a day to a few hundred thousand needs a cost you can work out before the run, not after it.
netdash gives the collector an exit country per request and a per-GB price you can calculate before the first run. These web scraping proxies are standard HTTP proxies: your collector keeps its own scheduler, parser and storage, and netdash carries the requests. It doesn’t solve CAPTCHAs or render JavaScript; pages that need a browser belong in browser automation.
Why the request country changes the data
Many sites vary language, currency, catalog, legal notices and search results by the visitor’s country. Collect from the country whose version you analyze; otherwise the dataset quietly mixes markets and the numbers stop being comparable.
Targeting is country-level: add -cc- and an ISO code to the username, such as -cc-US or -cc-GB (not UK). The targeting docs cover country codes and gateways.
- Language and translated content
- Currency and how prices are displayed
- Catalog, assortment and availability
- Legal notices and consent banners
- Search and ranking results
A collection pipeline, step by step
Step 1: Scope the data
List the sites and the fields you need. Read each site’s robots.txt and terms, and use an official API or data feed where one exists.
Responsible useStep 2: Estimate volume
Pages per run × runs per month × average transfer per page. Price the result before you buy.
Price calculatorStep 3: Configure the proxy
Exit country = the market you need. Rotating or sticky depending on the request pattern, as the table below shows.
Proxy string formatStep 4: Set politeness rules
A per-host concurrency cap, a delay between requests,
Retry-Afterhonored, back-off on429and503, and a descriptive user agent with a contact URL where appropriate.Step 5: Parse and store with context
Save the URL,
fetched_atin UTC, the exit country and the HTTP status with every record, so each value can be traced back to its request.Step 6: Watch the run
Track the plan’s GB balance in the dashboard and the error rate per site. Stop when a site starts challenging your requests.
Rotating or sticky: match the request pattern
The session mode follows from how the site serves the data, not from the volume.
| Attribute | Mode | TTL | Why |
|---|---|---|---|
| Independent page fetches | Rotating | None | Each fetch stands alone, so no exit IP needs to be kept |
| Paginated listing that relies on a session cookie | Sticky | 30 | Every page of the listing leaves through one exit IP |
| Search, results and detail pages in sequence | Sticky | 30 | The sequence keeps one exit IP and one set of cookies |
| Long incremental crawl of one site section | Sticky | 720 (12 h) | A long job stays on one exit IP while that IP is available |
Requests sent through one HTTPS tunnel share that tunnel’s exit IP. If consecutive requests must share an exit IP, use a sticky session. More in rotating and sticky sessions.
Configuration for a daily collection run
A US collector fetching independent public pages once a day.
- Plan and endpoint
Scale:
scale-us.netdash.io:2000The examples use the Scale plan. Every residential plan uses the same syntax; you switch plans by changing the host and port.
- Exit country
-cc-USCollect the US version. Use any ISO 3166-1 alpha-2 code; to confirm availability for a specific country, contact support.
- Session mode
Rotating (no session parameters)
Independent fetches; the gateway assigns exit IPs.
- Proxy string
http://USERNAME-cc-US:PASSWORD@scale-us.netdash.io:2000The
http://user:pass@host:portformat. URL-encode the password if it contains special characters.- Per-host rate
Your policy: low concurrency per host plus a delay; obey
Crawl-delaywhere it is setThe site sets the limit. netdash has no per-account concurrency limit, so the cap is yours to choose.
- Connections
Reuse connections for efficiency; when consecutive requests must share an exit IP, use a sticky session
Requests sent through one HTTPS tunnel share that tunnel’s exit IP.
Build the proxy string for your collector
Change the country, gateway or session mode and copy the result into your collector’s configuration.
Your route
Through the gateway to an exit IP in , , on the plan.
Proxy URL
http://USERNAME-cc-US:PASSWORD@scale-us.netdash.io:2000Replace USERNAME and PASSWORD with the credentials from your dashboard.
Scale, Americas gateway, exit IP in United States, rotating.
curl --max-time 30 -x "http://USERNAME-cc-US:PASSWORD@scale-us.netdash.io:2000" \
"https://api.ipify.org?format=json"import requests
proxy = "http://USERNAME-cc-US:PASSWORD@scale-us.netdash.io:2000"
proxies = {"http": proxy, "https": proxy} # set both, or HTTPS requests bypass the proxy
response = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
response.raise_for_status()
print(response.text)import { ProxyAgent, fetch } from "undici";
const dispatcher = new ProxyAgent({
uri: "http://scale-us.netdash.io:2000",
token: "Basic " + Buffer.from("USERNAME-cc-US:PASSWORD").toString("base64"),
});
const res = await fetch("https://api.ipify.org?format=json", { dispatcher, signal: AbortSignal.timeout(30_000) });
console.log(await res.text());import { chromium } from "playwright";
const browser = await chromium.launch({
proxy: {
server: "http://scale-us.netdash.io:2000",
username: "USERNAME-cc-US",
password: "PASSWORD",
},
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org?format=json");
console.log(await page.textContent("body"));
await browser.close();Example output
{"ip":"203.0.113.10"}Your output shows a different address in the country you chose.
A polite fetcher in Python
The fetcher checks robots.txt once per site through the same exit country, waits at least two seconds between requests, honors Retry-After on 429 and 503, and gives up after three attempts. Give it a User-Agent that names your collector and a contact URL.
For client setup and error handling, see the Python guide. For a complete scraper with parsing and storage, read web scraping with Python and proxies.
- Both
httpandhttpskeys inproxies, or HTTPS requests skip the proxy timeout=30on every requestRetry-Afterhandled as seconds or as an HTTP date- A
requests.Sessionreuses connections; requests sent through one HTTPS tunnel share that tunnel’s exit IP
import os
import time
from datetime import datetime, timezone
from email.utils import parsedate_to_datetime
from urllib.parse import quote, urlsplit
from urllib.robotparser import RobotFileParser
import requests
USER_AGENT = "example-collector/1.0 (+https://example.com/contact)"
PROXY = "http://{}-cc-US:{}@scale-us.netdash.io:2000".format(
quote(os.environ["NETDASH_USERNAME"], safe=""), quote(os.environ["NETDASH_PASSWORD"], safe="")
)
PROXIES = {"http": PROXY, "https": PROXY} # set both, or HTTPS requests bypass the proxy
DEFAULT_DELAY = 2 # seconds between requests to one site, unless robots.txt asks for more
session = requests.Session()
session.headers["User-Agent"] = USER_AGENT
robots = {}
def rules_for(url):
"""Fetch robots.txt once per site, through the same exit country."""
site = "{0.scheme}://{0.netloc}".format(urlsplit(url))
if site not in robots:
parser = RobotFileParser()
resp = session.get(site + "/robots.txt", proxies=PROXIES, timeout=30)
if resp.ok:
parser.parse(resp.text.splitlines())
elif resp.status_code in (404, 410):
parser.parse([]) # no robots.txt: nothing is disallowed
else:
parser.parse(["User-agent: *", "Disallow: /"]) # unclear answer: don't collect yet
robots[site] = parser
return robots[site]
def retry_after(value, default=60):
"""Retry-After is either a number of seconds or an HTTP date."""
if value and value.strip().isdigit():
return int(value)
try:
when = parsedate_to_datetime(value)
return max(0, (when - datetime.now(timezone.utc)).total_seconds())
except (TypeError, ValueError):
return default
def fetch(url, attempts=3):
rules = rules_for(url)
if not rules.can_fetch(USER_AGENT, url):
return None # disallowed by robots.txt
delay = max(DEFAULT_DELAY, rules.crawl_delay(USER_AGENT) or 0)
for _ in range(attempts):
time.sleep(delay)
# Wrong username or password: the gateway answers 407, which requests raises as
# ProxyError for https:// URLs (and raise_for_status() raises for http:// URLs).
resp = session.get(url, proxies=PROXIES, timeout=30)
if resp.status_code in (429, 503):
delay = max(DEFAULT_DELAY, retry_after(resp.headers.get("Retry-After")))
continue
resp.raise_for_status()
return resp
return None # gave up after three attempts; if a site keeps limiting you, lower your rate
if __name__ == "__main__":
print(fetch("https://api.ipify.org?format=json").text)Estimate GB before you buy
Estimate from your own pages rather than a benchmark: pages per run × runs per month × average transfer per page ≈ GB per month. Measure the transfer per page in your client during a short test run, because page sizes vary widely between sites.
Price the result in the calculator. Orders are one-time purchases with graduated pricing per order, from 1 to 50,000 GB, and purchased GB never expire, so you can buy several months of collection at once. Billing explains how the bands apply. For more than 50,000 GB in one order or custom terms, contact sales.
- Example: 20,000 pages a day for 30 days at about 200 KB per page is about 120 GB a month
- You pay for the traffic you use: 1 GB of traffic is 1 GB from your balance
- Each plan keeps its own GB balance, visible in the dashboard
- A collector that requests only HTML, without images or scripts, uses far less than a browser
Which product to collect with
Residential covers most collection. Static datacenter and ISP IPs are available through sales while self-serve checkout is paused.
Residential proxies
Self-serveAn exit country per request: rotating for independent fetches, sticky for sequences, billed per GB. The examples use the Scale plan; the other residential plans use the same syntax.
From $1.20/GB, graduated per order
Datacenter proxies
Through salesSteady, high-volume collection from sites that accept it, where a fixed set of IPs billed per IP, with no per-GB charge, suits the load.
$1.40 per IP per 30 days
ISP proxies
Through salesA fixed set of static IPs in Ashburn, Frankfurt, London or Sydney for long-running collection.
$1.60 per IP per 30 days
Collection by industry
The same connection, tuned for a specific kind of public data.
Price monitoring
Public prices, currency and availability on storefronts in each country.
Price monitoring: See the workflowSERP tracking
Search results as users in each market see them.
SERP tracking: See the workflowTravel fare aggregation
Public flight fares and hotel rates by point of sale.
Travel fare aggregation: See the workflowBrand protection
Counterfeit listings and unauthorized sellers on public pages.
Brand protection: See the workflowAd verification
How your own campaigns and landing pages render by country.
Ad verification: See the workflowAgents that browse
Research agents that fetch pages with an exit country and a session.
Agents that browse: See the workflowPages that need a browser
JavaScript-heavy pages collected with Playwright, Puppeteer or Selenium.
Pages that need a browser: See the workflowTraining data
robots.txt, terms, copyright and personal data when you collect for model training.
Training data: See the workflow
Collect responsibly
Collect public pages only, and read each site’s robots.txt and terms first. Keep request rates reasonable and back off when a site slows you down. Don’t collect personal data without a lawful basis, and don’t access content behind logins or paywalls without authorization. netdash doesn’t solve CAPTCHAs or other challenges, and your code shouldn’t try to. If a site rate-limits or challenges your requests, slow down, check its terms, or use its official API. Whether you can collect a given dataset depends on the site’s terms, the data and your jurisdiction; get legal advice for your case. See how we expect netdash to be used and our Terms of Service (§2).
Guides for building a collector
- Python
requests and httpx with authentication, rotating and sticky sessions.
- Scrapy
Proxies per request in a Scrapy spider.
- Node.js
undici and axios with an authenticated HTTP proxy.
- Go guide
net/http with a proxy URL, timeouts and error handling.
- Rotating and sticky sessions
Session IDs, TTLs and when to keep one exit IP.
- Country targeting
ISO country codes, gateways and the
-cc-parameter. - Billing
How graduated pricing per order and GB balances work.
- Proxy string format
Hosts, ports and the username syntax for every plan.
- Rotating proxy buyer’s checklist
Pricing models, sessions, targeting and terms to compare before you choose a provider.
- Free vs paid proxies
What a free proxy list costs you in reliability and data exposure.
- All proxy use cases
Every workflow, with its default product and session settings.
Web data collection questions
Rotating for independent page fetches; sticky when a sequence of requests relies on the same session, such as pagination with a session cookie. See rotating and sticky sessions.
There’s no per-account concurrency limit. Set per-site limits yourself, based on what each site can handle.
No. netdash forwards your traffic. For pages that need JavaScript, use a browser (see browser automation); if a site challenges you, slow down or stop.
It depends on the site’s terms, the data and your jurisdiction; get legal advice for your case. Our principles are in how we expect netdash to be used.
Start collecting
Create an account, buy GB for a residential plan and point your collector at the gateway. Planning more than 50,000 GB in one order? Talk to sales.