vek-parser


Namevek-parser JSON
Version 0.1.2 PyPI version JSON
download
home_pageNone
SummaryУниверсальный парсер для сбора структурированных данных с веб-сайтов
upload_time2025-03-03 20:19:53
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseNone
keywords crawler parser scraping web
VCS
bugtrack_url
requirements requests selectorlib parsel PyYAML
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Полное руководство по настройке VekParser

## Основные концепции

### Контекст выполнения
- Динамический словарь данных, передаваемый между шагами
- Формируется из:
  - Результатов выполнения предыдущих шагов
  - Начального контекста (initial_context)
  - Статических значений (через шаг `static`)
- Используется через шаблоны `{variable}` в URL и параметрах

### Жизненный цикл шага
1. Получение входного контекста
2. Исполнение логики шага
3. Сохранение результатов в новый контекст
4. Передача обогащенного контекста последующим шагам

---

## Структура конфигурационного файла

### Корневая структура
```yaml
steps:            # Обязательный элемент. Список всех шагов
  - name: "..."   # Уникальный идентификатор шага
    type: "..."   # Тип обработки (static/extract/list)
    # ... параметры конкретного типа
```

---

## Типы шагов обработки

### 1. static — статическое заполнение контекста
```yaml
- name: init_vars
  type: static
  values:         # Фиксированные значения
    items_per_page: 20
    language: "ru"
  next_steps:     # Опциональное продолжение цепочки
    - step: "load_page"     # Имя следующего шага
      context_map:         # Маппинг данных в контекст
        page_num: items_per_page  # page_num = context['items_per_page']
```

### 2. extract — извлечение данных со страницы
```yaml
- name: parse_products
  type: extract
  url: "/catalog?page={page_num}"  # Подстановка из контекста
  data:              # Конфигурация для selectorlib
    products:        # Ключ для сохранения в контекст
      css: "div.product-card"
      multiple: true  # Сбор всех совпадений
      children:       # Вложенные элементы
        title: "h2::text"
        price: ".price::attr(data-value)"
        details_url: "a.more::attr(href)"
  next_steps:
    - step: "process_products"
      context_map:
        product_links: details_url  # Передача ссылок
```

### 3. list — параллельная обработка коллекции элементов
```yaml
- name: process_products
  type: list
  source: product_links  # Источник данных из контекста
  output: parsed_items   # Ключ для сохранения результатов
  steps:                 # Цепочка обработки для каждого элемента
    - name: product_page
      type: extract
      url: "{details_url}"  # URL из элемента коллекции
      data:
        specifications:
          css: "div.specs-table"
          children:
            weight: "span.weight::text"
            dimensions: "span.size::text"
```

---

## Механизм работы контекста

### Пример передачи данных
1. Исходный контекст:
   ```python
   {'category_id': 42, 'region': 'eu'}
   ```
2. После шага static:
   ```yaml
   values: {page: 3, currency: 'USD'}
   ```
   Контекст → `{'category_id': 42, 'region': 'eu', 'page': 3, 'currency': 'USD'}`

3. В шаге extract:
   ```yaml
   url: "/v2/{category_id}?region={region}&p={page}"
   ```
   Результат URL → `/v2/42?region=eu&p=3`

4. Результат выполнения extract:
   ```python
   {'product_count': 15, 'items': [...]}
   ```
   Обновленный контекст → `{..., 'product_count': 15, 'items': [...]}`

---

## Полный пример конфигурации

`config.yml`:
```yaml
steps:
  - name: initialization
    type: static
    values:
      catalog_section: "electronics"
      max_threads: 8
    next_steps:
      - step: parse_main_category

  - name: parse_main_category
    type: extract
    url: "/categories/{catalog_section}"
    data:
      subcategories:
        css: "ul.subcategories li"
        multiple: true
        children:
          name: "a::text"
          url: "a::attr(href)"
      products:
        css: "div.product-tile"
        multiple: true
        children:
          title: "h3::text"
          product_url: "a::attr(href)"
    next_steps:
      - step: process_subcategories
        context_map:
          subcategory_links: subcategories.url
      - step: process_products
        context_map:
          product_links: products.product_url

  - name: process_subcategories
    type: list
    source: subcategory_links
    output: parsed_subcategories
    steps:
      - name: subcategory_page
        type: extract
        url: "{item}"
        data:
          product_count: "span.count::text"
          description: "div.category-description::text"

  - name: process_products
    type: list
    source: product_links
    output: parsed_products
    steps:
      - name: product_details
        type: extract
        url: "{item}"
        data:
          title: "h1.product-title::text"
          price: "meta[itemprop=price]::attr(content)"
          sku: "div.product-id::text"
```

---

## Правила построения конфигурации

1. **Порядок объявления шагов** не влияет на выполнение — последовательность определяется через `next_steps`
2. **Точка входа** — всегда первый шаг в списке `steps`
3. **Автоматическое обогащение контекста**:
   - Результаты каждого шага добавляются в контекст
   - `context_map` позволяет переносить данные между шагами
