- 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 или
HTML::LinkExtractor. Первое задание парсит ссылки на все новости, а второе переходит по этим ссылкам, проверяет контент и при соответствии условию выводит результат. Благодаря $tools.query этот процесс можно сделать в одном задании. Алгоритм таков:
А весь пресет будет выглядеть так:
Примечание. В данной задаче ссылки на новости имеют вид thread/34567, поэтому при подстановке их на следующий уровень нужно добавить домен http://a-parser.com/. Поэтому используется цикл и добавляется каждая сссылка по отдельности. Если бы ссылки сразу были бы полными, то их можно было бы подставить так
т.е. без цикла, сразу все.
Переход на следующую страницу
Обычно для перехода по страницам используется функция Check next page. Но бывают случаи, когда воспользоваться данной функцией нет возможности, например, когда в контенте нету ссылки на следующую страницу, но есть некий токен, с помощью которого формируется ссылка. Тогда на помощь приходит $tools.query, которым мы можем сформировать нужную ссылку и подставить ее в запросы.
Данный способ используется в примере парсинга Instagram. Там результаты отдаются в JSON и на следующую страницу указывает некий код, который нужно подставить в ссылку.
Если не углубляться в алгоритм данного примера, то все довольно просто:
Подстановка результатов в запросы
Оба предыдущих примера по сути тоже можно назвать "подстановкой результатов в запросы", но здесь мы рассмотрим имитацию работы функции Parse to level.
Тут все довольно просто: получили некий результат и подставили его обратно в запросы. Также в данном случае крайне желательно указывать уровень, до которого мы хотим делать подстановки и включить уникализацию запросов, чтобы не получить зацикленный парсинг.
Данный способ очень четко продемонстрирован в теме о Собственных парсерах подсказок. Там полученные подсказки подставляются в запросы с целью получения большего количества ключевых слов.
P.S. При работе задания с $tools.query "на борту" можно наблюдать ситуацию, когда чем ближе процент выполненных запросов к сотне, тем медленнее он прибавляется. Это нормально, ведь запросы добавляются по мере работы задания, и их суммарное количество растет.
Ниже мы рассмотрим несколько примеров использования данного инструмента.
Объединение нескольких заданий в одно
Задача: спарсить из раздела новости http://a-parser.com/forum/news/ ссылки на все новости, в которых встречается слово "Google" 2 и более раз.
Решение. Обычно такие задачи решаются 2-мя заданиями с использованием
Net::HTTP или
HTML::LinkExtractor. Первое задание парсит ссылки на все новости, а второе переходит по этим ссылкам, проверяет контент и при соответствии условию выводит результат. Благодаря $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 %]
Код:
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 "на борту" можно наблюдать ситуацию, когда чем ближе процент выполненных запросов к сотне, тем медленнее он прибавляется. Это нормально, ведь запросы добавляются по мере работы задания, и их суммарное количество растет.