From bcd39d57c083a2f8e0d39935b45ac1abf9dd2ea7 Mon Sep 17 00:00:00 2001 From: Karim shoair Date: Sun, 29 Mar 2026 23:46:25 +0200 Subject: [PATCH] docs: update the agent skill with the new features Before I forget lol --- agent-skill/Scrapling-Skill.zip | Bin 81922 -> 81696 bytes agent-skill/Scrapling-Skill/SKILL.md | 12 +++-- .../references/fetching/choosing.md | 1 + .../references/fetching/dynamic.md | 19 +++++++ .../references/fetching/stealthy.md | 1 + .../Scrapling-Skill/references/mcp-server.md | 51 ++++++++++++++++-- 6 files changed, 76 insertions(+), 8 deletions(-) diff --git a/agent-skill/Scrapling-Skill.zip b/agent-skill/Scrapling-Skill.zip index cb75c55f86dd5bb4acbb3347b8f1d45202977041..987ddbdb54bfb379641ce654a9c7ae5492f23de4 100644 GIT binary patch delta 26199 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 diff --git a/agent-skill/Scrapling-Skill/SKILL.md b/agent-skill/Scrapling-Skill/SKILL.md index 85c54d9..5c187fe 100644 --- a/agent-skill/Scrapling-Skill/SKILL.md +++ b/agent-skill/Scrapling-Skill/SKILL.md @@ -346,19 +346,25 @@ async with FetcherSession(http3=True) as session: # `FetcherSession` is context async with AsyncStealthySession(max_pages=2) as session: tasks = [] urls = ['https://example.com/page1', 'https://example.com/page2'] - + for url in urls: task = session.fetch(url) tasks.append(task) - + print(session.get_pool_stats()) # Optional - The status of the browser tabs pool (busy/free/error) results = await asyncio.gather(*tasks) print(session.get_pool_stats()) + +# Capture XHR/fetch API calls during page load +async with AsyncDynamicSession(capture_xhr=r"https://api\.example\.com/.*") as session: + page = await session.fetch('https://example.com') + for xhr in page.captured_xhr: # Each is a full Response object + print(xhr.url, xhr.status, xhr.body) ``` ## References You already had a good glimpse of what the library can do. Use the references below to dig deeper when needed -- `references/mcp-server.md` — MCP server tools and capabilities +- `references/mcp-server.md` — MCP server tools, persistent session management, and capabilities - `references/parsing` — Everything you need for parsing HTML - `references/fetching` — Everything you need to fetch websites and session persistence - `references/spiders` — Everything you need to write spiders, proxy rotation, and advanced features. It follows a Scrapy-like format diff --git a/agent-skill/Scrapling-Skill/references/fetching/choosing.md b/agent-skill/Scrapling-Skill/references/fetching/choosing.md index 974b566..10ec7e8 100644 --- a/agent-skill/Scrapling-Skill/references/fetching/choosing.md +++ b/agent-skill/Scrapling-Skill/references/fetching/choosing.md @@ -71,6 +71,7 @@ The `Response` object is the same as the [Selector](parsing/main_classes.md#sele >>> page.body # Raw response body as bytes >>> page.encoding # Response encoding >>> page.meta # Response metadata dictionary (e.g., proxy used). Mainly helpful with the spiders system. +>>> page.captured_xhr # List of captured XHR/fetch responses (when capture_xhr is enabled on a browser session) ``` All fetchers return the `Response` object. diff --git a/agent-skill/Scrapling-Skill/references/fetching/dynamic.md b/agent-skill/Scrapling-Skill/references/fetching/dynamic.md index 1a4c96d..a5fa235 100644 --- a/agent-skill/Scrapling-Skill/references/fetching/dynamic.md +++ b/agent-skill/Scrapling-Skill/references/fetching/dynamic.md @@ -79,6 +79,7 @@ All arguments for `DynamicFetcher` and its session classes: | proxy_rotator | A `ProxyRotator` instance for automatic proxy rotation. Cannot be combined with `proxy`. | ✔️ | | retries | Number of retry attempts for failed requests. Defaults to 3. | ✔️ | | retry_delay | Seconds to wait between retry attempts. Defaults to 1. | ✔️ | +| capture_xhr | Pass a regex URL pattern string to capture XHR/fetch requests matching it during page load. Captured responses are available via `response.captured_xhr`. Defaults to `None` (disabled). | ✔️ | In session classes, all these arguments can be set globally for the session. Still, you can configure each request individually by passing some of the arguments here that can be configured on the browser tab level like: `google_search`, `timeout`, `wait`, `page_action`, `extra_headers`, `disable_resources`, `wait_selector`, `wait_selector_state`, `network_idle`, `load_dom`, `blocked_domains`, `proxy`, and `selector_config`. @@ -201,6 +202,24 @@ The states the fetcher can wait for can be any of the following ([source](https: - `visible`: wait for an element to have a non-empty bounding box and no `visibility:hidden`. Note that an element without any content or with `display:none` has an empty bounding box and is not considered visible. - `hidden`: wait for an element to be either detached from the DOM, or have an empty bounding box, or `visibility:hidden`. This is opposite to the `'visible'` option. +### Capturing XHR/Fetch Requests + +Many SPAs load data through background API calls (XHR/fetch). You can capture these requests by passing a regex URL pattern to `capture_xhr` at the session level: + +```python +from scrapling.fetchers import DynamicSession + +with DynamicSession(capture_xhr=r"https://api\.example\.com/.*", headless=True) as session: + page = session.fetch('https://example.com') + + # Access captured XHR responses + for xhr in page.captured_xhr: + print(xhr.url, xhr.status) + print(xhr.body) # Raw response body as bytes +``` + +Each item in `captured_xhr` is a full `Response` object with the same properties (`.url`, `.status`, `.headers`, `.body`, etc.). When `capture_xhr` is not set or is `None`, `captured_xhr` is an empty list. + ### Some Stealth Features ```python diff --git a/agent-skill/Scrapling-Skill/references/fetching/stealthy.md b/agent-skill/Scrapling-Skill/references/fetching/stealthy.md index 5708d61..4fc6e50 100644 --- a/agent-skill/Scrapling-Skill/references/fetching/stealthy.md +++ b/agent-skill/Scrapling-Skill/references/fetching/stealthy.md @@ -61,6 +61,7 @@ Scrapling provides many options with this fetcher and its session classes. Befor | proxy_rotator | A `ProxyRotator` instance for automatic proxy rotation. Cannot be combined with `proxy`. | ✔️ | | retries | Number of retry attempts for failed requests. Defaults to 3. | ✔️ | | retry_delay | Seconds to wait between retry attempts. Defaults to 1. | ✔️ | +| capture_xhr | Pass a regex URL pattern string to capture XHR/fetch requests matching it during page load. Captured responses are available via `response.captured_xhr`. Defaults to `None` (disabled). | ✔️ | In session classes, all these arguments can be set globally for the session. Still, you can configure each request individually by passing some of the arguments here that can be configured on the browser tab level like: `google_search`, `timeout`, `wait`, `page_action`, `extra_headers`, `disable_resources`, `wait_selector`, `wait_selector_state`, `network_idle`, `load_dom`, `solve_cloudflare`, `blocked_domains`, `proxy`, and `selector_config`. diff --git a/agent-skill/Scrapling-Skill/references/mcp-server.md b/agent-skill/Scrapling-Skill/references/mcp-server.md index fbe1b7d..1e18a04 100644 --- a/agent-skill/Scrapling-Skill/references/mcp-server.md +++ b/agent-skill/Scrapling-Skill/references/mcp-server.md @@ -1,8 +1,8 @@ # Scrapling MCP Server -The Scrapling MCP server exposes six web scraping tools over the MCP protocol. It supports CSS-selector-based content narrowing (reducing tokens by extracting only relevant elements before returning results) and three levels of scraping capability: plain HTTP, browser-rendered, and stealth (anti-bot bypass). +The Scrapling MCP server exposes nine web scraping tools over the MCP protocol. It supports CSS-selector-based content narrowing (reducing tokens by extracting only relevant elements before returning results), three levels of scraping capability (plain HTTP, browser-rendered, and stealth/anti-bot bypass), and persistent browser session management. -All tools return a `ResponseModel` with fields: `status` (int), `content` (list of strings), `url` (str). +All scraping tools return a `ResponseModel` with fields: `status` (int), `content` (list of strings), `url` (str). ## Tools @@ -66,10 +66,11 @@ Opens a Chromium browser via Playwright to render JavaScript. Suitable for dynam | `cookies` | list or null | null | Playwright-format cookies | | `timezone_id` | str or null | null | Browser timezone, e.g. `"America/New_York"` | | `locale` | str or null | null | Browser locale, e.g. `"en-GB"` | +| `session_id` | str or null | null | Reuse a persistent session from `open_session` instead of creating a new browser | ### `bulk_fetch` -- Browser fetch (multiple URLs) -Concurrent browser version of `fetch`. Same parameters except `url` is replaced by `urls` (list of strings). Each URL opens in a separate browser tab. Returns a list of `ResponseModel`. +Concurrent browser version of `fetch`. Same parameters (including `session_id`) except `url` is replaced by `urls` (list of strings). Each URL opens in a separate browser tab. Returns a list of `ResponseModel`. ### `stealthy_fetch` -- Stealth browser fetch (single URL) @@ -84,12 +85,51 @@ Anti-bot bypass fetcher with fingerprint spoofing. Use this for sites with Cloud | `block_webrtc` | bool | false | Force WebRTC to respect proxy settings (prevents IP leak) | | `allow_webgl` | bool | true | Keep WebGL enabled (disabling is detectable by WAFs) | | `additional_args` | dict or null | null | Extra Playwright context args (overrides Scrapling defaults) | +| `session_id` | str or null | null | Reuse a persistent stealthy session from `open_session` | All parameters from `fetch` are also accepted. ### `bulk_stealthy_fetch` -- Stealth browser fetch (multiple URLs) -Concurrent stealth version. Same parameters as `stealthy_fetch` except `url` is replaced by `urls` (list of strings). Returns a list of `ResponseModel`. +Concurrent stealth version. Same parameters (including `session_id`) as `stealthy_fetch` except `url` is replaced by `urls` (list of strings). Returns a list of `ResponseModel`. + +### `open_session` -- Create a persistent browser session + +Opens a browser session that stays alive across multiple fetch calls, avoiding the overhead of launching a new browser each time. Returns a `SessionCreatedModel` with `session_id`, `session_type`, `created_at`, `is_alive`, and `message`. + +**Key parameters:** + +| Parameter | Type | Default | Description | +|--------------------|-----------------------------|--------------|---------------------------------------------------------------------| +| `session_type` | `"dynamic"` / `"stealthy"` | required | Type of browser session to create | +| `headless` | bool | true | Run browser hidden or visible | +| `max_pages` | int | 5 | Max concurrent browser tabs (1-50) | +| `proxy` | str or dict or null | null | Proxy for all requests in this session | +| `timeout` | number | 30000 | Default timeout in ms | +| `solve_cloudflare` | bool | false | (Stealthy only) Auto-solve Cloudflare challenges | +| `hide_canvas` | bool | false | (Stealthy only) Canvas fingerprint noise | +| `block_webrtc` | bool | false | (Stealthy only) Block WebRTC IP leak | +| `allow_webgl` | bool | true | (Stealthy only) Keep WebGL enabled | + +Plus all other browser session parameters (`google_search`, `real_chrome`, `cdp_url`, `locale`, `timezone_id`, `useragent`, `extra_headers`, `cookies`, `disable_resources`, `network_idle`, `wait_selector`, `wait_selector_state`). + +A dynamic session can only be used with `fetch`/`bulk_fetch`. A stealthy session can only be used with `stealthy_fetch`/`bulk_stealthy_fetch`. + +### `close_session` -- Close a persistent browser session + +Closes a session and frees its browser resources. Always close sessions when done. + +| Parameter | Type | Default | Description | +|--------------|------|----------|----------------------------------| +| `session_id` | str | required | Session ID from `open_session` | + +Returns a `SessionClosedModel` with `session_id` and `message`. + +### `list_sessions` -- List active sessions + +Returns a list of `SessionInfo` objects, each with `session_id`, `session_type`, `created_at`, and `is_alive`. + +No parameters. ## Tool selection guide @@ -101,8 +141,9 @@ Concurrent stealth version. Same parameters as `stealthy_fetch` except `url` is | Multiple JS-rendered pages | `bulk_fetch` | | Cloudflare or strong anti-bot protection | `stealthy_fetch` (with `solve_cloudflare=true` for Turnstile) | | Multiple protected pages | `bulk_stealthy_fetch` | +| Multiple pages from the same site | `open_session` + `fetch`/`stealthy_fetch` with `session_id` | -Start with `get` (fastest, lowest resource cost). Escalate to `fetch` if content requires JS rendering. Escalate to `stealthy_fetch` only if blocked. +Start with `get` (fastest, lowest resource cost). Escalate to `fetch` if content requires JS rendering. Escalate to `stealthy_fetch` only if blocked. For multiple pages from the same site, use a persistent session to avoid browser launch overhead. ## Content extraction tips