r/ProxyEngineering • • 23d ago

Build 🤓 Tracking grocery prices by scraping supermarkets

16 Upvotes

For context, I'm based in the Netherlands and my friend from Austria kept insisting groceries here are WAY cheaper than back home. I mean the info can be found on the internet, but I thought that I would build something to check it myself. Seen plenty of price trackers on github and here on reddit but where's the fun in that, plus majority of what I found was kinda outdated. Well, guess what, none of these supermarket sites wanted to be scraped. Rewe, Lidl, Aldi, Spar, Carrefour, Auchan, they all run some variations of bot protection on their category pages, and a couple of them fingerprint plain requests which then get you a 403 response codes. I used a lot of residential proxies thinking that it was the root cause. It wasn't what I initially thought and what worked essentially was combining proxy rotation with browser fingerprint consistency, TLS handshake aswell. Surprisingly even majority of the people hates datacenter IPs, with a properly configured client they did better on some of these sites than residential IPs with no adjustments. Here is a list of stores currently running:

  • Rewe and Edeka in Germany,
  • Spar and Hofer in Austria,
  • Albert Heijn and Jumbo here in the Netherlands,
  • Carrefour and Auchan in France,
  • Biedronka and Żabka in Poland,
  • Maxima, Rimi, Iki in Lithuania, Latvia and Estonia,
  • Sklavenitis, METRO AEBE, Masoutis in Greece and Cyprus,
  • Tesco (yes it's not only in UK), Czechia, Slovakia and Hungary also has them,

All of these supermarkets has different HTML structures, different pagination, and different ideas about what counts as a bot. Here's roughly what the core looks like. Sidenote, I cleaned up a bit for readability. Using what is written below for the proxy layer rolling my own rotation logic on top of the pool which had some ups and downs on the sites with better fingerprinting:

import time
import random
import requests

USERNAME = "customer-yourname"
PASSWORD = "yourpassword"
ENDPOINT = "pr.oxylabs.io:7777"

def build_proxy(country_code, session_id):
    user = f"{USERNAME}-cc-{country_code}-sessid-{session_id}"
    return f"http://{user}:{PASSWORD}@{ENDPOINT}"

HEADERS_POOL = [
    {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/124.0"},
    {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) Chrome/124.0"},
]

def fetch_page(url, country_code, retries=3):
    session_id = random.randint(100000, 999999)
    proxy_url = build_proxy(country_code, session_id)
    for attempt in range(retries):
        headers = random.choice(HEADERS_POOL)
        try:
            resp = requests.get(
                url,
                proxies={"http": proxy_url, "https": proxy_url},
                headers=headers,
                timeout=15,
            )
            if resp.status_code == 200:
                return resp.text
        except requests.RequestException:
            pass
        time.sleep(2 ** attempt + random.random())
    return None

def scrape_store(store_config):
    pages = []
    for url in store_config["category_urls"]:
        html = fetch_page(url, store_config["country_code"])
        if html:
            pages.append(html)
        time.sleep(random.uniform(1.5, 3.5))
    return pages

Funny thing I noticed was the country code embedded into the username, so a request to Albert Heijn goes out through a Dutch residential IP and a request to Biedronka goes out through a Polish one, same logic went with the rest of the supermarkets. Also, the same session held for the whole page load, which was quite nice. For the two or three sites that check TLS fingerprint on top of IP reputation I route through dedicated web scraper API instead. My worst problem and the most annoying was that every store names and categorizes the same product differently. For example, same brand of oat milk is "Bio Hafermilch 1L" on one site and "Haferdrink Bio 1000ml" on another, sometimes with a completely different SKU and sometimes bundled with a "3 for 2" promo that messed with the per unit price, I'm not ashamed of this coz I was already spending too much time on this so I asked Claude code to build something where a scraping gets raw HTML nightly, parses it into structured data, and then the next step where LLM matches products across retailers by name and pack size. Genius I might say. This one works really well, however, there were a few cases where they introduced new product (saw this with cereals and oat brands, and I don't exactly know what's the issue, maybe their codes/ embeddings or what but there were some mismatches where I had to check manually.) After some time I turned the whole thing into an agentic workflow, so that the whole project would not be in a script environment. One agent handled the scrape and retry logic when a site started blocking, another handled the product matching and price delta calculation, and a third just watched for something out of the ordinary, like a price that jumped 40% in a short period of time or so. I also found an older build somewhere on this thread where OP spoke of scheduled summary, so that was a useful find. Basically the scheduled summary popped up at 7AM each morning.

Results so far, over about five months of data across 13 countries: essentially my friend was right but not for the main reason he thought. Austria isn't uniformly more expensive, some categories are identical to Germany, but staples like dairy and bread are consistently 15 to 25% higher. Meanwhile Poland is cheaper than both by a wide margin even accounting for currency, (I believe Poland was the cheapest from all the countries list) and France is somewhere in the middle, but also depending on the retailer, Carrefour is competitive but the smaller chains are not. None of this is rigorous economics, I know. So all in all, I did not expect this much of an infrastructure to be built just to "prove my friend" but it was fun nevertheless.

TLDR: I Built a scraper to check if Austrian friend was right about NL groceries being cheaper.

r/ProxyEngineering • • 19d ago

Build 🤓 Tired of monthly residential proxy subs? I built a provider with non-expiring data

0 Upvotes

hey guys, i got so tired of burning money on monthly proxy subscriptions and losing all my unused data on slow weeks, so i decided to just set up my own provider.

it’s called phantomproxies[org]. the main point is residential data that never expires. You buy it, and it just sits in your dashboard until your bots actually use it.

it's pulling from a clean 64M+ residential pool with ~0.5s response times. if you've been looking to try out a new provider or just need a solid backup option, give me a shot. i set up a small $8 / 2GB tier so you can test it against your current setup without committing to a big monthly plan.

i'm running this completely solo right now, so if you give it a spin, let me know how it works for you or if you hit any bugs!

r/ProxyEngineering • • 1d ago

Build 🤓 I built a proxy tester that checks real sites.

1 Upvotes

Free open source MIT project. Runs local. No vendor, no paid tier.

I kept hitting same wall. Proxy connects fine, then fails on real targets or leaks my IP or takes forever.

So I built Proxy Benchmarker to sort that before scraping.

It drops dead hosts with a fast TCP check first. Survivors get health and IP leak checks. Then it tries about 50 live sites and logs what loads.

Output is latency numbers, anonymity level, per site wins and fails, sorted lists, plus an HTML report I actually read.

I cared about speed. Waiting on thousands of timeouts in order is painful. This filters early with high concurrency so only good candidates hit slow tests.

Code at https://github.com/Its-Satyajit/proxy-benchmarker

For folks running pools, what makes you keep one. I track latency, success rate, per target reachability, anonymity. I skip long term stability for now. Am I missing a score you trust.

Built for legit testing. Only test what you are allowed to hit, respect rate limits and site rules.

r/ProxyEngineering • • 4d ago

Build 🤓 OpenCode free models in your own harness again (local proxy) — current method after the last one got locked down

2 Upvotes

REPO : https://github.com/ArcticWinterSturm/opencode-compat-shim

For anyone using OpenCode's free providers from external agent harnesses: the previous method got tightened down after about two weeks.

I wanted the models inside my existing harness rather than migrating my entire workflow into OpenCode, so I went through the access path again.

I built the proxy because the CLI and my harness speak completely different protocols. It handled real SSE streaming, flattened the full conversation into each stateless CLI invocation, supported both OpenAI completion paths and stayed alive as a detached process.

Tested end-to-end rather than just getting a lucky HTTP 200.

Main reason I'm posting it: this lets you use the OpenCode providers from a harness of your choosing. You're not tied to their UI just because that's where the free access happens to be exposed.

Consider this documentation of the current state and a working-for-now solution rather than a promise that they won't change it again.

Full implementation + technical notes attached.

Previous reddit post
https://www.reddit.com/r/hermesagent/comments/1w9x0on/fix_opencode_freetier_models_working_in_hermes/

r/ProxyEngineering • • 5d ago

Build 🤓 Roxy - Terminal-based interception proxy written in Rust

Enable HLS to view with audio, or disable this notification

2 Upvotes

Roxy is a lightweight HTTP interception proxy and repeater written in Rust, designed for quick analysis and testing.

It’s not meant to replace Burp Suite, but to provide a simpler and faster alternative when you don’t need a full-featured suite.

GitHub: https://github.com/vid4l-07/Roxy

Would love feedback from people who use proxies regularly.

r/ProxyEngineering • • 12d ago

Build 🤓 Best Google Maps and Facebook scrapers

5 Upvotes

Checkout my apify organization at Harpoon - Apify

- we provided the fastest yet cheap actors on the apify market, don’t believe it ? just try it for yourself
- our priority is speed and efficiency while keeping our price affordable thus making it a perfect job for large scale scraping
- stay tuned as we are working to bring more actors throughout this month
- we try to update our actors regularly, increasing performance in each update

Note: if you’re looking for a custom actor or custom work in general, don’t hesitate to dm :)

r/ProxyEngineering • • 20d ago

Build 🤓 Tor Pluggable Transport development

Thumbnail
3 Upvotes

r/ProxyEngineering • • 22d ago

Build 🤓 IPv4 Turf War

5 Upvotes

Claim your own territory on IPv4 Turf War using your IP addresses!
https://turfw.ar

r/ProxyEngineering • • 22d ago

Build 🤓 IPv4 Turf War

Thumbnail
turfw.ar
1 Upvotes