15% off your first purchase with code WELCOME15, up to 25 GB.

See pricing

Alternative data · Online price indices

Online price index scraping for inflation nowcasting

Online price index scraping collects the same public product prices every day, in each market, and turns them into a daily index long before the official CPI is published. The method is well established; the hard part is running it without gaps, product drift or a collection that quietly changes markets.

Pay per GB · No subscription · Prices in EUR, excl. VAT

Illustration. The URLs and values are fictional; the connection string is the real grammar.
€2.00
per GB on ARC Fast, excl. VAT
−44%
at 1 TB (€1.12 / GB)
185+
countries, city targeting
Never
expires — no subscription

Written for

  • Macro economists and nowcasters
  • National statistics office price teams
  • Macro and rates fund researchers
  • Central bank research staff

The short answer

  • The method is proven: MIT's Billion Prices Project collected about 5 million prices a day from over 300 retailers in 50 countries by 2010, and used them to build daily inflation indices.
  • Statistical offices use it too. In a 2020 Eurostat and ECB questionnaire, some 20 countries reported using web scraping for consumer price statistics, at least in testing.
  • Online and in-store prices at large multi-channel retailers were identical about 72% of the time in a 10-country study. Online prices are a good proxy for many goods, not for all.
  • The index is only as good as the series: same products, same markets, same time of day. Collect each market from exits in it, on a fixed schedule, and treat a missed day as a defect.

The problem

What goes wrong without the right IPs

Product churn breaks the series

Products are discontinued, relaunched with a new code, or resized at the same price. If your matching is by product ID only, a relaunch at a higher price never shows up as inflation. The ECB names relaunches that change item codes as a way price increases can be hidden.

The exit picks the market

Retailers price, stock and sometimes show different assortments by visitor region. Collect a French grocer from a German exit and you may be tracking the cross-border shop, or a redirect to a different site.

Gaps become fake price changes

A day missed because one IP was limited leaves a gap you will impute or carry forward. Either way it is noise in a series whose signal is a few tenths of a percent a month.

Collection time is part of the price

Promotions start and end at fixed times and some retailers reprice during the day. A run that drifts from 06:00 to 14:00 because retries queued behind one address introduces a timing artefact.

Online is not the whole basket

Rent, utilities, many services and fresh food sold by weight are poorly covered online. An online index nowcasts the goods component well and the rest poorly; say which one you publish.

What to collect

What you can collect

Price, regular price and promotion flag
Store shelf price and any struck-through regular price separately. Whether to include sale prices is a methodological choice; you cannot make it later without both.
Product identifier and description
Retailer ID plus a normalised description, brand and size. Used to match the same product over time and detect relaunches.
Pack size and unit price
Shrinkflation is a price change. Unit price lets you see it when the shelf price did not move.
Category mapped to COICOP
Mapping each product to the classification used by consumer price indices lets you weight your index like the official one.
Availability / out-of-stock
A product that disappears and returns is not a new product, and stock-outs are themselves a signal of supply pressure.
Retailer, market and exit country
Which market the price was served for. The core of any cross-country comparison, including law-of-one-price work.
Collection timestamp
Lets you check that collection time did not drift, and align daily series across markets in different time zones.

How it runs

How a collection run works

  1. 01

    Define the basket and the retailers per market

    Pick retailers with a large share of online sales per market and the categories you can cover well online. Map categories to COICOP so official expenditure weights can be applied.

  2. 02

    Collect category listings, not just product pages

    Category listing pages carry prices for dozens of products in one request. Use them for the daily price sweep and open product pages only for new items, attribute changes and size checks.

    Daily sweep, one market per pool, fixed start time
    import datetime as dtimport httpxPROXY_HOST, PROXY_PORT, PASSWORD = "proxy.arcproxies.io", 8000, "PASSWORD"MARKETS = {"de": ["https://shop.example.de/c/dairy?page={n}"],           "fr": ["https://shop.example.fr/c/produits-laitiers?page={n}"]}def proxy_for(country: str) -> str:    user = f"USERNAME_pool-arc_country-{country}"    return f"http://{user}:{PASSWORD}@{PROXY_HOST}:{PROXY_PORT}"def sweep(country: str, pages: int = 10):    stamp = dt.datetime.now(dt.timezone.utc).isoformat()    with httpx.Client(proxy=proxy_for(country), timeout=30) as client:        for template in MARKETS[country]:            for n in range(1, pages + 1):                r = client.get(template.format(n=n))                yield country, stamp, r.status_code, r.text
  3. 03

    Match products over time and flag relaunches

    Match on retailer ID first, then on brand, description and size for items whose ID changed. Flag a new ID with the same description and a different size or price as a candidate relaunch for review.

  4. 04

    Compute the index

    Build elementary indices per category and retailer with a chained formula, then aggregate with expenditure weights. Keep sale and regular-price versions so the choice can be revisited.

  5. 05

    Monitor coverage every day

    Track products collected, matched and missing per retailer per day. A sudden drop is a collection fault until proven otherwise, and the index for that day should be flagged.

Setup

Recommended setup

A price index needs a steady, boring, daily collection. Put it on the cheapest pool that holds the market and keep it there.

PlanRoleSessionTargetingPrice
ARC Basic
Rotating ISP
Default for the daily sweep
Category and product pages are mostly HTML. Our lowest price per GB, with country targeting in 185+ countries and city targeting on the published metro list.
RotatingCountry, city where retailers price regionally
€0.75 / GB
€0.59 at 1 TB (−21%)
ARC Fast
Rotating residential
For retailers that serve differently to hosting ranges
Residential exits for the retailers that fail on ISP addresses. A sticky handle keeps a category's pagination on one IP so the ordering stays consistent.
Sticky, 10 minutes per categoryCountry + city
€2.00 / GB
€1.12 at 1 TB (−44%)