4. **Динамические URL** должны использовать шаблоны `{variable_name}`

---

## Обработка ошибок и отладка

- **Ошибки выполнения шага**: Логируются с указанием шага, выполнение продолжается
- **Рекомендации по запросам**:
  - Увеличивайте `delay` при частых ошибках соединения
  - Настраивайте `max_workers` в зависимости от нагрузки
- **Файл лога**: `parser.log` с детальной информацией (уровень DEBUG)
            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "vek-parser",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": null,
    "keywords": "crawler, parser, scraping, web",
    "author": null,
    "author_email": "Emil Markov <markovemil2@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/bd/eb/c186c954aa0b07f37c839f3e7d8037217b317ff9ddd600a62714cc6cc6b9/vek_parser-0.1.2.tar.gz",
    "platform": null,
    "description": "# \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 VekParser\n\n## \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438\n\n### \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\n- \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0433\u0430\u043c\u0438\n- \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437:\n  - \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0448\u0430\u0433\u043e\u0432\n  - \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 (initial_context)\n  - \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u0447\u0435\u0440\u0435\u0437 \u0448\u0430\u0433 `static`)\n- \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u044b `{variable}` \u0432 URL \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445\n\n### \u0416\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0448\u0430\u0433\u0430\n1. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\n2. \u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u0448\u0430\u0433\u0430\n3. \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\n4. \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u0430\u043c\n\n---\n\n## \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430\n\n### \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\n```yaml\nsteps:            # \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0448\u0430\u0433\u043e\u0432\n  - name: \"...\"   # \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0448\u0430\u0433\u0430\n    type: \"...\"   # \u0422\u0438\u043f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (static/extract/list)\n    # ... \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430\n```\n\n---\n\n## \u0422\u0438\u043f\u044b \u0448\u0430\u0433\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n\n### 1. static \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\n```yaml\n- name: init_vars\n  type: static\n  values:         # \u0424\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n    items_per_page: 20\n    language: \"ru\"\n  next_steps:     # \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0446\u0435\u043f\u043e\u0447\u043a\u0438\n    - step: \"load_page\"     # \u0418\u043c\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0448\u0430\u0433\u0430\n      context_map:         # \u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\n        page_num: items_per_page  # page_num = context['items_per_page']\n```\n\n### 2. extract \u2014 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n```yaml\n- name: parse_products\n  type: extract\n  url: \"/catalog?page={page_num}\"  # \u041f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\n  data:              # \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043b\u044f selectorlib\n    products:        # \u041a\u043b\u044e\u0447 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\n      css: \"div.product-card\"\n      multiple: true  # \u0421\u0431\u043e\u0440 \u0432\u0441\u0435\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439\n      children:       # \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n        title: \"h2::text\"\n        price: \".price::attr(data-value)\"\n        details_url: \"a.more::attr(href)\"\n  next_steps:\n    - step: \"process_products\"\n      context_map:\n        product_links: details_url  # \u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u0441\u044b\u043b\u043e\u043a\n```\n\n### 3. list \u2014 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n```yaml\n- name: process_products\n  type: list\n  source: product_links  # \u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\n  output: parsed_items   # \u041a\u043b\u044e\u0447 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432\n  steps:                 # \u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    - name: product_page\n      type: extract\n      url: \"{details_url}\"  # URL \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438\n      data:\n        specifications:\n          css: \"div.specs-table\"\n          children:\n            weight: \"span.weight::text\"\n            dimensions: \"span.size::text\"\n```\n\n---\n\n## \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\n\n### \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n1. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442:\n   ```python\n   {'category_id': 42, 'region': 'eu'}\n   ```\n2. \u041f\u043e\u0441\u043b\u0435 \u0448\u0430\u0433\u0430 static:\n   ```yaml\n   values: {page: 3, currency: 'USD'}\n   ```\n   \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u2192 `{'category_id': 42, 'region': 'eu', 'page': 3, 'currency': 'USD'}`\n\n3. \u0412 \u0448\u0430\u0433\u0435 extract:\n   ```yaml\n   url: \"/v2/{category_id}?region={region}&p={page}\"\n   ```\n   \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 URL \u2192 `/v2/42?region=eu&p=3`\n\n4. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f extract:\n   ```python\n   {'product_count': 15, 'items': [...]}\n   ```\n   \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u2192 `{..., 'product_count': 15, 'items': [...]}`\n\n---\n\n## \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n\n`config.yml`:\n```yaml\nsteps:\n  - name: initialization\n    type: static\n    values:\n      catalog_section: \"electronics\"\n      max_threads: 8\n    next_steps:\n      - step: parse_main_category\n\n  - name: parse_main_category\n    type: extract\n    url: \"/categories/{catalog_section}\"\n    data:\n      subcategories:\n        css: \"ul.subcategories li\"\n        multiple: true\n        children:\n          name: \"a::text\"\n          url: \"a::attr(href)\"\n      products:\n        css: \"div.product-tile\"\n        multiple: true\n        children:\n          title: \"h3::text\"\n          product_url: \"a::attr(href)\"\n    next_steps:\n      - step: process_subcategories\n        context_map:\n          subcategory_links: subcategories.url\n      - step: process_products\n        context_map:\n          product_links: products.product_url\n\n  - name: process_subcategories\n    type: list\n    source: subcategory_links\n    output: parsed_subcategories\n    steps:\n      - name: subcategory_page\n        type: extract\n        url: \"{item}\"\n        data:\n          product_count: \"span.count::text\"\n          description: \"div.category-description::text\"\n\n  - name: process_products\n    type: list\n    source: product_links\n    output: parsed_products\n    steps:\n      - name: product_details\n        type: extract\n        url: \"{item}\"\n        data:\n          title: \"h1.product-title::text\"\n          price: \"meta[itemprop=price]::attr(content)\"\n          sku: \"div.product-id::text\"\n```\n\n---\n\n## \u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n\n1. **\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0448\u0430\u0433\u043e\u0432** \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u2014 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 `next_steps`\n2. **\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430** \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 `steps`\n3. **\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430**:\n   - \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\n   - `context_map` \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0433\u0430\u043c\u0438\n4. **\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 URL** \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u044b `{variable_name}`\n\n---\n\n## \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430\n\n- **\u041e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0448\u0430\u0433\u0430**: \u041b\u043e\u0433\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0448\u0430\u0433\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f\n- **\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c**:\n  - \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0439\u0442\u0435 `delay` \u043f\u0440\u0438 \u0447\u0430\u0441\u0442\u044b\u0445 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\n  - \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0439\u0442\u0435 `max_workers` \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438\n- **\u0424\u0430\u0439\u043b \u043b\u043e\u0433\u0430**: `parser.log` \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 (\u0443\u0440\u043e\u0432\u0435\u043d\u044c DEBUG)",
    "bugtrack_url": null,
    "license": null,
    "summary": "\u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442\u043e\u0432",
    "version": "0.1.2",
    "project_urls": {
        "Documentation": "https://github.com/EmilMarkov/VekParser#readme",
        "Homepage": "https://github.com/EmilMarkov/VekParser",
        "Repository": "https://github.com/EmilMarkov/VekParser.git"
    },
    "split_keywords": [
        "crawler",
        " parser",
        " scraping",
        " web"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a168fd5c7e2bcdf306ac5b64e085aeca27e06d8d3321b6ccecbd8ad96ba78678",
                "md5": "81534a4beea6e7764629a00227c226a5",
                "sha256": "be3e12eb62715794ee6bd453fc572601fd5e4e3b9e1769fd45ce1da3647cf423"
            },
            "downloads": -1,
            "filename": "vek_parser-0.1.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "81534a4beea6e7764629a00227c226a5",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 7887,
            "upload_time": "2025-03-03T20:19:52",
            "upload_time_iso_8601": "2025-03-03T20:19:52.620048Z",
            "url": "https://files.pythonhosted.org/packages/a1/68/fd5c7e2bcdf306ac5b64e085aeca27e06d8d3321b6ccecbd8ad96ba78678/vek_parser-0.1.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "bdebc186c954aa0b07f37c839f3e7d8037217b317ff9ddd600a62714cc6cc6b9",
                "md5": "7676ac6cc828d19f977712d24270cc15",
                "sha256": "d2b56ae04b709e3cb9fa61a1db0b34eb1ce36d3340ea6645120b86b4b7b6ce4d"
            },
            "downloads": -1,
            "filename": "vek_parser-0.1.2.tar.gz",
            "has_sig": false,
            "md5_digest": "7676ac6cc828d19f977712d24270cc15",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 7961,
            "upload_time": "2025-03-03T20:19:53",
            "upload_time_iso_8601": "2025-03-03T20:19:53.509582Z",
            "url": "https://files.pythonhosted.org/packages/bd/eb/c186c954aa0b07f37c839f3e7d8037217b317ff9ddd600a62714cc6cc6b9/vek_parser-0.1.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-03-03 20:19:53",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "EmilMarkov",
    "github_project": "VekParser#readme",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "requests",
            "specs": [
                [
                    ">=",
                    "2.25.0"
                ]
            ]
        },
        {
            "name": "selectorlib",
            "specs": [
                [
                    ">=",
                    "0.16.0"
                ]
            ]
        },
        {
            "name": "parsel",
            "specs": [
                [
                    ">=",
                    "1.7.0"
                ]
            ]
        },
        {
            "name": "PyYAML",
            "specs": [
                [
                    ">=",
                    "5.4.0"
                ]
            ]
        }
    ],
    "lcname": "vek-parser"
}
        
Elapsed time: 1.51904s