Обзор инструмента $tools.query

Обзор инструмента $tools.query

English Name
1.1.197
Еще в версии 1.1.197 в А-Парсере появился очень интересный инструмент $tools.query, благодаря которому стало возможным делать более продуктивные пресеты. С его помощью можно объединять несколько заданий в одно, реализовывать переходы на следующую страницу и подставлять полученные результаты обратно в запросы в рамках одного задания (там, где Check next page и Parse to level не могут этого сделать или просто отсутствуют).
Ниже мы рассмотрим несколько примеров использования данного инструмента.

Объединение нескольких заданий в одно
Задача: спарсить из раздела новости http://a-parser.com/forum/news/ ссылки на все новости, в которых встречается слово "Google" 2 и более раз.
Решение. Обычно такие задачи решаются 2-мя заданиями с использованием Net::HTTP Net::HTTP или HTML::LinkExtractor HTML::LinkExtractor. Первое задание парсит ссылки на все новости, а второе переходит по этим ссылкам, проверяет контент и при соответствии условию выводит результат. Благодаря $tools.query этот процесс можно сделать в одном задании. Алгоритм таков:
  • Используем Net::HTTP Net::HTTP
  • Парсим ссылки на новости, пользуясь Check next page для переходов на следующие страницы
  • С помощью $tools.query подставляем полученные ссылки в запросы
  • Проверяем кол-во указанного слова в контенте и при соответствии условию выводим ссылку
При подстановке запросов с помощью $tools.query они всегда подставляются на следующий уровень. Т.е. подставленные запросы будут обработаны на следующем уровне, но в рамках текущего запроса. Отсчет уровней начинается с 0. Текущий уровень всегда хранится в переменной $query.lvl. Уровень удобно использовать как ориентир для требуемых действий. В данном задании при $query.lvl = 0 парсер подставит полученные результаты в запросы, а при $query.lvl = 1 проверит и выведет результат. Инструмент $tools.query нужно использовать в Общем формате результата. Таким образом шаблон формата результата будет выглядеть так:
Код:
[% num = 2;

IF query.lvl == 0;

#Подставляем ссылки на новости обратно в запросы
    FOREACH p1.threads;
        tools.query.add('http://a-parser.com/' _ thread);
    END;

ELSIF query.lvl == 1;

#Проверяем и выводим результат
    IF p1.google.size >= num;
        query _ "\n";
    END;
END %]
А весь пресет будет выглядеть так:
floct.png

