Skip to main content

Универсальный парсер для сбора структурированных данных с веб-сайтов

Project description

Полный гайд по конфигурации VekParser

Базовые концепции

Контекст (Context)

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

Жизненный цикл шага

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

Структура конфига (config.yml)

Корневые элементы

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

Типы шагов (подробно)

1. static — статические данные

- name: setup_vars
  type: static
  values:          # Фиксированные значения
    page: 1
    lang: "en"
  next_steps:      # Опционально. Что выполнить после
    - step: "parse_page"  # Имя следующего шага
      context_map:        # Маппинг данных в контекст
        current_page: page  # current_page = context['page']

2. extract — парсинг страницы

- name: parse_page
  type: extract
  url: "/products?page={current_page}"  # Используем контекст
  data:              # Использует selectorlib синтаксис
    product_list:
      css: "div.product"
      multiple: true
      children:
        title: "h2::text"
        link: "a::attr(href)"
  extract:           # Использует parsel синтаксис
    pagination:
      target: links  # Тип извлечения (links/data/html)
      selector: "a.page-link"
      attr: "data-page"  # Опциональный атрибут
  next_steps:
    - step: "process_products"
      context_map:
        items: product_list  # Передаем список продуктов

Поддерживаемые target:

  • links: список {url, text, [attr]}
  • data: словарь {field: value}
  • html: сырой HTML/текст

3. list — обработка списка элементов

- name: process_products
  type: list
  source: items     # Откуда брать элементы (из контекста)
  output: products  # Куда сохранить результат
  steps:            # Вложенные шаги для каждого элемента
    - name: product_detail
      type: extract
      url: "{link}"  # URL из элемента списка
      extract:
        specs:
          target: data
          selectors:
            sku: "div#sku::text"
            price: "span.price::text"

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

Пример потока данных

  1. Начальный контекст:

    {'category': 'electronics'}
    
  2. После шага static:

    values: {page: 1}
    

    Контекст → {'category': 'electronics', 'page': 1}

  3. В extract шаге:

    url: "/catalog/{category}?page={page}"
    

    URL → /catalog/electronics?page=1

  4. Результат extract шага:

    {'products': [...]}
    

    Новый контекст → {..., 'products': [...]}


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

config.yml:

steps:
  - name: init
    type: static
    values:
      base_category: "smartphones"
    next_steps:
      - step: parse_category

  - name: parse_category
    type: extract
    url: "/shop/{base_category}"
    extract:
      subcategories:
        target: links
        selector: "nav.subcategories a"
        attr: "data-id"
      items:
        target: links
        selector: "div.product-card a.title"
    next_steps:
      - step: process_subcategories
        context_map:
          subcats: subcategories
      - step: process_items
        context_map:
          products: items

  - name: process_subcategories
    type: list
    source: subcats
    output: parsed_subcats
    steps:
      - name: parse_subcategory
        type: extract
        url: "{url}"
        extract:
          title: "h1::text"
          description: "div.content::text"

  - name: process_items
    type: list
    source: products
    output: parsed_products
    steps:
      - name: item_page
        type: extract
        url: "{url}"
        extract:
          details:
            target: data
            selectors:
              brand: "meta[itemprop='brand']::attr(content)"
              rating: "span.score::text"

Правила составления конфига

  1. Порядок шагов в YAML не важен — выполнение определяется next_steps
  2. Всегда стартует первый шаг в списке steps
  3. Контекст автоматически обогащается:
    • Результатами каждого шага
    • Данными из context_map
  4. Для работы с динамическими URL всегда используйте {variable}

Обработка ошибок

  • При ошибке в шаге: запись в лог, переход к следующему элементу
  • Для повтора запросов: увеличивайте delay в конструкторе
  • Для отладки: смотрите parser.log с уровнем DEBUG

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

vek_parser-0.1.1.tar.gz (8.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

vek_parser-0.1.1-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file vek_parser-0.1.1.tar.gz.

File metadata

  • Download URL: vek_parser-0.1.1.tar.gz
  • Upload date:
  • Size: 8.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.21

File hashes

Hashes for vek_parser-0.1.1.tar.gz
Algorithm Hash digest
SHA256 89429c0eb99352c78a3b96895fcbcdc33b5063c463eb40194c94a23588c65d96
MD5 67e357206f6fad5127664ec5133d0bae
BLAKE2b-256 260ab43c71eeffc64b3f1900f434521c361a396919e50c11c3458bdf9e67830e

See more details on using hashes here.

File details

Details for the file vek_parser-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: vek_parser-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 8.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.21

File hashes

Hashes for vek_parser-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 22fab3f6db7669aebbf025381788c7349130bddb04b0c9ab308cd7c0d6499360
MD5 9da42739565009b64182077e40ef0aaa
BLAKE2b-256 8c5e6230d1a67f55389d399603a1919137b86ab739d35fcd9dbcfa69aa648827

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page