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

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

Pricing

from $500.00 / 1,000 page fetches

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

from $500.00 / 1,000 page fetches

Rating

0.0

(0)

Developer

Fenlo AI

Fenlo AI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days 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.