From aa90dda43992620a9271263e170e4d5b844457a5 Mon Sep 17 00:00:00 2001
From: RinZ27 <222222878+RinZ27@users.noreply.github.com>
Date: Wed, 18 Feb 2026 13:53:31 +0700
Subject: [PATCH 1/8] fix: improve regex precision for Cloudflare challenge
detection
---
scrapling/engines/_browsers/_stealth.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scrapling/engines/_browsers/_stealth.py b/scrapling/engines/_browsers/_stealth.py
index 3c9ea58..fe71865 100644
--- a/scrapling/engines/_browsers/_stealth.py
+++ b/scrapling/engines/_browsers/_stealth.py
@@ -22,7 +22,7 @@ from scrapling.engines._browsers._types import StealthSession, StealthFetchParam
from scrapling.engines._browsers._base import SyncSession, AsyncSession, StealthySessionMixin
from scrapling.engines._browsers._validators import validate_fetch as _validate, StealthConfig
-__CF_PATTERN__ = re_compile("challenges.cloudflare.com/cdn-cgi/challenge-platform/.*")
+__CF_PATTERN__ = re_compile(r"^https?://challenges\.cloudflare\.com/cdn-cgi/challenge-platform/.*")
class StealthySession(SyncSession, StealthySessionMixin):
From c0aec234eb282faea512f565222e5fbd3edbb028 Mon Sep 17 00:00:00 2001
From: Karim shoair
Date: Tue, 24 Feb 2026 15:19:23 +0200
Subject: [PATCH 2/8] docs: update sponsorship plans and corrections
---
docs/donate.md | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/docs/donate.md b/docs/donate.md
index f5464a0..9c8349e 100644
--- a/docs/donate.md
+++ b/docs/donate.md
@@ -1,24 +1,30 @@
-I've been working on Scrapling and other public projects in my spare time and have invested considerable resources and effort to make them available to the community for free. By becoming a sponsor, you would directly fund my coffee reserves, helping me continuously update existing projects and create new ones.
+I've been creating all of these projects in my spare time and have invested considerable resources & effort in providing them to the community for free. By becoming a sponsor, you'd be directly funding my coffee reserves, helping me fulfill my responsibilities, and enabling me to continuously update existing projects and potentially create new ones.
You can sponsor me directly through the [GitHub Sponsors program](https://github.com/sponsors/D4Vinci) or [Buy Me a Coffee](https://buymeacoffee.com/d4vinci).
Thank you, stay curious, and hack the planet! ❤️
## Advertisement
-If you are looking to **advertise** your business through Scrapling and take advantage of our target audience, check out the [available tiers](https://github.com/sponsors/D4Vinci):
+If you are looking to **advertise** your business to our target audience, check out the [available tiers](https://github.com/sponsors/D4Vinci):
-### [The Silver tier](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=435496) ($50/month)
+### 1. [The Silver tier](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=435496) ($50/month)
Perks:
-- Your logo will be featured at [the top of Scrapling's project page](https://github.com/D4Vinci/Scrapling?tab=readme-ov-file#sponsors).
-- The same logo will be featured at [the top of Scrapling's PyPI page](https://pypi.org/project/scrapling/).
-- The same logo will be featured at [the top of Docker's image page](https://hub.docker.com/r/pyd4vinci/scrapling).
+1. Your logo will be featured at [the top of Scrapling's project page](https://github.com/D4Vinci/Scrapling?tab=readme-ov-file#sponsors).
+2. The same logo will be featured at [the top of Scrapling's PyPI page](https://pypi.org/project/scrapling/) and [the top of Docker's image page](https://hub.docker.com/r/pyd4vinci/scrapling), the same way it was placed on the project's page.
-### [The Gold tier](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=435495) ($100/month)
+### 2. [The Gold tier](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=435495) ($100/month)
Perks:
-- Your logo will be featured at [the top of Scrapling's project page](https://github.com/D4Vinci/Scrapling?tab=readme-ov-file#sponsors).
-- The same logo will be featured at [the top of Scrapling's PyPI page](https://pypi.org/project/scrapling/).
-- The same logo will be featured at [the top of Docker's image page](https://hub.docker.com/r/pyd4vinci/scrapling).
-- Your logo will be featured as a top sponsor on [Scrapling's website](https://scrapling.readthedocs.io/en/latest/) main page.
-- A Shoutout with each [Release note](https://github.com/D4Vinci/Scrapling/releases).
+1. Your logo will be featured at [the top of Scrapling's project page](https://github.com/D4Vinci/Scrapling?tab=readme-ov-file#sponsors).
+2. The same logo will be featured at [the top of Scrapling's PyPI page](https://pypi.org/project/scrapling/) and [the top of Docker's image page](https://hub.docker.com/r/pyd4vinci/scrapling), the same way it was placed on the project's page.
+3. Your logo will be featured as a top sponsor on [Scrapling's website](https://scrapling.readthedocs.io/en/latest/) main page.
+
+### 3. [The Platinum tier](https://github.com/sponsors/D4Vinci/sponsorships?tier_id=586646) ($300/month)
+Perks:
+
+1. Your logo will have a special placement at [the very top of Scrapling's project page](https://github.com/D4Vinci/Scrapling?tab=readme-ov-file#platinum-sponsors) with an 80-word paragraph or less.
+2. The same logo will be featured at [the top of Scrapling's PyPI page](https://pypi.org/project/scrapling/) and [the top of Docker's image page](https://hub.docker.com/r/pyd4vinci/scrapling), the same way it was placed on the project's page.
+3. Your logo will have a special placement as a top sponsor on [Scrapling's website](https://scrapling.readthedocs.io/en/latest/) main page.
+4. A partner role at our Discord server.
+5. A Shoutout at the end of each [Release notes](https://github.com/D4Vinci/Scrapling/releases).
\ No newline at end of file
From 8c9402f9f09f0cd8896a85cca2688f111e17fdfd Mon Sep 17 00:00:00 2001
From: Karim shoair
Date: Tue, 24 Feb 2026 15:28:37 +0200
Subject: [PATCH 3/8] docs: adding new sponsor
---
README.md | 22 +++++++++++++++-------
docs/README_AR.md | 17 ++++++++++++-----
docs/README_CN.md | 17 ++++++++++++-----
docs/README_DE.md | 17 ++++++++++++-----
docs/README_ES.md | 19 +++++++++++++------
docs/README_JP.md | 17 ++++++++++++-----
docs/README_RU.md | 17 ++++++++++++-----
docs/index.md | 1 +
images/ProxyEmpire.png | Bin 0 -> 8765 bytes
9 files changed, 89 insertions(+), 38 deletions(-)
create mode 100644 images/ProxyEmpire.png
diff --git a/README.md b/README.md
index 3c5e5ca..10df642 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+
+
Scrapling هو إطار عمل تكيفي لـ Web Scraping يتعامل مع كل شيء من طلب واحد إلى زحف كامل النطاق.
@@ -49,9 +51,9 @@ Scrapling هو إطار عمل تكيفي لـ Web Scraping يتعامل مع ك
```python
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
-page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # احصل على الموقع بشكل خفي!
-products = page.css('.product', auto_save=True) # استخرج بيانات تنجو من تغييرات تصميم الموقع!
-products = page.css('.product', adaptive=True) # لاحقاً، إذا تغيرت بنية الموقع، مرر `adaptive=True` للعثور عليها!
+p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # احصل على الموقع بشكل خفي!
+products = p.css('.product', auto_save=True) # استخرج بيانات تنجو من تغييرات تصميم الموقع!
+products = p.css('.product', adaptive=True) # لاحقاً، إذا تغيرت بنية الموقع، مرر `adaptive=True` للعثور عليها!
```
أو توسع إلى عمليات زحف كاملة
```python
@@ -69,6 +71,8 @@ MySpider().start()
```
+# الرعاة البلاتينيون
+
# الرعاة
@@ -80,7 +84,10 @@ MySpider().start()
+
+
+
diff --git a/docs/README_CN.md b/docs/README_CN.md
index b33c422..d9ec033 100644
--- a/docs/README_CN.md
+++ b/docs/README_CN.md
@@ -33,11 +33,13 @@
·
选择Fetcher
·
+ 爬虫
+ ·
+ 代理轮换
+ ·
CLI
·
MCP模式
- ·
- 从Beautifulsoup迁移
Scrapling是一个自适应Web Scraping框架,能处理从单个请求到大规模爬取的一切需求。
@@ -49,9 +51,9 @@ Scrapling是一个自适应Web Scraping框架,能处理从单个请求到大
```python
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
-page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # 隐秘地获取网站!
-products = page.css('.product', auto_save=True) # 抓取在网站设计变更后仍能存活的数据!
-products = page.css('.product', adaptive=True) # 之后,如果网站结构改变,传递 `adaptive=True` 来找到它们!
+p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # 隐秘地获取网站!
+products = p.css('.product', auto_save=True) # 抓取在网站设计变更后仍能存活的数据!
+products = p.css('.product', adaptive=True) # 之后,如果网站结构改变,传递 `adaptive=True` 来找到它们!
```
或扩展为完整爬取
```python
@@ -69,6 +71,8 @@ MySpider().start()
```
+# 铂金赞助商
+
# 赞助商
@@ -80,7 +84,10 @@ MySpider().start()
+
+
+
diff --git a/docs/README_DE.md b/docs/README_DE.md
index 7124483..cec019c 100644
--- a/docs/README_DE.md
+++ b/docs/README_DE.md
@@ -33,11 +33,13 @@
·
Einen Fetcher wählen
·
+ Spiders
+ ·
+ Proxy-Rotation
+ ·
CLI
·
MCP-Modus
- ·
- Migration von Beautifulsoup
Scrapling ist ein adaptives Web-Scraping-Framework, das alles abdeckt -- von einer einzelnen Anfrage bis hin zu einem umfassenden Crawl.
@@ -49,9 +51,9 @@ Blitzschnelle Crawls mit Echtzeit-Statistiken und Streaming. Von Web Scrapern f
```python
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
-page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Website unbemerkt abrufen!
-products = page.css('.product', auto_save=True) # Daten scrapen, die Website-Designänderungen überleben!
-products = page.css('.product', adaptive=True) # Später, wenn sich die Website-Struktur ändert, `adaptive=True` übergeben, um sie zu finden!
+p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Website unbemerkt abrufen!
+products = p.css('.product', auto_save=True) # Daten scrapen, die Website-Designänderungen überleben!
+products = p.css('.product', adaptive=True) # Später, wenn sich die Website-Struktur ändert, `adaptive=True` übergeben, um sie zu finden!
```
Oder auf vollständige Crawls hochskalieren
```python
@@ -69,6 +71,8 @@ MySpider().start()
```
+# Platin-Sponsoren
+
# Sponsoren
@@ -80,7 +84,10 @@ MySpider().start()
+
+
+
diff --git a/docs/README_ES.md b/docs/README_ES.md
index 8957c41..851fa40 100644
--- a/docs/README_ES.md
+++ b/docs/README_ES.md
@@ -29,15 +29,17 @@
- Metodos de seleccion
+ Métodos de selección
·
Elegir un fetcher
·
+ Spiders
+ ·
+ Rotación de proxy
+ ·
CLI
·
Modo MCP
- ·
- Migrar desde Beautifulsoup
Scrapling es un framework de Web Scraping adaptativo que se encarga de todo, desde una sola solicitud hasta un rastreo a gran escala.
@@ -49,9 +51,9 @@ Rastreos ultrarrápidos con estadísticas en tiempo real y Streaming. Construido
```python
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
-page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # ¡Obtén el sitio web bajo el radar!
-products = page.css('.product', auto_save=True) # ¡Extrae datos que sobreviven a cambios de diseño del sitio web!
-products = page.css('.product', adaptive=True) # Más tarde, si la estructura del sitio web cambia, ¡pasa `adaptive=True` para encontrarlos!
+p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # ¡Obtén el sitio web bajo el radar!
+products = p.css('.product', auto_save=True) # ¡Extrae datos que sobreviven a cambios de diseño del sitio web!
+products = p.css('.product', adaptive=True) # Más tarde, si la estructura del sitio web cambia, ¡pasa `adaptive=True` para encontrarlos!
```
O escala a rastreos completos
```python
@@ -69,6 +71,8 @@ MySpider().start()
```
+# Patrocinadores Platino
+
# Patrocinadores
@@ -80,7 +84,10 @@ MySpider().start()
+
+
+
diff --git a/docs/README_JP.md b/docs/README_JP.md
index 3423f49..43afc62 100644
--- a/docs/README_JP.md
+++ b/docs/README_JP.md
@@ -33,11 +33,13 @@
·
Fetcherの選び方
·
+ スパイダー
+ ·
+ プロキシローテーション
+ ·
CLI
·
MCPモード
- ·
- Beautifulsoupからの移行
Scraplingは、単一のリクエストから本格的なクロールまですべてを処理する適応型Web Scrapingフレームワークです。
@@ -49,9 +51,9 @@ Scraplingは、単一のリクエストから本格的なクロールまです
```python
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
-page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # レーダーの下でウェブサイトを取得!
-products = page.css('.product', auto_save=True) # ウェブサイトのデザイン変更に耐えるデータをスクレイプ!
-products = page.css('.product', adaptive=True) # 後でウェブサイトの構造が変わったら、`adaptive=True`を渡して見つける!
+p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # レーダーの下でウェブサイトを取得!
+products = p.css('.product', auto_save=True) # ウェブサイトのデザイン変更に耐えるデータをスクレイプ!
+products = p.css('.product', adaptive=True) # 後でウェブサイトの構造が変わったら、`adaptive=True`を渡して見つける!
```
または本格的なクロールへスケールアップ
```python
@@ -69,6 +71,8 @@ MySpider().start()
```
+# プラチナスポンサー
+
# スポンサー
@@ -80,7 +84,10 @@ MySpider().start()
+
+
+
diff --git a/docs/README_RU.md b/docs/README_RU.md
index dc59ba6..5a3151b 100644
--- a/docs/README_RU.md
+++ b/docs/README_RU.md
@@ -33,11 +33,13 @@
·
Выбор Fetcher
·
+ Пауки
+ ·
+ Ротация прокси
+ ·
CLI
·
Режим MCP
- ·
- Миграция с Beautifulsoup
Scrapling — это адаптивный фреймворк для Web Scraping, который берёт на себя всё: от одного запроса до полномасштабного обхода сайтов.
@@ -49,9 +51,9 @@ Scrapling — это адаптивный фреймворк для Web Scraping
```python
from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
StealthyFetcher.adaptive = True
-page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Загрузите сайт незаметно!
-products = page.css('.product', auto_save=True) # Скрапьте данные, которые переживут изменения дизайна сайта!
-products = page.css('.product', adaptive=True) # Позже, если структура сайта изменится, передайте `adaptive=True`, чтобы найти их!
+p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Загрузите сайт незаметно!
+products = p.css('.product', auto_save=True) # Скрапьте данные, которые переживут изменения дизайна сайта!
+products = p.css('.product', adaptive=True) # Позже, если структура сайта изменится, передайте `adaptive=True`, чтобы найти их!
```
Или масштабируйте до полного обхода
```python
@@ -69,6 +71,8 @@ MySpider().start()
```
+# Платиновые спонсоры
+
# Спонсоры
@@ -80,7 +84,10 @@ MySpider().start()
+
+
+
diff --git a/docs/index.md b/docs/index.md
index 3e53e33..15f7b5d 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -55,6 +55,7 @@ MySpider().start()
+
diff --git a/images/ProxyEmpire.png b/images/ProxyEmpire.png
new file mode 100644
index 0000000000000000000000000000000000000000..d407789373896faf0b775550151130ea92f042ad
GIT binary patch
literal 8765
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
Date: Wed, 25 Feb 2026 02:06:09 +0200
Subject: [PATCH 4/8] docs: add the trending badge
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 10df642..aae6045 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,8 @@
+
+
العربيه | Español | Deutsch | 简体中文 | 日本語 | Русский
From 6943ec27f84306290ba084542bfb2ddb59785856 Mon Sep 17 00:00:00 2001
From: Karim shoair
Date: Wed, 25 Feb 2026 02:23:36 +0200
Subject: [PATCH 5/8] docs: typo correction
---
README.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.md b/README.md
index 84a569a..aae6045 100644
--- a/README.md
+++ b/README.md
@@ -78,8 +78,6 @@ MySpider().start()
# Platinum Sponsors
-# Platinum Sponsors
-
# Sponsors
From 0aabceb74e37a3b57101124d20002be1cdf7d94d Mon Sep 17 00:00:00 2001
From: Salman Muin Kayser Chishti <13schishti@gmail.com>
Date: Wed, 25 Feb 2026 09:21:38 +0000
Subject: [PATCH 6/8] Upgrade GitHub Actions for Node 24 compatibility
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
---
.github/workflows/code-quality.yml | 6 +++---
.github/workflows/docker-build.yml | 2 +-
.github/workflows/release-and-publish.yml | 6 +++---
.github/workflows/tests.yml | 8 ++++----
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml
index ada0ec2..5c32328 100644
--- a/.github/workflows/code-quality.yml
+++ b/.github/workflows/code-quality.yml
@@ -37,12 +37,12 @@ jobs:
steps:
- name: Checkout code
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
with:
fetch-depth: 0 # Full history for better analysis
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: '3.10'
cache: 'pip'
@@ -177,7 +177,7 @@ jobs:
- name: Upload Bandit report
if: always() && steps.bandit.outcome != 'skipped'
- uses: actions/upload-artifact@v4
+ uses: actions/upload-artifact@v6
with:
name: bandit-security-report
path: bandit-report.json
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index 3c8ddcd..201a99a 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -25,7 +25,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v6
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml
index 81705b4..41701c3 100644
--- a/.github/workflows/release-and-publish.yml
+++ b/.github/workflows/release-and-publish.yml
@@ -18,7 +18,7 @@ jobs:
contents: write
id-token: write
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
with:
fetch-depth: 0
@@ -27,7 +27,7 @@ jobs:
run: echo "title=${{ github.event.pull_request.title }}" >> $GITHUB_OUTPUT
- name: Save PR body to file
- uses: actions/github-script@v6
+ uses: actions/github-script@v8
with:
script: |
const fs = require('fs');
@@ -57,7 +57,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Python
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: 3.12
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index be3bbca..75d6ab1 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -44,10 +44,10 @@ jobs:
TOXENV: py313
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v5
+ uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
@@ -69,7 +69,7 @@ jobs:
- name: Retrieve Playwright browsers from cache if any
id: playwright-cache
- uses: actions/cache@v4
+ uses: actions/cache@v5
with:
path: |
~/.cache/ms-playwright
@@ -92,7 +92,7 @@ jobs:
# Cache tox environments
- name: Cache tox environments
- uses: actions/cache@v4
+ uses: actions/cache@v5
with:
path: .tox
# Include python version and os in the cache key
From 8de47c9bd71a646a1cc37bb40d7ee96e72d11fc8 Mon Sep 17 00:00:00 2001
From: Salman Muin Kayser Chishti <13schishti@gmail.com>
Date: Wed, 25 Feb 2026 09:21:41 +0000
Subject: [PATCH 7/8] Upgrade GitHub Actions to latest versions
Signed-off-by: Salman Muin Kayser Chishti <13schishti@gmail.com>
---
.github/workflows/docker-build.yml | 2 +-
.github/workflows/release-and-publish.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml
index 3c8ddcd..5da1bbb 100644
--- a/.github/workflows/docker-build.yml
+++ b/.github/workflows/docker-build.yml
@@ -70,7 +70,7 @@ jobs:
org.opencontainers.image.documentation=https://scrapling.readthedocs.io/en/latest/
- name: Build and push Docker image
- uses: docker/build-push-action@v5
+ uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
diff --git a/.github/workflows/release-and-publish.yml b/.github/workflows/release-and-publish.yml
index 81705b4..92f4d23 100644
--- a/.github/workflows/release-and-publish.yml
+++ b/.github/workflows/release-and-publish.yml
@@ -46,7 +46,7 @@ jobs:
fi
- name: Create Release
- uses: softprops/action-gh-release@v1
+ uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.extract_version.outputs.version }}
name: Release ${{ steps.extract_version.outputs.version }}
From 7ebe3a01a33364f7287309e5b80fc0771462d326 Mon Sep 17 00:00:00 2001
From: Karim shoair
Date: Wed, 25 Feb 2026 23:54:24 +0200
Subject: [PATCH 8/8] docs: removing an irrelevant article
---
docs/tutorials/external.md | 34 ----------------------------------
zensical.toml | 3 +--
2 files changed, 1 insertion(+), 36 deletions(-)
delete mode 100644 docs/tutorials/external.md
diff --git a/docs/tutorials/external.md b/docs/tutorials/external.md
deleted file mode 100644
index 15a5f9b..0000000
--- a/docs/tutorials/external.md
+++ /dev/null
@@ -1,34 +0,0 @@
-
-If you have issues with the browser installation, such as resource management, we recommend you try the Cloud Browser from [Scrapeless](https://www.scrapeless.com/en/product/scraping-browser?utm_source=official&utm_term=scrapling) for free!
-
-The usage is straightforward: create an account and [get your API key](https://docs.scrapeless.com/en/scraping-browser/quickstart/getting-started/?utm_source=official&utm_term=scrapling), then pass it to the `DynamicSession` like this:
-
-```python
-from urllib.parse import urlencode
-
-from scrapling.fetchers import DynamicSession
-
-# Configure your browser session
-config = {
- "token": "YOUR_API_KEY",
- "sessionName": "scrapling-session",
- "sessionTTL": "300", # 5 minutes
- "proxyCountry": "ANY",
- "sessionRecording": "false",
-}
-
-# Build WebSocket URL
-ws_endpoint = f"wss://browser.scrapeless.com/api/v2/browser?{urlencode(config)}"
-print('Connecting to Scrapeless...')
-
-with DynamicSession(cdp_url=ws_endpoint, disable_resources=True) as s:
- print("Connected!")
- page = s.fetch("https://httpbin.org/headers", network_idle=True)
- print(f"Page loaded, content length: {len(page.body)}")
- print(page.json())
-```
-The `DynamicSession` class instance will work as usual, so no further explanation is needed.
-
-However, the Scrapeless Cloud Browser can be configured with proxy options, like the proxy country in the config above, [custom fingerprint](https://docs.scrapeless.com/en/scraping-browser/features/advanced-privacy-anti-detection/custom-fingerprint/?utm_source=official&utm_term=scrapling) configuration, [captcha solving](https://docs.scrapeless.com/en/scraping-browser/features/advanced-privacy-anti-detection/supported-captchas/?utm_source=official&utm_term=scrapling), and more.
-
-Check out the [Scrapeless's browser documentation](https://docs.scrapeless.com/en/scraping-browser/quickstart/introduction/?utm_source=official&utm_term=scrapling) for more details.
\ No newline at end of file
diff --git a/zensical.toml b/zensical.toml
index 06b5575..0b52de7 100644
--- a/zensical.toml
+++ b/zensical.toml
@@ -50,8 +50,7 @@ nav = [
]},
{Tutorials = [
{"A Free Alternative to AI for Robust Web Scraping" = "tutorials/replacing_ai.md"},
- {"Migrating from BeautifulSoup" = "tutorials/migrating_from_beautifulsoup.md"},
- {"Using Scrapeless browser" = "tutorials/external.md"}
+ {"Migrating from BeautifulSoup" = "tutorials/migrating_from_beautifulsoup.md"}
]},
{Development = [
{"API Reference" = [