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

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

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

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

Цепочка заданий
Это более продвинутый способ для связывания нескольких заданий. Заключается он в том, что в первом задании нужно указать какой пресет запустить по его окончанию. Также можно выбрать конфиг потоков и передать файл результатов на вход.
9zzlc_190317171241.png

Данная функция дожидается завершения работы родительского задания и запускает дочернее, передавая на вход, при необходимости, файл результатов из родительского.

$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 способов последовательного выполнения нескольких заданий. Используя их, можно автоматизировать работу парсера и значительно увеличить производительность.
  • Like
Реакции: Alex Parser и Vvtex
Автор
Support
Просмотры
22
Первый выпуск
Обновление

Рейтинги

0,00 звёзд Оценок: 0

Ещё ресурсы от Support

Назад
Верх