Код:
eyJwcmVzZXQiOiJ0b29scy5xdWVyeSBleGFtcGxlIDEiLCJ2YWx1ZSI6eyJwcmVz
ZXQiOiJ0b29scy5xdWVyeSBleGFtcGxlIDEiLCJwYXJzZXJzIjpbWyJOZXQ6OkhU
VFAiLCJkZWZhdWx0Iix7InR5cGUiOiJvdmVycmlkZSIsImlkIjoiZ29vZENvZGUi
LCJ2YWx1ZSI6WzIwMF19LHsidHlwZSI6ImN1c3RvbVJlc3VsdCIsInJlc3VsdCI6
WyJwYWdlcyIsImRhdGEiXSwicmVnZXgiOiI8aDMgY2xhc3M9XCJ0aXRsZVwiPlxc
cyo8YSBocmVmPVwiKC4rPylcIiIsInJlZ2V4VHlwZSI6ImciLCJyZXN1bHRUeXBl
IjoiYXJyYXkiLCJhcnJheU5hbWUiOiJ0aHJlYWRzIiwicmVzdWx0cyI6WyJ0aHJl
YWQiXX0seyJ0eXBlIjoib3B0aW9ucyIsImlkIjoiY2hlY2tOZXh0UGFnZSIsInZh
bHVlIjoiPGxpbmsgcmVsPVwibmV4dFwiIGhyZWY9XCIoLis/KVwiIiwiYWRkaXRp
b25hbCI6eyJjaGVja05leHRQYWdlTGltaXQiOiIwIn19LHsidHlwZSI6ImN1c3Rv
bVJlc3VsdCIsInJlc3VsdCI6ImRhdGEiLCJyZWdleCI6IihHb29nbGUpIiwicmVn
ZXhUeXBlIjoiZyIsInJlc3VsdFR5cGUiOiJhcnJheSIsImFycmF5TmFtZSI6Imdv
b2dsZSIsInJlc3VsdHMiOlsiY291bnQiXX1dXSwicmVzdWx0c0Zvcm1hdCI6Ilsl
IG51bSA9IDI7XG5cbklGIHF1ZXJ5Lmx2bCA9PSAwO1xuXHRGT1JFQUNIIHAxLnRo
cmVhZHM7XG5cdFx0dG9vbHMucXVlcnkuYWRkKCdodHRwOi8vYS1wYXJzZXIuY29t
LycgXyB0aHJlYWQpO1xuXHRFTkQ7XG5FTFNJRiBxdWVyeS5sdmwgPT0gMTtcblx0
SUYgcDEuZ29vZ2xlLnNpemUgPj0gbnVtO1xuXHRcdHF1ZXJ5IF8gXCJcXG5cIjtc
blx0RU5EO1xuRU5EICVdIiwicmVzdWx0c1NhdmVUbyI6ImZpbGUiLCJyZXN1bHRz
RmlsZU5hbWUiOiIkZGF0ZWZpbGUuZm9ybWF0KCkudHh0IiwiYWRkaXRpb25hbEZv
cm1hdHMiOltdLCJyZXN1bHRzVW5pcXVlIjoibm8iLCJxdWVyaWVzRnJvbSI6InRl
eHQiLCJxdWVyeUZvcm1hdCI6WyIkcXVlcnkiXSwidW5pcXVlUXVlcmllcyI6ZmFs
c2UsInNhdmVGYWlsZWRRdWVyaWVzIjpmYWxzZSwiaXRlcmF0b3JPcHRpb25zIjp7
Im9uQWxsTGV2ZWxzIjpmYWxzZSwicXVlcnlCdWlsZGVyc0FmdGVySXRlcmF0b3Ii
OmZhbHNlLCJxdWVyeUJ1aWxkZXJzT25BbGxMZXZlbHMiOmZhbHNlfSwicmVzdWx0
c09wdGlvbnMiOnsib3ZlcndyaXRlIjpmYWxzZX0sImRvTG9nIjoibm8iLCJrZWVw
VW5pcXVlIjoiTm8iLCJtb3JlT3B0aW9ucyI6ZmFsc2UsInJlc3VsdHNQcmVwZW5k
IjoiIiwicmVzdWx0c0FwcGVuZCI6IiIsInF1ZXJ5QnVpbGRlcnMiOltdLCJyZXN1
bHRzQnVpbGRlcnMiOltdLCJjb25maWdPdmVycmlkZXMiOltdLCJydW5UYXNrT25D
b21wbGV0ZSI6bnVsbCwidXNlUmVzdWx0c0ZpbGVBc1F1ZXJpZXNGaWxlIjpmYWxz
ZSwicnVuVGFza09uQ29tcGxldGVDb25maWciOiJkZWZhdWx0IiwidG9vbHNKUyI6
IiIsInF1ZXJpZXMiOiJodHRwOi8vYS1wYXJzZXIuY29tL2ZvcnVtL25ld3MvIn19
Примечание. В данной задаче ссылки на новости имеют вид thread/34567, поэтому при подстановке их на следующий уровень нужно добавить домен http://a-parser.com/. Поэтому используется цикл и добавляется каждая сссылка по отдельности. Если бы ссылки сразу были бы полными, то их можно было бы подставить так
Код:
tools.query.addAll(p1.threads, 'thread', 1)
т.е. без цикла, сразу все.

Переход на следующую страницу
Обычно для перехода по страницам используется функция Check next page. Но бывают случаи, когда воспользоваться данной функцией нет возможности, например, когда в контенте нету ссылки на следующую страницу, но есть некий токен, с помощью которого формируется ссылка. Тогда на помощь приходит $tools.query, которым мы можем сформировать нужную ссылку и подставить ее в запросы.
Данный способ используется в примере парсинга Instagram. Там результаты отдаются в JSON и на следующую страницу указывает некий код, который нужно подставить в ссылку.
Если не углубляться в алгоритм данного примера, то все довольно просто:
  • Получаем код для следующей страницы
  • Формируем ссылку и подставляем ее в запрос
N8GDa.png

Подстановка результатов в запросы
Оба предыдущих примера по сути тоже можно назвать "подстановкой результатов в запросы", но здесь мы рассмотрим имитацию работы функции Parse to level.
Тут все довольно просто: получили некий результат и подставили его обратно в запросы. Также в данном случае крайне желательно указывать уровень, до которого мы хотим делать подстановки и включить уникализацию запросов, чтобы не получить зацикленный парсинг.
Данный способ очень четко продемонстрирован в теме о Собственных парсерах подсказок. Там полученные подсказки подставляются в запросы с целью получения большего количества ключевых слов.
Pf2QG.png

P.S. При работе задания с $tools.query "на борту" можно наблюдать ситуацию, когда чем ближе процент выполненных запросов к сотне, тем медленнее он прибавляется. Это нормально, ведь запросы добавляются по мере работы задания, и их суммарное количество растет.
Автор
Support
Просмотры
19
Первый выпуск
Обновление

Рейтинги

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

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

Последние отзывы

респект
Назад
Верх