1. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 750+ и мы растем!
    Скрыть объявление

Обзор вариантов последовательного выполнения нескольких заданий

Автоматизация выполнения нескольких связанных заданий

  1. Support
    Очень часто возникают задачи, решение которых требует использования нескольких разных парсеров. Поэтому в данном обзоре будут рассмотрены различные варианты работы с несколькими заданиями.

    Ручной режим
    Это самый простой и не требующий каких-либо настроек способ. Создаются несколько заданий, вручную запускается первое, а после его завершения вручную запускается второе, но уже с файлом результатов из первого.
    Этот вариант можно немного автоматизировать, указав в первом статичное имя файла. Тогда во втором задании нужно прописать в качестве файла запросов уже заранее известное имя файла. Также нужно в Настройках задать Максимум активных заданий = 1 и можно запускать оба задания сразу. Второе будет ждать в очереди, пока закончит работу первое и после этого начнет обрабатывать файл результатов из первого.

    Цепочка заданий
    Это более продвинутый способ для связывания нескольких заданий. Заключается он в том, что в первом задании нужно указать какой пресет запустить по его окончанию. Также можно выбрать конфиг потоков и передать файл результатов на вход.
    [​IMG]
    Данная функция дожидается завершения работы родительского задания и запускает дочернее, передавая на вход, при необходимости, файл результатов из родительского.

    $tools.query.add()
    Оба предыдущих варианта подразумевают то, что сначала полностью должно отработать первое задание, а только потом будет запущено второе. Но бывают случаи, когда это нерационально, либо когда нужно начинать выполнение второго задания, не дожидаясь первого.
    В таком случае будет полезен инструмент $tools.query.add(). Рассмотрим принцип работы на таком примере:
    Такая задача легко решается двумя пресетами на базе Net::HTTP Net::HTTP, где первый парсит ссылки на подкатегории, а второй переходит по этим ссылкам и парсит количество товаров. Но значительно проще не создавать 2 отдельных задания, а объединить в одно. В целом суть такого объединения заключается в том, что получаемые ссылки на подкатегории сразу подставляются в запросы и обрабатываются в порядке общей очереди в одном задании.
    Более подробно данный метод рассмотрен в отдельной статье: https://a-parser.com/resources/130/

    JavaScript парсер
    Рассмотрим такую задачу:
    Традиционным способом это можно сделать 2-мя заданиями: первое с помощью HTML::TextExtractor HTML::TextExtractor парсит текст и здесь же регуляркой забирает ссылку на картинку, а второе скачивает по списку ссылок из первого картинки. Объединить такое решение через подстановку запросов не получится, т.к. на разных уровнях нужно использовать разные парсеры. Поэтому здесь лучше воспользоваться JS парсером:
    1. используя this.parser.request() обращаемся к HTML::TextExtractor HTML::TextExtractor и забираем текст
    2. регулярным выражением парсим ссылку на картинку
    3. используя this.request() скачиваем картинку в указанную папку

    JS парсер + this.query.add()
    Это, пожалуй, наиболее сложный способ, но есть ряд задач, для решения которых можно использовать только его (естественно, если решать их одним заданием).
    Итак, представим такую задачу:
    Можно конечно решать эту задачу описанным выше способом, но т.к. на каждой странице может быть много внешних ссылок, то для проверки индексации их нужно будет перебирать в цикле и по очереди обрабатывать. Само собой, что вся эта обработка будет происходить в одном потоке. Но рациональнее будет распределить все внешние ссылки по всем доступным потокам, чтобы оптимизировать производительность. И такое распределение реализуется так:
    1. если уровень запроса (set.lvl) равен 0, то используя this.parser.request() обращаемся к HTML::LinkExtractor HTML::LinkExtractor и получаем список внешних ссылок
    2. с помощью this.query.add() подставляем их в очередь запросов
    3. если уровень запроса (set.lvl) равен 1, то опять же используя this.parser.request() обращаемся к SE::Google SE::Google и получаем кол-во ссылок в индексе, которое и выводим в результат

    В данной статье мы рассмотрели 5 способов последовательного выполнения нескольких заданий. Используя их, можно автоматизировать работу парсера и значительно увеличить производительность.
    Alex Parser и Vvtex нравится это.