
One TLS handshake predicts the whole anti-bot stack
When I size up a new website I used to start with headers. Copy them out of DevTools, match the...
Tag archive

When I size up a new website I used to start with headers. Copy them out of DevTools, match the...
Most browser automation examples start with selectors. Find the button, identify the input, write the...
I built a small web scraping framework in Rust, mostly with an AI doing the typing. It's called...
The default for a first scraper is usually printing to stdout or dumping everything into a JSON...
When a requests.get() call returns a 403, or a 200 with an "Access Denied" body, the first instinct...
The HTML that requests downloads is what the server sends before any JavaScript runs. For a large and...
Pagination is where a lot of scrapers quietly go wrong — not with errors, but with missing data. A...

There is a version of this project that is not worth doing. If you need browser rendering for a...
Empty-field-rate monitoring catches selectors that return nothing. It does not catch selectors that...
Most scraper failures don't raise exceptions. The spider finishes, the pipeline writes a file, the...
You write a scraper, test your selectors in the browser, and everything looks right. Then you run...
Getting HTML off a page is only the first step. Once you have it, the real work begins: pulling out...