Очень часто возникают задачи, решение которых требует использования нескольких разных парсеров. Поэтому в данном обзоре будут рассмотрены различные варианты работы с несколькими заданиями.
Ручной режим
Это самый простой и не требующий каких-либо настроек способ. Создаются несколько заданий, вручную запускается первое, а после его завершения вручную запускается второе, но уже с файлом результатов из первого.
Этот вариант можно немного автоматизировать, указав в первом статичное имя файла. Тогда во втором задании нужно прописать в качестве файла запросов уже заранее известное имя файла. Также нужно в Настройках задать Максимум активных заданий = 1 и можно запускать оба задания сразу. Второе будет ждать в очереди, пока закончит работу первое и после этого начнет обрабатывать файл результатов из первого.
Цепочка заданий
Это более продвинутый способ для связывания нескольких заданий. Заключается он в том, что в первом задании нужно указать какой пресет запустить по его окончанию. Также можно выбрать конфиг потоков и передать файл результатов на вход.
Данная функция дожидается завершения работы родительского задания и запускает дочернее, передавая на вход, при необходимости, файл результатов из родительского.
$tools.query.add()
Оба предыдущих варианта подразумевают то, что сначала полностью должно отработать первое задание, а только потом будет запущено второе. Но бывают случаи, когда это нерационально, либо когда нужно начинать выполнение второго задания, не дожидаясь первого.
В таком случае будет полезен инструмент $tools.query.add(). Рассмотрим принцип работы на таком примере:
Такая задача легко решается двумя пресетами на базе Net::HTTP, где первый парсит ссылки на подкатегории, а второй переходит по этим ссылкам и парсит количество товаров. Но значительно проще не создавать 2 отдельных задания, а объединить в одно. В целом суть такого объединения заключается в том, что получаемые ссылки на подкатегории сразу подставляются в запросы и обрабатываются в порядке общей очереди в одном задании.
Более подробно данный метод рассмотрен в отдельной статье: https://a-parser.com/resources/130/
JavaScript парсер
Рассмотрим такую задачу:
Традиционным способом это можно сделать 2-мя заданиями: первое с помощью HTML::TextExtractor парсит текст и здесь же регуляркой забирает ссылку на картинку, а второе скачивает по списку ссылок из первого картинки. Объединить такое решение через подстановку запросов не получится, т.к. на разных уровнях нужно использовать разные парсеры. Поэтому здесь лучше воспользоваться JS парсером:
- используя this.parser.request() обращаемся к HTML::TextExtractor и забираем текст
- регулярным выражением парсим ссылку на картинку
- используя this.request() скачиваем картинку в указанную папку
JS парсер + this.query.add()
Это, пожалуй, наиболее сложный способ, но есть ряд задач, для решения которых можно использовать только его (естественно, если решать их одним заданием).
Итак, представим такую задачу:
Можно конечно решать эту задачу описанным выше способом, но т.к. на каждой странице может быть много внешних ссылок, то для проверки индексации их нужно будет перебирать в цикле и по очереди обрабатывать. Само собой, что вся эта обработка будет происходить в одном потоке. Но рациональнее будет распределить все внешние ссылки по всем доступным потокам, чтобы оптимизировать производительность. И такое распределение реализуется так:
- если уровень запроса (set.lvl) равен 0, то используя this.parser.request() обращаемся к HTML::LinkExtractor и получаем список внешних ссылок
- с помощью this.query.add() подставляем их в очередь запросов
- если уровень запроса (set.lvl) равен 1, то опять же используя this.parser.request() обращаемся к SE::Google и получаем кол-во ссылок в индексе, которое и выводим в результат
В данной статье мы рассмотрели 5 способов последовательного выполнения нескольких заданий. Используя их, можно автоматизировать работу парсера и значительно увеличить производительность.
-
Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!Скрыть объявление
Обзор вариантов последовательного выполнения нескольких заданий
Автоматизация выполнения нескольких связанных заданий
Метки: