▲ 21 r/ProxyEngineering+2 crossposts

Another day, another project

ok so this is gonna be long sorry in advance, but I spent my precious weekend comparing n8n scraping workflows against just writing the damn scraper in Python and I have some thoughts to share with yall.

Started because my unemployed friend sent me one of those "I automated my job search with n8n" posts and I was like, not with this again, there's like a million automations already created, why did you even bothered? But he somehow convinced me to try replicating something similar on my side, so basically, I had to try it. Mainly just scraping product listings off a marketplace site, turned on my n8n, dragged in an HTTP node, a Cheerio node for parsing, a loop, a Google Sheets node at the end. All it took maybe 40 minutes and it worked first try which felt great.

Like the majority of the projects I've worked on, it then started throwing Cloudflare challenges after around 600 requests and that's where it stopped feeling great. I tried putting in some cheap datacenter proxies I had lying around from an old project, didn't help much, IP reputation on datacenter ranges is just garbage on anything halfway protected these days. Switched to a residential proxy pool instead and got further but still kept tripping something, which is when I remembered the IP is only half the story, the actual fingerprint matters just as much if not more. (take notes folks).

So I go to fix it in n8n and immediately went full stop, everyone who's done this before already knows about, which is that the visual nodes are amazing for the happy path and genuinely miserable the second you need anything custom. wanting to rotate user agents with actual entropy, not just a static list cycling in order. wanting real TLS fingerprint control so your handshake doesn't scream "I am a script" before you've even sent the request, wanting a headless browser session that actually behaves like a person scrolling and pausing instead of firing requests like a machine gun. none of that is a drag and drop node, you end up writing it in a Code node anyway which is just JavaScript wearing a costume, so you've reinvented half a script but now it lives inside someone else's execution engine and you can't easily version control it or run it locally without spinning up the whole n8n instance.

Compare that to just opening a .py file. requests or httpx if you want async, curl_cffi if the site's fingerprinting you (and these days almost everything past a certain traffic volume is), playwright if you actually need a full headless browser for JS rendered pages. yeah you're typing more in the first 20 minutes, but every single thing is yours, testable, debuggable with an actual setup trace instead of n8n's execution log that sometimes just says "error" and leaves you to guess. and when the scraper needs to scale, you're not paying per execution or fighting workflow timeout limits, you just run more processes or throw it on a queue.

At some point I just gave up taking care of proxy rotation and fingerprint config by hand and pointed the whole thing at a web scraper api instead, basically it felt a little like cheating at first but also I have a day job and the marginal value of me personally maintaining a TLS impersonation layer is zero. Aso tried doing a rough version of the same job in Go for comparison because why not, and that one was interesting for a totally different reason, the speed difference on concurrent requests was kind of stupid honestly, noticeably faster spinning up a thousand goroutines than even async Python, but the dev time to get there was longer and if you're not already comfortable with the language you'll burn an evening just on syntax instead of solving the actual scraping problem. so it's not really "Go is better" it's "Go is better if you already know Go and need raw throughput". One thing I didn't expect going in, mobile proxies actually outperformed residential on a couple of the trickier targets, something about carrier grade NAT making the IP reputation look cleaner since thousands of real phones share the same address anyway. didn't bother testing ISP proxies for this particular target since the site wasn't doing heavy ASN level scrutiny, but I've used them before on stuff where you want the static IP of a datacenter with the trust level of residential, good middle ground when rotation isn't what you need.

Then I poked at a search api for a side piece of this project, pulling SERP results instead of crawling category pages directly, and that ended up being way less of a headache than the rest of the whole ordeal combined, search engines have their own blocking logic obviously but it's a more solved problem than random ecommerce sites running custom bot detection.

What I keep landing on is it's basically a compromise between time to first result and ceiling. n8n wins time to first result by a mile. Python wins ceiling, not even close. Go wins ceiling even further out but only if speed at scale is actually your bottleneck and not, like, getting blocked every 400 requests or so regardless of how fast you can send them, which honestly is the actual bottleneck like 90% of the time, not raw speed.

Anyway I ended up keeping the n8n workflow for the parts that are basically just data movement, sheets, notifications, scheduling, and ripped the actual fetching logic out into a standalone Python script that n8n just calls and waits on. feels like the right choice.

Gotta hand it to my friend, while his solution was probably one of those in the million, this gave me a chance to try out different languages for scraping and whatnot.

Perhaps someone else found a way to make the no code route hold up against fingerprint based blocking, because every workaround I tried inside n8n itself felt like duct tape on duct tape and rinse and repeat.

