docs: update the translated readme files with the new content
This commit is contained in:
+207
-139
@@ -6,8 +6,9 @@
|
||||
</picture>
|
||||
</a>
|
||||
<br>
|
||||
<small>Web Scraping have never been easier!</small>
|
||||
<small>Effortless Web Scraping for the Modern Web</small>
|
||||
</h1>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml" alt="Tests">
|
||||
<img alt="Tests" src="https://github.com/D4Vinci/Scrapling/actions/workflows/tests.yml/badge.svg"></a>
|
||||
@@ -28,46 +29,47 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/parsing/selection/">
|
||||
Методы выбора
|
||||
</a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/fetching/choosing/">
|
||||
Выбор фетчера
|
||||
</a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/cli/overview/">
|
||||
CLI
|
||||
</a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/ai/mcp-server/">
|
||||
Режим MCP
|
||||
</a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/tutorials/migrating_from_beautifulsoup/">
|
||||
Миграция с Beautifulsoup
|
||||
</a>
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/parsing/selection/"><strong>Методы выбора</strong></a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/fetching/choosing/"><strong>Выбор Fetcher</strong></a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/cli/overview/"><strong>CLI</strong></a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/ai/mcp-server/"><strong>Режим MCP</strong></a>
|
||||
·
|
||||
<a href="https://scrapling.readthedocs.io/en/latest/tutorials/migrating_from_beautifulsoup/"><strong>Миграция с Beautifulsoup</strong></a>
|
||||
</p>
|
||||
|
||||
**Прекратите бороться с анти-ботовыми системами. Прекратите переписывать селекторы после каждого обновления сайта.**
|
||||
Scrapling — это адаптивный фреймворк для Web Scraping, который берёт на себя всё: от одного запроса до полномасштабного обхода сайтов.
|
||||
|
||||
Scrapling - это не просто очередная библиотека для веб-скрапинга. Это первая **адаптивная** библиотека для скрапинга, которая учится на изменениях сайтов и развивается вместе с ними. В то время как другие библиотеки ломаются, когда сайты обновляют свою структуру, Scrapling автоматически перемещает ваши элементы и поддерживает работу ваших скраперов.
|
||||
Его парсер учится на изменениях сайтов и автоматически перемещает ваши элементы при обновлении страниц. Его Fetcher'ы обходят анти-бот системы вроде Cloudflare Turnstile прямо из коробки. А его Spider-фреймворк позволяет масштабироваться до параллельных, многосессионных обходов с Pause & Resume и автоматической ротацией Proxy — и всё это в нескольких строках Python. Одна библиотека, без компромиссов.
|
||||
|
||||
Созданный для современного веба, Scrapling имеет **собственный быстрый движок парсинга** и фетчеры для решения всех задач веб-скрапинга, с которыми вы сталкиваетесь или столкнетесь. Созданный веб-скраперами для веб-скраперов и обычных пользователей, здесь есть что-то для каждого.
|
||||
Молниеносно быстрые обходы с отслеживанием статистики в реальном времени и Streaming. Создано веб-скраперами для веб-скраперов и обычных пользователей — здесь есть что-то для каждого.
|
||||
|
||||
```python
|
||||
>> from scrapling.fetchers import Fetcher, AsyncFetcher, StealthyFetcher, DynamicFetcher
|
||||
>> StealthyFetcher.adaptive = True
|
||||
# Получайте исходный код сайтов незаметно!
|
||||
>> page = StealthyFetcher.fetch('https://example.com', headless=True, network_idle=True)
|
||||
>> print(page.status)
|
||||
200
|
||||
>> products = page.css('.product', auto_save=True) # Скрапьте данные, которые переживут изменения дизайна сайта!
|
||||
>> # Позже, если структура сайта изменится, передайте `adaptive=True`
|
||||
>> products = page.css('.product', adaptive=True) # и Scrapling все равно их найдет!
|
||||
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`, чтобы найти их!
|
||||
```
|
||||
Или масштабируйте до полного обхода
|
||||
```python
|
||||
from scrapling.spiders import Spider, Response
|
||||
|
||||
class MySpider(Spider):
|
||||
name = "demo"
|
||||
start_urls = ["https://example.com/"]
|
||||
|
||||
async def parse(self, response: Response):
|
||||
for item in response.css('.product'):
|
||||
yield {"title": item.css('h2::text').get()}
|
||||
|
||||
MySpider().start()
|
||||
```
|
||||
|
||||
# Спонсоры
|
||||
|
||||
# Спонсоры
|
||||
|
||||
<!-- sponsors -->
|
||||
|
||||
@@ -91,138 +93,211 @@ Scrapling - это не просто очередная библиотека д
|
||||
|
||||
## Ключевые особенности
|
||||
|
||||
### Продвинутая загрузка сайтов с поддержкой сессий
|
||||
- **HTTP-запросы**: Быстрые и скрытные HTTP-запросы с классом `Fetcher`. Может имитировать TLS-отпечаток браузера, заголовки и использовать HTTP3.
|
||||
### Spider'ы — полноценный фреймворк для обхода сайтов
|
||||
- 🕷️ **Scrapy-подобный Spider API**: Определяйте Spider'ов с `start_urls`, async `parse` callback'ами и объектами `Request`/`Response`.
|
||||
- ⚡ **Параллельный обход**: Настраиваемые лимиты параллелизма, ограничение скорости по домену и задержки загрузки.
|
||||
- 🔄 **Поддержка нескольких сессий**: Единый интерфейс для HTTP-запросов и скрытных headless-браузеров в одном Spider — маршрутизируйте запросы к разным сессиям по ID.
|
||||
- 💾 **Pause & Resume**: Persistence обхода на основе Checkpoint'ов. Нажмите Ctrl+C для мягкой остановки; перезапустите, чтобы продолжить с того места, где вы остановились.
|
||||
- 📡 **Режим Streaming**: Стримьте извлечённые элементы по мере их поступления через `async for item in spider.stream()` со статистикой в реальном времени — идеально для UI, конвейеров и длительных обходов.
|
||||
- 🛡️ **Обнаружение заблокированных запросов**: Автоматическое обнаружение и повторная отправка заблокированных запросов с настраиваемой логикой.
|
||||
- 📦 **Встроенный экспорт**: Экспортируйте результаты через хуки и собственный конвейер или встроенный JSON/JSONL с `result.items.to_json()` / `result.items.to_jsonl()` соответственно.
|
||||
|
||||
### Продвинутая загрузка сайтов с поддержкой Session
|
||||
- **HTTP-запросы**: Быстрые и скрытные HTTP-запросы с классом `Fetcher`. Может имитировать TLS fingerprint браузера, заголовки и использовать HTTP/3.
|
||||
- **Динамическая загрузка**: Загрузка динамических сайтов с полной автоматизацией браузера через класс `DynamicFetcher`, поддерживающий Chromium от Playwright и Google Chrome.
|
||||
- **Обход анти-ботов**: Расширенные возможности скрытности с `StealthyFetcher` и подмену отпечатков. Может легко обойти все типы Turnstile/Interstitial от Cloudflare с помощью автоматизации.
|
||||
- **Обход анти-ботов**: Расширенные возможности скрытности с `StealthyFetcher` и подмену fingerprint'ов. Может легко обойти все типы Cloudflare Turnstile/Interstitial с помощью автоматизации.
|
||||
- **Управление сессиями**: Поддержка постоянных сессий с классами `FetcherSession`, `StealthySession` и `DynamicSession` для управления cookie и состоянием между запросами.
|
||||
- **Поддержка асинхронности**: Полная асинхронная поддержка во всех фетчерах и выделенных асинхронных классах сессий.
|
||||
- **Ротация Proxy**: Встроенный `ProxyRotator` с round-robin или пользовательскими стратегиями для всех типов сессий, а также переопределение Proxy для каждого запроса.
|
||||
- **Блокировка доменов**: Блокируйте запросы к определённым доменам (и их поддоменам) в браузерных Fetcher'ах.
|
||||
- **Поддержка async**: Полная async-поддержка во всех Fetcher'ах и выделенных async-классах сессий.
|
||||
|
||||
### Адаптивный скрапинг и интеграция с ИИ
|
||||
- 🔄 **Умное отслеживание элементов**: Перемещайте элементы после изменений сайта с помощью интеллектуальных алгоритмов подобия.
|
||||
- 🎯 **Умный гибкий выбор**: CSS-селекторы, XPath-селекторы, поиск на основе фильтров, текстовый поиск, поиск по регулярным выражениям и многое другое.
|
||||
- 🔍 **Поиск похожих элементов**: Автоматически находите элементы, похожие на найденные элементы.
|
||||
- 🤖 **MCP-сервер для использования с ИИ**: Встроенный MCP-сервер для веб-скрапинга с помощью ИИ и извлечения данных. MCP-сервер обладает мощными, пользовательскими возможностями, которые используют Scrapling для извлечения целевого контента перед передачей его ИИ (Claude/Cursor/и т.д.), тем самым ускоряя операции и снижая затраты за счет минимизации использования токенов. ([демо-видео](https://www.youtube.com/watch?v=qyFk3ZNwOxE))
|
||||
- 🔍 **Поиск похожих элементов**: Автоматически находите элементы, похожие на найденные.
|
||||
- 🤖 **MCP-сервер для использования с ИИ**: Встроенный MCP-сервер для Web Scraping с помощью ИИ и извлечения данных. MCP-сервер обладает мощными пользовательскими возможностями, которые используют Scrapling для извлечения целевого контента перед передачей его ИИ (Claude/Cursor/и т.д.), тем самым ускоряя операции и снижая затраты за счёт минимизации использования токенов. ([демо-видео](https://www.youtube.com/watch?v=qyFk3ZNwOxE))
|
||||
|
||||
### Высокопроизводительная и проверенная в боях архитектура
|
||||
- 🚀 **Молниеносно быстро**: Оптимизированная производительность превосходит большинство библиотек скрапинга Python.
|
||||
- 🚀 **Молниеносная скорость**: Оптимизированная производительность, превосходящая большинство Python-библиотек для скрапинга.
|
||||
- 🔋 **Эффективное использование памяти**: Оптимизированные структуры данных и ленивая загрузка для минимального потребления памяти.
|
||||
- ⚡ **Быстрая сериализация JSON**: В 10 раз быстрее, чем стандартная библиотека.
|
||||
- ⚡ **Быстрая сериализация JSON**: В 10 раз быстрее стандартной библиотеки.
|
||||
- 🏗️ **Проверено в боях**: Scrapling имеет не только 92% покрытия тестами и полное покрытие type hints, но и ежедневно использовался сотнями веб-скраперов в течение последнего года.
|
||||
|
||||
### Удобный для разработчиков/веб-скраперов опыт
|
||||
- 🎯 **Интерактивная оболочка веб-скрапинга**: Опциональная встроенная оболочка IPython с интеграцией Scrapling, ярлыками и новыми инструментами для ускорения разработки скриптов веб-скрапинга, такими как преобразование curl-запросов в Scrapling-запросы и просмотр результатов запросов в вашем браузере.
|
||||
- 🎯 **Интерактивная Web Scraping Shell**: Опциональная встроенная IPython-оболочка с интеграцией Scrapling, ярлыками и новыми инструментами для ускорения разработки скриптов Web Scraping, такими как преобразование curl-запросов в запросы Scrapling и просмотр результатов запросов в браузере.
|
||||
- 🚀 **Используйте прямо из терминала**: При желании вы можете использовать Scrapling для скрапинга URL без написания ни одной строки кода!
|
||||
- 🛠️ **Богатый API навигации**: Расширенный обход DOM с методами навигации по родителям, братьям и детям.
|
||||
- 🧬 **Улучшенная обработка текста**: Встроенные регулярные выражения, методы очистки и оптимизированные операции со строками.
|
||||
- 📝 **Автоматическая генерация селекторов**: Генерация надежных CSS/XPath селекторов для любого элемента.
|
||||
- 📝 **Автоматическая генерация селекторов**: Генерация надёжных CSS/XPath-селекторов для любого элемента.
|
||||
- 🔌 **Знакомый API**: Похож на Scrapy/BeautifulSoup с теми же псевдоэлементами, используемыми в Scrapy/Parsel.
|
||||
- 📘 **Полное покрытие типами**: Полные подсказки типов для отличной поддержки IDE и автодополнения кода.
|
||||
- 🔋 **Готовый Docker-образ**: С каждым релизом автоматически создается и отправляется Docker-образ, содержащий все браузеры.
|
||||
- 📘 **Полное покрытие типами**: Полные type hints для отличной поддержки IDE и автодополнения кода. Вся кодовая база автоматически проверяется **PyRight** и **MyPy** при каждом изменении.
|
||||
- 🔋 **Готовый Docker-образ**: С каждым релизом автоматически создаётся и публикуется Docker-образ, содержащий все браузеры.
|
||||
|
||||
## Начало работы
|
||||
|
||||
### Базовое использование
|
||||
```python
|
||||
from scrapling.fetchers import Fetcher, StealthyFetcher, DynamicFetcher
|
||||
from scrapling.fetchers import FetcherSession, StealthySession, DynamicSession
|
||||
Давайте кратко покажем, на что способен Scrapling, без глубокого погружения.
|
||||
|
||||
# HTTP-запросы с поддержкой сессий
|
||||
with FetcherSession(impersonate='chrome') as session: # Используйте последнюю версию TLS-отпечатка Chrome
|
||||
### Базовое использование
|
||||
HTTP-запросы с поддержкой Session
|
||||
```python
|
||||
from scrapling.fetchers import Fetcher, FetcherSession
|
||||
|
||||
with FetcherSession(impersonate='chrome') as session: # Используйте последнюю версию TLS fingerprint Chrome
|
||||
page = session.get('https://quotes.toscrape.com/', stealthy_headers=True)
|
||||
quotes = page.css('.quote .text::text')
|
||||
quotes = page.css('.quote .text::text').getall()
|
||||
|
||||
# Или используйте одноразовые запросы
|
||||
page = Fetcher.get('https://quotes.toscrape.com/')
|
||||
quotes = page.css('.quote .text::text')
|
||||
quotes = page.css('.quote .text::text').getall()
|
||||
```
|
||||
Расширенный режим скрытности
|
||||
```python
|
||||
from scrapling.fetchers import StealthyFetcher, StealthySession
|
||||
|
||||
# Расширенный режим скрытности (Держите браузер открытым до завершения)
|
||||
with StealthySession(headless=True, solve_cloudflare=True) as session:
|
||||
with StealthySession(headless=True, solve_cloudflare=True) as session: # Держите браузер открытым, пока не закончите
|
||||
page = session.fetch('https://nopecha.com/demo/cloudflare', google_search=False)
|
||||
data = page.css('#padded_content a')
|
||||
data = page.css('#padded_content a').getall()
|
||||
|
||||
# Или используйте стиль одноразового запроса, открывает браузер для этого запроса, затем закрывает его после завершения
|
||||
# Или используйте стиль одноразового запроса — открывает браузер для этого запроса, затем закрывает его после завершения
|
||||
page = StealthyFetcher.fetch('https://nopecha.com/demo/cloudflare')
|
||||
data = page.css('#padded_content a')
|
||||
|
||||
# Полная автоматизация браузера (Держите браузер открытым до завершения)
|
||||
with DynamicSession(headless=True) as session:
|
||||
page = session.fetch('https://quotes.toscrape.com/', network_idle=True)
|
||||
quotes = page.css('.quote .text::text')
|
||||
data = page.css('#padded_content a').getall()
|
||||
```
|
||||
Полная автоматизация браузера
|
||||
```python
|
||||
from scrapling.fetchers import DynamicFetcher, DynamicSession
|
||||
|
||||
# Или используйте стиль одноразового запроса
|
||||
page = DynamicFetcher.fetch('https://quotes.toscrape.com/', network_idle=True)
|
||||
quotes = page.css('.quote .text::text')
|
||||
with DynamicSession(headless=True, disable_resources=False, network_idle=True) as session: # Держите браузер открытым, пока не закончите
|
||||
page = session.fetch('https://quotes.toscrape.com/', load_dom=False)
|
||||
data = page.xpath('//span[@class="text"]/text()').getall() # XPath-селектор, если вы предпочитаете его
|
||||
|
||||
# Или используйте стиль одноразового запроса — открывает браузер для этого запроса, затем закрывает его после завершения
|
||||
page = DynamicFetcher.fetch('https://quotes.toscrape.com/')
|
||||
data = page.css('.quote .text::text').getall()
|
||||
```
|
||||
|
||||
### Выбор элементов
|
||||
### Spider'ы
|
||||
Создавайте полноценные обходчики с параллельными запросами, несколькими типами сессий и Pause & Resume:
|
||||
```python
|
||||
# CSS-селекторы
|
||||
page.css('a::text') # Извлечь текст
|
||||
page.css('a::attr(href)') # Извлечь атрибуты
|
||||
page.css('a', recursive=False) # Только прямые элементы
|
||||
page.css('a', auto_save=True) # Автоматически сохранять позиции элементов
|
||||
from scrapling.spiders import Spider, Request, Response
|
||||
|
||||
# XPath
|
||||
page.xpath('//a/text()')
|
||||
class QuotesSpider(Spider):
|
||||
name = "quotes"
|
||||
start_urls = ["https://quotes.toscrape.com/"]
|
||||
concurrent_requests = 10
|
||||
|
||||
# Гибкий поиск
|
||||
page.find_by_text('Python', first_match=True) # Найти по тексту
|
||||
page.find_by_regex(r'\d{4}') # Найти по паттерну regex
|
||||
page.find('div', {'class': 'container'}) # Найти по атрибутам
|
||||
async def parse(self, response: Response):
|
||||
for quote in response.css('.quote'):
|
||||
yield {
|
||||
"text": quote.css('.text::text').get(),
|
||||
"author": quote.css('.author::text').get(),
|
||||
}
|
||||
|
||||
# Навигация
|
||||
element.parent # Получить родительский элемент
|
||||
element.next_sibling # Получить следующего брата
|
||||
element.children # Получить дочерние элементы
|
||||
next_page = response.css('.next a')
|
||||
if next_page:
|
||||
yield response.follow(next_page[0].attrib['href'])
|
||||
|
||||
# Похожие элементы
|
||||
similar = page.get_similar(element) # Найти похожие элементы
|
||||
|
||||
# Адаптивный скрапинг
|
||||
saved_elements = page.css('.product', auto_save=True)
|
||||
# Позже, когда сайт изменится:
|
||||
page.css('.product', adaptive=True) # Найти элементы используя сохраненные позиции
|
||||
result = QuotesSpider().start()
|
||||
print(f"Извлечено {len(result.items)} цитат")
|
||||
result.items.to_json("quotes.json")
|
||||
```
|
||||
|
||||
### Использование сессий
|
||||
Используйте несколько типов сессий в одном Spider:
|
||||
```python
|
||||
from scrapling.fetchers import FetcherSession, AsyncFetcherSession
|
||||
from scrapling.spiders import Spider, Request, Response
|
||||
from scrapling.fetchers import FetcherSession, AsyncStealthySession
|
||||
|
||||
# Синхронная сессия
|
||||
with FetcherSession() as session:
|
||||
# Cookie автоматически сохраняются
|
||||
page1 = session.get('https://quotes.toscrape.com/login')
|
||||
page2 = session.post('https://quotes.toscrape.com/login', data={'username': 'admin', 'password': 'admin'})
|
||||
|
||||
# При необходимости переключите отпечаток браузера
|
||||
class MultiSessionSpider(Spider):
|
||||
name = "multi"
|
||||
start_urls = ["https://example.com/"]
|
||||
|
||||
def configure_sessions(self, manager):
|
||||
manager.add("fast", FetcherSession(impersonate="chrome"))
|
||||
manager.add("stealth", AsyncStealthySession(headless=True), lazy=True)
|
||||
|
||||
async def parse(self, response: Response):
|
||||
for link in response.css('a::attr(href)').getall():
|
||||
# Направляйте защищённые страницы через stealth-сессию
|
||||
if "protected" in link:
|
||||
yield Request(link, sid="stealth")
|
||||
else:
|
||||
yield Request(link, sid="fast", callback=self.parse) # явный callback
|
||||
```
|
||||
Приостанавливайте и возобновляйте длительные обходы с помощью Checkpoint'ов, запуская Spider следующим образом:
|
||||
```python
|
||||
QuotesSpider(crawldir="./crawl_data").start()
|
||||
```
|
||||
Нажмите Ctrl+C для мягкой остановки — прогресс сохраняется автоматически. Позже, когда вы снова запустите Spider, передайте тот же `crawldir`, и он продолжит с того места, где остановился.
|
||||
|
||||
### Продвинутый парсинг и навигация
|
||||
```python
|
||||
from scrapling.fetchers import Fetcher
|
||||
|
||||
# Богатый выбор элементов и навигация
|
||||
page = Fetcher.get('https://quotes.toscrape.com/')
|
||||
|
||||
# Получение цитат различными методами выбора
|
||||
quotes = page.css('.quote') # CSS-селектор
|
||||
quotes = page.xpath('//div[@class="quote"]') # XPath
|
||||
quotes = page.find_all('div', {'class': 'quote'}) # В стиле BeautifulSoup
|
||||
# То же самое, что
|
||||
quotes = page.find_all('div', class_='quote')
|
||||
quotes = page.find_all(['div'], class_='quote')
|
||||
quotes = page.find_all(class_='quote') # и так далее...
|
||||
# Найти элемент по текстовому содержимому
|
||||
quotes = page.find_by_text('quote', tag='div')
|
||||
|
||||
# Продвинутая навигация
|
||||
quote_text = page.css('.quote')[0].css('.text::text').get()
|
||||
quote_text = page.css('.quote').css('.text::text').getall() # Цепочка селекторов
|
||||
first_quote = page.css('.quote')[0]
|
||||
author = first_quote.next_sibling.css('.author::text')
|
||||
parent_container = first_quote.parent
|
||||
|
||||
# Связи элементов и подобие
|
||||
similar_elements = first_quote.find_similar()
|
||||
below_elements = first_quote.below_elements()
|
||||
```
|
||||
Вы можете использовать парсер напрямую, если не хотите загружать сайты, как показано ниже:
|
||||
```python
|
||||
from scrapling.parser import Selector
|
||||
|
||||
page = Selector("<html>...</html>")
|
||||
```
|
||||
И он работает точно так же!
|
||||
|
||||
### Примеры async Session
|
||||
```python
|
||||
import asyncio
|
||||
from scrapling.fetchers import FetcherSession, AsyncStealthySession, AsyncDynamicSession
|
||||
|
||||
async with FetcherSession(http3=True) as session: # `FetcherSession` контекстно-осведомлён и может работать как в sync, так и в async-режимах
|
||||
page1 = session.get('https://quotes.toscrape.com/')
|
||||
page2 = session.get('https://quotes.toscrape.com/', impersonate='firefox135')
|
||||
|
||||
# Использование асинхронной сессии
|
||||
# Использование async-сессии
|
||||
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()) # Опционально - Статус пула вкладок браузера (занят/свободен/ошибка)
|
||||
|
||||
print(session.get_pool_stats()) # Опционально — статус пула вкладок браузера (занят/свободен/ошибка)
|
||||
results = await asyncio.gather(*tasks)
|
||||
print(session.get_pool_stats())
|
||||
```
|
||||
|
||||
## CLI и интерактивная оболочка
|
||||
## CLI и интерактивная Shell
|
||||
|
||||
Scrapling v0.3 включает мощный интерфейс командной строки:
|
||||
Scrapling включает мощный интерфейс командной строки:
|
||||
|
||||
[](https://asciinema.org/a/736339)
|
||||
|
||||
Запустить интерактивную оболочку веб-скрапинга
|
||||
Запустить интерактивную Web Scraping Shell
|
||||
```bash
|
||||
scrapling shell
|
||||
```
|
||||
Извлечь страницы в файл напрямую без программирования (Извлекает содержимое внутри тега `body` по умолчанию). Если выходной файл заканчивается на `.txt`, то будет извлечено текстовое содержимое цели. Если заканчивается на `.md`, это будет Markdown-представление HTML-содержимого; если заканчивается на `.html`, это будет само HTML-содержимое.
|
||||
Извлечь страницы в файл напрямую без программирования (по умолчанию извлекает содержимое внутри тега `body`). Если выходной файл заканчивается на `.txt`, будет извлечено текстовое содержимое цели. Если заканчивается на `.md`, это будет Markdown-представление HTML-содержимого; если заканчивается на `.html`, это будет само HTML-содержимое.
|
||||
```bash
|
||||
scrapling extract get 'https://example.com' content.md
|
||||
scrapling extract get 'https://example.com' content.txt --css-selector '#fromSkipToProducts' --impersonate 'chrome' # Все элементы, соответствующие CSS-селектору '#fromSkipToProducts'
|
||||
@@ -231,24 +306,24 @@ scrapling extract stealthy-fetch 'https://nopecha.com/demo/cloudflare' captchas.
|
||||
```
|
||||
|
||||
> [!NOTE]
|
||||
> Есть много дополнительных функций, но мы хотим сохранить эту страницу краткой, например, MCP-сервер и интерактивная оболочка веб-скрапинга. Ознакомьтесь с полной документацией [здесь](https://scrapling.readthedocs.io/en/latest/)
|
||||
> Есть множество дополнительных возможностей, но мы хотим сохранить эту страницу краткой, включая MCP-сервер и интерактивную Web Scraping Shell. Ознакомьтесь с полной документацией [здесь](https://scrapling.readthedocs.io/en/latest/)
|
||||
|
||||
## Тесты производительности
|
||||
|
||||
Scrapling не только мощный - он также невероятно быстрый, и обновления с версии 0.3 обеспечили исключительные улучшения производительности во всех операциях. Следующие тесты производительности сравнивают парсер Scrapling с другими популярными библиотеками.
|
||||
Scrapling не только мощный — он ещё и невероятно быстрый. Следующие тесты производительности сравнивают парсер Scrapling с последними версиями других популярных библиотек.
|
||||
|
||||
### Тест скорости извлечения текста (5000 вложенных элементов)
|
||||
|
||||
| # | Библиотека | Время (мс) | vs Scrapling |
|
||||
| # | Библиотека | Время (мс) | vs Scrapling |
|
||||
|---|:-----------------:|:----------:|:------------:|
|
||||
| 1 | Scrapling | 1.99 | 1.0x |
|
||||
| 2 | Parsel/Scrapy | 2.01 | 1.01x |
|
||||
| 3 | Raw Lxml | 2.5 | 1.256x |
|
||||
| 4 | PyQuery | 22.93 | ~11.5x |
|
||||
| 5 | Selectolax | 80.57 | ~40.5x |
|
||||
| 6 | BS4 with Lxml | 1541.37 | ~774.6x |
|
||||
| 7 | MechanicalSoup | 1547.35 | ~777.6x |
|
||||
| 8 | BS4 with html5lib | 3410.58 | ~1713.9x |
|
||||
| 1 | Scrapling | 2.02 | 1.0x |
|
||||
| 2 | Parsel/Scrapy | 2.04 | 1.01 |
|
||||
| 3 | Raw Lxml | 2.54 | 1.257 |
|
||||
| 4 | PyQuery | 24.17 | ~12x |
|
||||
| 5 | Selectolax | 82.63 | ~41x |
|
||||
| 6 | MechanicalSoup | 1549.71 | ~767.1x |
|
||||
| 7 | BS4 with Lxml | 1584.31 | ~784.3x |
|
||||
| 8 | BS4 with html5lib | 3391.91 | ~1679.1x |
|
||||
|
||||
|
||||
### Производительность подобия элементов и текстового поиска
|
||||
@@ -257,8 +332,8 @@ Scrapling не только мощный - он также невероятно
|
||||
|
||||
| Библиотека | Время (мс) | vs Scrapling |
|
||||
|-------------|:----------:|:------------:|
|
||||
| Scrapling | 2.46 | 1.0x |
|
||||
| AutoScraper | 13.3 | 5.407x |
|
||||
| Scrapling | 2.39 | 1.0x |
|
||||
| AutoScraper | 12.45 | 5.209x |
|
||||
|
||||
|
||||
> Все тесты производительности представляют собой средние значения более 100 запусков. См. [benchmarks.py](https://github.com/D4Vinci/Scrapling/blob/main/benchmarks.py) для методологии.
|
||||
@@ -271,33 +346,33 @@ Scrapling требует Python 3.10 или выше:
|
||||
pip install scrapling
|
||||
```
|
||||
|
||||
Начиная с v0.3.2, эта установка включает только движок парсера и его зависимости, без каких-либо фетчеров или зависимостей командной строки.
|
||||
Эта установка включает только движок парсера и его зависимости, без каких-либо Fetcher'ов или зависимостей командной строки.
|
||||
|
||||
### Опциональные зависимости
|
||||
|
||||
1. Если вы собираетесь использовать какие-либо из дополнительных функций ниже, фетчеры или их классы, вам необходимо установить зависимости фетчеров и их зависимости браузера следующим образом:
|
||||
1. Если вы собираетесь использовать какие-либо из дополнительных возможностей ниже, Fetcher'ы или их классы, вам необходимо установить зависимости Fetcher'ов и браузеров следующим образом:
|
||||
```bash
|
||||
pip install "scrapling[fetchers]"
|
||||
|
||||
|
||||
scrapling install
|
||||
```
|
||||
|
||||
Это загрузит все браузеры вместе с их системными зависимостями и зависимостями манипуляции отпечатками.
|
||||
Это загрузит все браузеры вместе с их системными зависимостями и зависимостями для манипуляции fingerprint'ами.
|
||||
|
||||
2. Дополнительные функции:
|
||||
2. Дополнительные возможности:
|
||||
- Установить функцию MCP-сервера:
|
||||
```bash
|
||||
pip install "scrapling[ai]"
|
||||
```
|
||||
- Установить функции оболочки (оболочка веб-скрапинга и команда `extract`):
|
||||
- Установить функции Shell (Web Scraping Shell и команда `extract`):
|
||||
```bash
|
||||
pip install "scrapling[shell]"
|
||||
```
|
||||
- Установить все:
|
||||
- Установить всё:
|
||||
```bash
|
||||
pip install "scrapling[all]"
|
||||
```
|
||||
Помните, что вам нужно установить зависимости браузера с помощью `scrapling install` после любого из этих дополнений (если вы еще этого не сделали)
|
||||
Помните, что вам нужно установить зависимости браузеров с помощью `scrapling install` после любого из этих дополнений (если вы ещё этого не сделали)
|
||||
|
||||
### Docker
|
||||
Вы также можете установить Docker-образ со всеми дополнениями и браузерами с помощью следующей команды из DockerHub:
|
||||
@@ -308,11 +383,11 @@ docker pull pyd4vinci/scrapling
|
||||
```bash
|
||||
docker pull ghcr.io/d4vinci/scrapling:latest
|
||||
```
|
||||
Этот образ автоматически создается и отправляется с использованием GitHub Actions и основной ветки репозитория.
|
||||
Этот образ автоматически создаётся и публикуется с помощью GitHub Actions и основной ветки репозитория.
|
||||
|
||||
## Вклад
|
||||
## Участие в разработке
|
||||
|
||||
Мы приветствуем вклад! Пожалуйста, прочитайте наши [руководства по внесению вклада](https://github.com/D4Vinci/Scrapling/blob/main/CONTRIBUTING.md) перед началом работы.
|
||||
Мы приветствуем участие! Пожалуйста, прочитайте наши [руководства по участию в разработке](https://github.com/D4Vinci/Scrapling/blob/main/CONTRIBUTING.md) перед началом работы.
|
||||
|
||||
## Отказ от ответственности
|
||||
|
||||
@@ -328,12 +403,5 @@ docker pull ghcr.io/d4vinci/scrapling:latest
|
||||
Этот проект включает код, адаптированный из:
|
||||
- Parsel (лицензия BSD) — Используется для подмодуля [translator](https://github.com/D4Vinci/Scrapling/blob/main/scrapling/core/translator.py)
|
||||
|
||||
## Благодарности и ссылки
|
||||
|
||||
- Блестящая работа [Daijro](https://github.com/daijro) над [BrowserForge](https://github.com/daijro/browserforge) и [Camoufox](https://github.com/daijro/camoufox)
|
||||
- Блестящая работа [Vinyzu](https://github.com/Vinyzu) над [Botright](https://github.com/Vinyzu/Botright) и [PatchRight](https://github.com/Kaliiiiiiiiii-Vinyzu/patchright)
|
||||
- [brotector](https://github.com/kaliiiiiiiiii/brotector) за техники обхода обнаружения браузера
|
||||
- [fakebrowser](https://github.com/kkoooqq/fakebrowser) и [BotBrowser](https://github.com/botswin/BotBrowser) за исследование отпечатков
|
||||
|
||||
---
|
||||
<div align="center"><small>Разработано и создано с ❤️ Карим Шоаир.</small></div><br>
|
||||
<div align="center"><small>Разработано и создано с ❤️ Карим Шоаир.</small></div><br>
|
||||
|
||||
Reference in New Issue
Block a user