From a61113fc2929addbdc293b7fd70848557fe48f05 Mon Sep 17 00:00:00 2001 From: Karim shoair Date: Sun, 5 Apr 2026 19:42:00 +0200 Subject: [PATCH] docs(agent): update skill with the latest changes --- agent-skill/Scrapling-Skill.zip | Bin 79799 -> 80521 bytes agent-skill/Scrapling-Skill/SKILL.md | 6 +++--- .../Scrapling-Skill/examples/README.md | 2 +- .../references/fetching/static.md | 18 +++++++++--------- .../Scrapling-Skill/references/mcp-server.md | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/agent-skill/Scrapling-Skill.zip b/agent-skill/Scrapling-Skill.zip index b03d956754082a4dc96681054135ab4cc3b6c73a..8daa704beeec310c297074e243fa9197cb9cbdb5 100644 GIT binary patch delta 17624 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 delta 17143 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 Y4De=0.4.4"` +`pip install "scrapling[all]>=0.4.5"` Then do this to download all the browsers' dependencies: @@ -104,7 +104,7 @@ Those options are shared between the 4 HTTP request commands: | --proxy | TEXT | Proxy URL in format "http://username:password@host:port" | | -s, --css-selector | TEXT | CSS selector to extract specific content from the page. It returns all matches. | | -p, --params | TEXT | Query parameters in format "key=value" (can be used multiple times) | -| --follow-redirects / --no-follow-redirects | None | Whether to follow redirects (default: True) | +| --follow-redirects / --no-follow-redirects | None | Whether to follow redirects (default: "safe", rejects redirects to internal/private IPs) | | --verify / --no-verify | None | Whether to verify SSL certificates (default: True) | | --impersonate | TEXT | Browser to impersonate. Can be a single browser (e.g., Chrome) or a comma-separated list for random selection (e.g., Chrome, Firefox, Safari). | | --stealthy-headers / --no-stealthy-headers | None | Use stealthy browser headers (default: True) | diff --git a/agent-skill/Scrapling-Skill/examples/README.md b/agent-skill/Scrapling-Skill/examples/README.md index 0c2f031..344dc0f 100644 --- a/agent-skill/Scrapling-Skill/examples/README.md +++ b/agent-skill/Scrapling-Skill/examples/README.md @@ -9,7 +9,7 @@ All examples collect **all 100 quotes across 10 pages**. Make sure Scrapling is installed: ```bash -pip install "scrapling[all]>=0.4.4" +pip install "scrapling[all]>=0.4.5" scrapling install --force ``` diff --git a/agent-skill/Scrapling-Skill/references/fetching/static.md b/agent-skill/Scrapling-Skill/references/fetching/static.md index fa4d2a5..4115483 100644 --- a/agent-skill/Scrapling-Skill/references/fetching/static.md +++ b/agent-skill/Scrapling-Skill/references/fetching/static.md @@ -15,7 +15,7 @@ All methods for making requests here share some arguments, so let's discuss them - **url**: The targeted URL - **stealthy_headers**: If enabled (default), it creates and adds real browser headers. It also sets a Google referer header. -- **follow_redirects**: As the name implies, tell the fetcher to follow redirections. **Enabled by default** +- **follow_redirects**: Controls redirect behavior. **Defaults to `"safe"`**, which follows redirects but rejects those targeting internal/private IPs (SSRF protection). Pass `True` to follow all redirects without restriction, or `False` to disable redirects entirely. - **timeout**: The number of seconds to wait for each request to be finished. **Defaults to 30 seconds**. - **retries**: The number of retries that the fetcher will do for failed requests. **Defaults to three retries**. - **retry_delay**: Number of seconds to wait between retry attempts. **Defaults to 1 second**. @@ -50,7 +50,7 @@ Examples are the best way to explain this: >>> from scrapling.fetchers import Fetcher >>> # Basic GET >>> page = Fetcher.get('https://example.com') ->>> page = Fetcher.get('https://scrapling.requestcatcher.com/get', stealthy_headers=True, follow_redirects=True) +>>> page = Fetcher.get('https://scrapling.requestcatcher.com/get', stealthy_headers=True) >>> page = Fetcher.get('https://scrapling.requestcatcher.com/get', proxy='http://username:password@localhost:8030') >>> # With parameters >>> page = Fetcher.get('https://example.com/search', params={'q': 'query'}) @@ -69,7 +69,7 @@ And for asynchronous requests, it's a small adjustment >>> from scrapling.fetchers import AsyncFetcher >>> # Basic GET >>> page = await AsyncFetcher.get('https://example.com') ->>> page = await AsyncFetcher.get('https://scrapling.requestcatcher.com/get', stealthy_headers=True, follow_redirects=True) +>>> page = await AsyncFetcher.get('https://scrapling.requestcatcher.com/get', stealthy_headers=True) >>> page = await AsyncFetcher.get('https://scrapling.requestcatcher.com/get', proxy='http://username:password@localhost:8030') >>> # With parameters >>> page = await AsyncFetcher.get('https://example.com/search', params={'q': 'query'}) @@ -105,7 +105,7 @@ The `page` object in all cases is a [Response](choosing.md#response-object) obje >>> from scrapling.fetchers import Fetcher >>> # Basic POST >>> page = Fetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}, params={'q': 'query'}) ->>> page = Fetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}, stealthy_headers=True, follow_redirects=True) +>>> page = Fetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}, stealthy_headers=True) >>> page = Fetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}, proxy='http://username:password@localhost:8030', impersonate="chrome") >>> # Another example of form-encoded data >>> page = Fetcher.post('https://example.com/submit', data={'username': 'user', 'password': 'pass'}, http3=True) @@ -117,7 +117,7 @@ And for asynchronous requests, it's a small adjustment >>> from scrapling.fetchers import AsyncFetcher >>> # Basic POST >>> page = await AsyncFetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}) ->>> page = await AsyncFetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}, stealthy_headers=True, follow_redirects=True) +>>> page = await AsyncFetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}, stealthy_headers=True) >>> page = await AsyncFetcher.post('https://scrapling.requestcatcher.com/post', data={'key': 'value'}, proxy='http://username:password@localhost:8030', impersonate="chrome") >>> # Another example of form-encoded data >>> page = await AsyncFetcher.post('https://example.com/submit', data={'username': 'user', 'password': 'pass'}, http3=True) @@ -129,7 +129,7 @@ And for asynchronous requests, it's a small adjustment >>> from scrapling.fetchers import Fetcher >>> # Basic PUT >>> page = Fetcher.put('https://example.com/update', data={'status': 'updated'}) ->>> page = Fetcher.put('https://example.com/update', data={'status': 'updated'}, stealthy_headers=True, follow_redirects=True, impersonate="chrome") +>>> page = Fetcher.put('https://example.com/update', data={'status': 'updated'}, stealthy_headers=True, impersonate="chrome") >>> page = Fetcher.put('https://example.com/update', data={'status': 'updated'}, proxy='http://username:password@localhost:8030') >>> # Another example of form-encoded data >>> page = Fetcher.put("https://scrapling.requestcatcher.com/put", data={'key': ['value1', 'value2']}) @@ -139,7 +139,7 @@ And for asynchronous requests, it's a small adjustment >>> from scrapling.fetchers import AsyncFetcher >>> # Basic PUT >>> page = await AsyncFetcher.put('https://example.com/update', data={'status': 'updated'}) ->>> page = await AsyncFetcher.put('https://example.com/update', data={'status': 'updated'}, stealthy_headers=True, follow_redirects=True, impersonate="chrome") +>>> page = await AsyncFetcher.put('https://example.com/update', data={'status': 'updated'}, stealthy_headers=True, impersonate="chrome") >>> page = await AsyncFetcher.put('https://example.com/update', data={'status': 'updated'}, proxy='http://username:password@localhost:8030') >>> # Another example of form-encoded data >>> page = await AsyncFetcher.put("https://scrapling.requestcatcher.com/put", data={'key': ['value1', 'value2']}) @@ -149,14 +149,14 @@ And for asynchronous requests, it's a small adjustment ```python >>> from scrapling.fetchers import Fetcher >>> page = Fetcher.delete('https://example.com/resource/123') ->>> page = Fetcher.delete('https://example.com/resource/123', stealthy_headers=True, follow_redirects=True, impersonate="chrome") +>>> page = Fetcher.delete('https://example.com/resource/123', stealthy_headers=True, impersonate="chrome") >>> page = Fetcher.delete('https://example.com/resource/123', proxy='http://username:password@localhost:8030') ``` And for asynchronous requests, it's a small adjustment ```python >>> from scrapling.fetchers import AsyncFetcher >>> page = await AsyncFetcher.delete('https://example.com/resource/123') ->>> page = await AsyncFetcher.delete('https://example.com/resource/123', stealthy_headers=True, follow_redirects=True, impersonate="chrome") +>>> page = await AsyncFetcher.delete('https://example.com/resource/123', stealthy_headers=True, impersonate="chrome") >>> page = await AsyncFetcher.delete('https://example.com/resource/123', proxy='http://username:password@localhost:8030') ``` diff --git a/agent-skill/Scrapling-Skill/references/mcp-server.md b/agent-skill/Scrapling-Skill/references/mcp-server.md index 0a63642..7bbc86b 100644 --- a/agent-skill/Scrapling-Skill/references/mcp-server.md +++ b/agent-skill/Scrapling-Skill/references/mcp-server.md @@ -27,7 +27,7 @@ Fast HTTP GET with browser fingerprint impersonation (TLS, headers). Suitable fo | `retry_delay` | int | 1 | Seconds between retries | | `stealthy_headers` | bool | true | Generate realistic browser headers and Google referer | | `http3` | bool | false | Use HTTP/3 (may conflict with `impersonate`) | -| `follow_redirects` | bool | true | Follow HTTP redirects | +| `follow_redirects` | bool or "safe" | "safe" | Follow redirects. "safe" rejects redirects to internal/private IPs | | `max_redirects` | int | 30 | Max redirects (-1 for unlimited) | | `headers` | dict or null | null | Custom request headers | | `cookies` | dict or null | null | Request cookies |