TLDR: Spent a weekend comparing n8n scraping workflows against Python and Go for the same job, and n8n wins on speed to a working prototype but falls apart fast once a site starts fingerprinting you past basic IP checks. Tried datacenter proxies first (useless), then residential and even mobile proxies (mobile actually did better on a couple targets), but eventually just routed everything through a web scraper api since maintaining fingerprint evasion by hand wasn't worth my time. Python gave way more control for the actual scraping logic while Go only made sense if raw concurrent throughput was the bottleneck, which it usually wasn't compared to just getting blocked. Ended up keeping n8n for the boring data movement parts (sheets, notifications, scheduling) and pulled the real scraping into a standalone script it just calls.

reddit.com
u/WarAndPeace06 — 6 days ago
▲ 28 r/ProxyEngineering+3 crossposts

Web Search API for AI Agents

Did you guys noticed how nobody talks about the search layer? From what I gathered, every AI agent tutorial obsesses over prompt engineering and tool variety, but the thing that determines whether your agent is useful is how it gets data from the web, rarely someone mentions or even provides decent information about it. Basically, my thoughts are that an AI agent is only as good as the information it can pull in. Simple as that. Best reasoning model in the world wont help if the search layer feeds it garbage or truncated snippets. Thats where a web scraper API comes in. Instead of scraping Google directly and fighting CAPTCHAs, layout changes, and anti-bot walls, you get a simple endpoint that returns structured JSON. Titles, URLs, snippets, sometimes full page content. Some providers also return knowledge panels, "people also ask" sections, even shopping results depending on the query. If you used any scraper, you know what I'm on about. Now for AI agents specifically, the change is that data comes back in a format the LLM can literally work with. No token budget wasted on HTML parsing. Agent sends a query, gets structured results, reasons over them, decides what to do next. No headless browser, no DIY scraping combos that stop working every two weeks or whatever. There are a bunch of providers right now. SerpAPI, Tavily, Exa, Firecrawl, Brave Search API, Serper, others. They take diffrent approaches. Some focus on raw SERP data exactly as it appears on the results page. Others are built specifically for LLM use cases, so they prioritize returning clean extracted content rather then just links or even better the whole info in markdown. That distinction matters alot depending on what the agent needs to do. Where I found it interesting is combining a search API with a content extraction. Agent searches, picks the most relevant results, then pulls full content from those pages in a structured format. That two-step workflow is way more reliable then trying to do everything in one shot. And its basically what tools like Perplexity do under the hood, except you get full control. Caching is worth thinking about too. Most of these APIs charge per request, and agents loop. A ReAct agent might send three or four searches before arriving at an answer. Without caching that adds up fast, both in cost and latency. A single search call taking 3-4 seconds is fine on its own. Chain a few together and the user is waiting 15 seconds or more. Which may sound like nothing, but the seconds adds up overtime. I strongly believe that this space is going to get way more competitive soon. As more people build agents that need real-time web access, demand for fast, accurate, affordable web scraping services is only going up. What you peeps think?

reddit.com
u/WarAndPeace06 — 18 days ago
▲ 6 r/ProxyEngineering+1 crossposts

Anyone else find local search becoming the bottleneck once your LLM setup gets fast enough?

Got my Llama 3 setup humming along on a 4090, inference is snappy, but retrieval became the hell. Running semantic search over a decent-sized document corpus and the latency gap between "model thinking" and "model waiting for context" started flipping. I have tried the usual local options first. FAISS is fine up to a point, but keeping embeddings fresh over anything web-scale means you're basically maintaining a scraper, an indexer, and an embedding pipeline just to answer "what's new." I eventually started routing retrieval through a real-time search API instead. The difference was noticeable, not just in latency but in answer quality, because the model is working with actually current results rather than whatever my last index refresh captured. For anything time-sensitive, a fast search API is kind of doing the job that a perfect local index never really can. Now the stack feels balanced. Inference local, retrieval delegated. Less to maintain and of course better outputs. Does anyone else split it this way or are you going fully self-hosted end to end? Feels like the community talks a lot about inference hardware but the retrieval layer gets way less attention or at least these posts completely missed me

reddit.com
u/WarAndPeace06 — 28 days ago
▲ 25 r/ProxyEngineering+3 crossposts

Boring part of the job? No more

Yo, I automated a boring part of my job and few months later I was reading academic papers on browser fingerprinting. Too good to be true? I work in procurement. Not engineering, not data science, as the most of you. Basically what I do is that I am buying things for a company at the best price possible. A big part of that is knowing what things cost across different suppliers at any given time. For a while I did this manually. Open the page, check the price, write it down, move to the next one. We have around 60 something suppliers. Did it every week without really questioning whether there was a better way. Well, there kinda is, and we do it with few other suppliers, custom pricing/ solutions, but not everyone is on this.

