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

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

Примеры использования $tools.query

Метки:
  1. Support
    Еще в версии 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 %]
    А весь пресет будет выглядеть так:
    [​IMG]
    Код:
    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 и на следующую страницу указывает некий код, который нужно подставить в ссылку.
    Если не углубляться в алгоритм данного примера, то все довольно просто:
    • Получаем код для следующей страницы
    • Формируем ссылку и подставляем ее в запрос
    [​IMG]

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

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

Пoследние рецензии

  1. BESHENEI
    BESHENEI
    5/5,
    респект