Web Scraper API - Anti-Bot Profile Selection, BYO Proxy avatar

Web Scraper API - Anti-Bot Profile Selection, BYO Proxy

Pricing

Pay per usage

Go to Apify Store
Web Scraper API - Anti-Bot Profile Selection, BYO Proxy

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

Fenlo AI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

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

FieldTypeDefaultDescription
urlstringThe URL to fetch.
proxystringYour own proxy URL, e.g. http://user:pass@host:port. Optional.
extract_textbooleanfalseAlso 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

  1. A lightweight probe detects the site's anti-bot stack.
  2. The detection engine's recommended request profile for that stack is selected automatically.
  3. 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-*.whl
uv build --wheel packages/engine -o dist
cp dist/fenlo_engine-*.whl actors/stealth-scraper/
# From inside this Actor dir (context = ".")
cd actors/stealth-scraper
docker build -t fenlo-stealth-scraper .

The Dockerfile (referenced from .actor/actor.json) then:

  1. installs the vendored engine with pip install fenlo_engine-*.whl, and
  2. 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.