A friend showed me a basic Python script she'd written for something unrelated and I just asked her to help me build something similar for my use case. We spent two weekends on it. By the end I had something that checked all 60 ish suppliers automatically and dumped the results into a spreadsheet I could actually read. The whole thing ran in about 1 minute. I felt unreasonably good about this for at least three weeks. Then about a month in, maybe 20 suppliers started returning garbage. Blank pages, incorrect responses, few of them were clearly serving me a fake version of the page with no actual pricing on it. The goods were there, but the rest of the info that I needed was not. I thought that the script was broken and inquired my friend about it. We spent another weekend trying to fix the script that wasn't the problem. (But we didn't know at the time). Eventually we found out what was happening. The sites were detecting that requests were coming from a script and were either blocking them or serving different content intentionally. I went down the proxy rabbit hole like apparently everyone here does. Bought a residential proxy plan, assumed that would fix it, it fixed some of the problems. The other problems kept blocking me and we couldn't figure out why the same solution worked on some sites and not others.

What we eventually understood, after a lot of reading and a lot of failed attempts, is that IP address is almost the least interesting thing these detection systems are looking at. What builds a picture of whether you're a real user is everything else. The WebGL renderer string your browser reports, and whether it stays identical across every single session, because real browsers on real hardware have subtle variance. Canvas fingerprint noise and specifically how that noise behaves over time, not just whether it exists. Whether your session claims to be on a mobile device but has no gyroscope data, no accelerometer readings, touch events that land too precisely and fire at intervals that are too regular. Real people using real phones are physically sloppy. The way my thumb hits a screen is not reproducible to the millisecond and detection systems have apparently learned to look for exactly that kind of messiness as a signal of legitimacy. (I did hope that after a lot of research and reading this was the case). The timezone I was declaring in my headers didn't match where my DNS resolver was actually located. That gap alone is apparently a meaningful signal on some of the more sophisticated systems. Everything about a real user's session tends to be internally consistent without trying to be. Everything about an automated session tends to be inconsistent in ways that only become obvious when you look at all the signals together.

The ASN issue took me and my friend the longest to understand. I had switched to a different proxy provider after the first one wasn't working well enough and the new one had good reviews and genuinely residential IPs, or so I thought. But I was still getting blocked on two specific supplier sites at a much higher rate than the others. Took me a while to figure out that the provider I was using had most of their IP pool concentrated in three ASNs. The IPs were residential, technically, but those three autonomous system numbers had such a high ratio of bot traffic to human traffic running through them that the ML models these sites used had already learned to treat them with suspicion. A Comcast IP out of AS7922 and a Spectrum IP out of AS20001 can behave completely differently on the same target not because one is inherently better but because of what the traffic history coming out of those specific ASNs looks like to a model that has been watching for a while. I checked the ASN distribution of the provider I was using. More than half their residential pool resolved to the same two ASNs. Apparently, that's not what real user traffic looks like. Real users in any city are spread across dozens of ISPs and hundreds of ASNs. When your scraping traffic doesn't approximate that distribution the math gives you away before the session even does anything suspicious.

I'm still in procurement. I still buy things for a company. But I now have a reasonably detailed understanding of browser fingerprinting, autonomous system routing, and mobile connection latency variance that I genuinely did not expect to acquire when I started trying to automate a tiresome morning task. The script works now. All sixty ish suppliers, consistent data, runs while I'm making my morning matcha. It took few months of intermittent frustration to get there and I learned more about how the web actually works in those months than in the previous decade of using it. There's always room for knowledge if you are willing to invest your time in research and testing.

If you're just starting out, hopefully this saves you some of the time I wasted. If you've been doing this for a while, you probably lived through most of this yourself already

reddit.com
u/WarAndPeace06 — 1 month ago
▲ 14 r/ProxyEngineering+1 crossposts

Self-hosted log aggregation for a small homelab?

I'm trying to set up centralized log collection for my homelab, currently running about 8 machines across a mix of Proxmox VMs and bare metal. I've looked at hosted solutions like Datadog and Logtail, but I want something I control entirely, ideally without phoning home or requiring a cloud account. How I imagine it to be: open-source, lightweight enough to run on a small NUC, supports structured logs (JSON), and has a decent query UI. Grafana Loki keeps coming up, is it actually usable at this scale, or is it overkill? If you've moved away from ELK because of resource usage, I'd like to know more. All suggestions are welcome

reddit.com
u/WarAndPeace06 — 2 months ago
▲ 16 r/ProxyEngineering+2 crossposts

Http3 residential proxies

Has anyone had any luck with them? Particularly scraping? How is the success rate compared to regular http/https or socks5

reddit.com
u/WarAndPeace06 — 2 months ago