Web Scraper API - Anti-Bot Profile Selection, BYO Proxy
Pricing
Pay per usage
Web Scraper API - Anti-Bot Profile Selection, BYO Proxy
Best-effort page fetcher that runs a quick anti-bot recon, auto-selects the matching engine request profile, and fetches the page through your own proxy. Returns HTML length, detected stack, and latency.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Fenlo AI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Share
Web Scraper API — Auto Anti-Bot Profile Selection (Bring Your Own Proxy)
A best-effort page fetcher that first runs a quick anti-bot recon, then auto-selects the detection engine's matching request profile, and fetches the page through your proxy.
There is no promise of access. If a site blocks the request, that blocked response is what you get back — this Actor makes a best-effort fetch and reports the outcome; it does not claim to get past any defense.
Input
| Field | Type | Default | Description |
|---|---|---|---|
url | string | — | The URL to fetch. |
proxy | string | — | Your own proxy URL, e.g. http://user:pass@host:port. Optional. |
extract_text | boolean | false | Also return best-effort plain text extracted from the HTML. |
Output
{"html": "<!doctype html><html>...</html>","html_length": 13407,"stack": "cloudflare","latency_ms": 842,"text": "..."}
html is the full fetched page markup. text (best-effort plain text) is present
only when extract_text is true.
Bring your own proxy
This Actor exposes a single proxy parameter by design. It has no proxy pool and no rotation — supply whichever proxy you already use.
How it works
- A lightweight probe detects the site's anti-bot stack.
- The detection engine's recommended request profile for that stack is selected automatically.
- A single browser fetch is made through your proxy; the Actor returns the fetched page HTML, its length, the detected stack, and the round-trip latency (plus optional plain text).
For detection-only profiling across many URLs, see the companion recon-meta Actor.
Build & deploy
This Actor is self-contained: the Docker build context is this Actor folder.
Apify confines the build context to the Actor's own directory, so a COPY cannot
reach outside it.
This Actor depends on the repo-local fenlo_engine package (source at
packages/engine — outside this folder). Because Docker cannot COPY across
folders, the engine is vendored here as a pre-built pip wheel
(fenlo_engine-*.whl). Build the wheel into this folder first, then build the
image with this folder as the context:
# From the repo root: build the engine wheel into a throwaway dist/ and copy it# into this Actor dir. Do NOT use `-o actors/stealth-scraper`: `uv build` writes a# `.gitignore` containing `*` into its output dir, which would re-ignore this# Actor's .actorignore and break `apify push`. dist/ is already git-ignored.rm -f actors/stealth-scraper/fenlo_engine-*.whluv build --wheel packages/engine -o distcp dist/fenlo_engine-*.whl actors/stealth-scraper/# From inside this Actor dir (context = ".")cd actors/stealth-scraperdocker build -t fenlo-stealth-scraper .
The Dockerfile (referenced from .actor/actor.json) then:
- installs the vendored engine with
pip install fenlo_engine-*.whl, and - installs this Actor's
requirements.txt(the Apify SDK),
so import fenlo_engine resolves inside the container. The base image is
apify/actor-python-playwright, which ships the Chromium build this Actor uses
for its browser fetch.
Trade-off: the wheel is a vendored copy, so rebuild it whenever
packages/engine changes (otherwise the Actor ships a stale engine). The wheel
is git-ignored; a .actorignore re-includes it so apify push still uploads it.
To publish on Apify: cd actors/stealth-scraper && apify push (rebuild the wheel
first). See docs/launch/PUBLISH.md.