Prices are list prices in EUR, excl. VAT. Volume discounts apply automatically at checkout — full ladder on the pricing page.

Connect

One connection string per market

The country, city and sticky session are tokens in the username. Change the token, change the market; keep the session handle, keep the IP.

sticky · Germany · 10 min
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000

Swap _country-de for any market you quote. The full grammar is on the residential proxies page.

Illustration

What a daily index across three markets costs

An illustration with round numbers — your pages, payloads and retry rate will differ. The arithmetic is the real price ladder.

Assumptions

Markets
3 (e.g. DE, FR, IT)
Category listing pages per day
30,000 at 120 KB
Product pages per day (new or changed)
10,000 at 120 KB
Images
blocked
Cadence
daily, 30 days
Bandwidth per month
≈ 144 GB

On ARC Basic

€97.92per month, excl. VAT

144 GB bought in one purchase at €0.68 / GB (−9% volume rung, applied automatically).

The same 144 GB on ARC Fast: €195.84 at €1.36 / GB. Route only the jobs that need it through the pricier pool.

A historical backfill is not possible for prices: there is nothing to re-fetch for yesterday. That makes gaps permanent, and it is why the money is better spent on a reliable daily sweep than on a heavier one.

Bandwidth never expires, so a bigger single purchase is only ever cheaper per GB. See the ladder.

In depth

Online price indices, in depth

Who builds price indices from online prices

The best-known example is MIT's Billion Prices Project, started in 2008. By 2010 it was collecting 5 million prices every day from over 300 retailers in 50 countries, and Cavallo and Rigobon show how such data can be used to build daily price indexes in multiple countries. The project began with Argentina, where online prices collected daily from large retailers showed inflation diverging from the official figures between 2007 and 2015.

Official statisticians adopted the method for parts of the basket. Eurostat published practical guidelines on web scraping for the Harmonised Index of Consumer Prices in 2020; in the accompanying questionnaire, some 20 responding countries were already using web scraping, though some only in testing. The ECB has described scanner and web-scraped data as giving far more price observations, more frequent recording and better coverage of shopping days, with challenges such as relaunched products and volatility.

Which items statistical offices scrape most

The 2020 Eurostat and ECB questionnaire lists the items countries scrape most often. It is a useful map of where online prices are representative:

COICOP codeItem
0312Garments
0321Shoes and other footwear
053Household appliances
07112Second-hand motor cars
07311Passenger transport by train
0733Passenger transport by air
08202Mobile telephone equipment
09131Personal computers
0951Books
096Package holidays
11201Hotels, motels, inns and similar

Travel items on that list behave like fares rather than shelf prices: they depend on booking date, departure date and point of sale. The travel fare aggregation pages cover those mechanics.

Are online prices the same as in-store prices?

Mostly, but not always. Cavallo compared online and offline prices at 56 large multi-channel retailers in 10 countries and found price levels identical about 72% of the time for products sold in both channels. The match varied by country and sector, which is why a published index should state which retailers and categories it covers.

For a nowcast, the more important property is that online and offline prices tend to move together. Validate against the official CPI component for each category before you rely on a category, and drop the ones that do not track.

An index is a different job from competitive price tracking. A retailer watching rivals wants every product and every change within hours; an index wants a stable, representative basket measured the same way every day. If you need the former, see price monitoring and grocery price tracking.

Collection practice: the statistical offices' netiquette

Eurostat's guidelines set out a netiquette for scraping prices that is worth adopting whether or not you are a statistical office:

  • Identify the scraper in the user-agent string.
  • Leave a sufficient pause between requests, for example one second, so servers are not overloaded.
  • Run at night or off-peak, while checking that prices do not differ by time of day.
  • Respect the robots exclusion protocol where a site uses it.
  • Read and respect the site's terms, which may include a no-automated-scraping clause.

A rotating pool spreads load and keeps a missed request from becoming a missed day, but it does not change the courtesy owed to each site. See handling 429 rate limits and the alternative data page for the general setup.

Works with anything that takes a proxy URL

  • Python requests / httpx
  • Scrapy
  • Go net/http
  • Docker
  • n8n

FAQ

Questions

Something not covered? Write to contact@arcproxies.io.

Can web-scraped prices be used to measure inflation?

Yes, for the goods that are sold online. MIT's Billion Prices Project built daily inflation indices from online prices in many countries, and in a 2020 Eurostat and ECB questionnaire some 20 countries reported using web scraping for consumer price statistics. Services, rent and utilities are poorly covered online.

Do online prices match what shops charge in store?

Often. A study of 56 large multi-channel retailers in 10 countries found online and offline price levels identical about 72% of the time, with variation by country and sector. Validate each category against the official index before relying on it.

How do I handle discontinued and relaunched products?

Match products by retailer ID and then by brand, description and pack size, and flag new IDs that look like an existing product with a different size or price. Treat those as possible relaunches, since a relaunch at a higher price can hide inflation if it is counted as a new product.

Why do I need exits in each country for a price index?

Because retailers price, stock and redirect by visitor location. Collecting each market from an exit inside it keeps the series about that market's prices rather than a cross-border shop or a redirect, and keeps the markets comparable to each other.

How much bandwidth does a daily price index use?

With images blocked and prices collected mainly from category pages, 40,000 page fetches a day at about 120 KB comes to around 144 GB a month. Collecting from listing pages rather than individual product pages is the biggest saving.

Get started

Buy a gigabyte and try it on your own targets.

No subscription, no sales call. Code WELCOME15 takes 15% off your first purchase, and whatever you do not use is still there next quarter.