# Полное руководство по настройке 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"
}