Еще в версии 1.1.197 в А-Парсере появился очень интересный инструмент $tools.query, благодаря которому стало возможным делать более продуктивные пресеты. С его помощью можно объединять несколько заданий в одно, реализовывать переходы на следующую страницу и подставлять полученные результаты обратно в запросы в рамках одного задания (там, где Check next page и Parse to level не могут этого сделать или просто отсутствуют).
Ниже мы рассмотрим несколько примеров использования данного инструмента.
Объединение нескольких заданий в одно
Задача: спарсить из раздела новости http://a-parser.com/forum/news/ ссылки на все новости, в которых встречается слово "Google" 2 и более раз.
Решение. Обычно такие задачи решаются 2-мя заданиями с использованием Net::HTTP или HTML::LinkExtractor. Первое задание парсит ссылки на все новости, а второе переходит по этим ссылкам, проверяет контент и при соответствии условию выводит результат. Благодаря $tools.query этот процесс можно сделать в одном задании. Алгоритм таков:
При подстановке запросов с помощью $tools.query они всегда подставляются на следующий уровень. Т.е. подставленные запросы будут обработаны на следующем уровне, но в рамках текущего запроса. Отсчет уровней начинается с 0. Текущий уровень всегда хранится в переменной $query.lvl. Уровень удобно использовать как ориентир для требуемых действий. В данном задании при $query.lvl = 0 парсер подставит полученные результаты в запросы, а при $query.lvl = 1 проверит и выведет результат. Инструмент $tools.query нужно использовать в Общем формате результата. Таким образом шаблон формата результата будет выглядеть так:
- Используем Net::HTTP
- Парсим ссылки на новости, пользуясь Check next page для переходов на следующие страницы
- С помощью $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 %]
Примечание. В данной задаче ссылки на новости имеют вид thread/34567, поэтому при подстановке их на следующий уровень нужно добавить домен http://a-parser.com/. Поэтому используется цикл и добавляется каждая сссылка по отдельности. Если бы ссылки сразу были бы полными, то их можно было бы подставить такКод: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
т.е. без цикла, сразу все.Код:tools.query.addAll(p1.threads, 'thread', 1)
Переход на следующую страницу
Обычно для перехода по страницам используется функция Check next page. Но бывают случаи, когда воспользоваться данной функцией нет возможности, например, когда в контенте нету ссылки на следующую страницу, но есть некий токен, с помощью которого формируется ссылка. Тогда на помощь приходит $tools.query, которым мы можем сформировать нужную ссылку и подставить ее в запросы.
Данный способ используется в примере парсинга Instagram. Там результаты отдаются в JSON и на следующую страницу указывает некий код, который нужно подставить в ссылку.
Если не углубляться в алгоритм данного примера, то все довольно просто:
- Получаем код для следующей страницы
- Формируем ссылку и подставляем ее в запрос
Подстановка результатов в запросы
Оба предыдущих примера по сути тоже можно назвать "подстановкой результатов в запросы", но здесь мы рассмотрим имитацию работы функции Parse to level.
Тут все довольно просто: получили некий результат и подставили его обратно в запросы. Также в данном случае крайне желательно указывать уровень, до которого мы хотим делать подстановки и включить уникализацию запросов, чтобы не получить зацикленный парсинг.
Данный способ очень четко продемонстрирован в теме о Собственных парсерах подсказок. Там полученные подсказки подставляются в запросы с целью получения большего количества ключевых слов.
P.S. При работе задания с $tools.query "на борту" можно наблюдать ситуацию, когда чем ближе процент выполненных запросов к сотне, тем медленнее он прибавляется. Это нормально, ведь запросы добавляются по мере работы задания, и их суммарное количество растет.
-
Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!Скрыть объявление
Обзор инструмента $tools.query
Примеры использования $tools.query
Метки: