From c0aec234eb282faea512f565222e5fbd3edbb028 Mon Sep 17 00:00:00 2001 From: Karim shoair Date: Tue, 24 Feb 2026 15:19:23 +0200 Subject: [PATCH 1/2] 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 2/2] 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 @@ + +

@@ -33,13 +35,15 @@

Selection methods · - Choosing a fetcher + Fetchers + · + Spiders + · + Proxy Rotation · CLI · - MCP mode - · - Migrating from Beautifulsoup + MCP

Scrapling is an adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl. @@ -51,9 +55,9 @@ Blazing fast crawls with real-time stats and streaming. Built by Web Scrapers fo ```python from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher StealthyFetcher.adaptive = True -page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Fetch website under the radar! -products = page.css('.product', auto_save=True) # Scrape data that survives website design changes! -products = page.css('.product', adaptive=True) # Later, if the website structure changes, pass `adaptive=True` to find them! +p = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True) # Fetch website under the radar! +products = p.css('.product', auto_save=True) # Scrape data that survives website design changes! +products = p.css('.product', adaptive=True) # Later, if the website structure changes, pass `adaptive=True` to find them! ``` Or scale up to full crawls ```python @@ -70,6 +74,7 @@ class MySpider(Spider): MySpider().start() ``` +# Platinum Sponsors # Sponsors @@ -82,7 +87,10 @@ MySpider().start() + + + diff --git a/docs/README_AR.md b/docs/README_AR.md index 4ac86da..dcccfa0 100644 --- a/docs/README_AR.md +++ b/docs/README_AR.md @@ -33,11 +33,13 @@ · اختيار Fetcher · + العناكب + · + تدوير البروكسي + · واجهة سطر الأوامر · وضع 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_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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