Skip to content

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.

  1. Your client

    USERNAME:PASSWORD

  2. netdash gateway

    -us or -eu

  3. Exit IP

    -cc-{CC}

  4. Website

    HTTPS via CONNECT

The website sees the exit IP, not your own IP address.
  • 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

  1. 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 use
  2. Step 2: Estimate volume

    Pages per run × runs per month × average transfer per page. Price the result before you buy.

    Price calculator
  3. Step 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 format
  4. Step 4: Set politeness rules

    A per-host concurrency cap, a delay between requests, Retry-After honored, back-off on 429 and 503, and a descriptive user agent with a contact URL where appropriate.

  5. Step 5: Parse and store with context

    Save the URL, fetched_at in UTC, the exit country and the HTTP status with every record, so each value can be traced back to its request.

  6. 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.

Rotating or sticky: match the request pattern
AttributeModeTTLWhy
Independent page fetchesRotatingNoneEach fetch stands alone, so no exit IP needs to be kept
Paginated listing that relies on a session cookieSticky30Every page of the listing leaves through one exit IP
Search, results and detail pages in sequenceSticky30The sequence keeps one exit IP and one set of cookies
Long incremental crawl of one site sectionSticky720 (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:2000

The examples use the Scale plan. Every residential plan uses the same syntax; you switch plans by changing the host and port.

Exit country

-cc-US

Collect 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:2000

The http://user:pass@host:port format. URL-encode the password if it contains special characters.

Per-host rate

Your policy: low concurrency per host plus a delay; obey Crawl-delay where it is set

The 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 AshburnFrankfurt gateway to an exit IP in Via Ashburn (-us)United StatesCanadaMexicoBrazilArgentinaChileVia Frankfurt (-eu)United KingdomGermanyFranceSouth AfricaIndiaJapan, rotatingsticky for 15 minsticky for 30 minsticky for 12 hsticky for 7 days, on the SolveScaleOpus plan.

Proxy URL

http://USERNAME-cc-US:PASSWORD@scale-us.netdash.io:2000

Replace 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();
{"ip":"203.0.113.10"}

Your output shows a different address in the country you chose.

Illustrative routes, not live traffic. Exits are available in most countries; the countries shown are examples. For exits in Oceania, ask support which gateway to use.All locations

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 http and https keys in proxies, or HTTPS requests skip the proxy
  • timeout=30 on every request
  • Retry-After handled as seconds or as an HTTP date
  • A requests.Session reuses 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)
Python

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-serve

    An 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 sales

    Steady, 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 sales

    A 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.

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

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.

Per GB from the plan’s balance. Orders are one-time purchases with graduated pricing per order, purchased GB never expire, and 1 GB of traffic is 1 GB from your balance. See billing and pricing.

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.

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.

Privacy choices

We use cookies and similar technologies that this site needs to work and to remember your choice. We also use Google Analytics to understand which pages and features people use: in the EEA, the UK and Switzerland only with your consent. Live chat loads only if you open it. You can change your choice at any time under “Privacy choices” in the footer. Privacy Policy

Privacy choices

Choose what netdash.io may use. You can change this at any time under “Privacy choices” in the footer.

Necessary (always on)

Keeps the site working and secure, and remembers your privacy choices (nd_consent, 12 months).

In the EEA, the UK and Switzerland it stays off until you switch it on; elsewhere it is on unless you switch it off here. Google Analytics 4 measures page views, clicks on links and buttons, use of the price calculator, connection builder and code examples, scroll depth, file downloads, and page-performance metrics. It sets the cookies _ga and _ga_96MPNM6GHH, which last up to 12 months. Google processes this data, which may involve transfer to the United States. We do not send your name, email address or account details to Google Analytics. With this switched on we also remember a referral code or campaign you arrived with (nd_attr, 30 days), so a partner can be credited if you sign up.

Support chat (loads only when you open it)

Our live chat is provided by LiveChat. It loads only when you open the chat window. LiveChat then sets its own cookies and processes the messages you send and technical data about your browser.