Представление и форматирование результатов
Доступные форматы для сохранения результатов
Для форматирования результатов в A-Parser'е применяется Шаблонизатор Template Toolkit, что позволяет легко сохранять результаты парсинга в различных форматах:
- В текстовых файлах списком: по одному результату на строку, через разделитель, в произвольном формате
- В файлах
CSV
с возможностью дальнейшего импорта вExcel, Google Docs
и т.п. - В
XML
,JSON
и других форматах хранения данных - В
HTML
"на лету" генерируя страницы - В формате
SQL
дампов для прямого импорта в базу данных или напрямую записывая в БДSQLite
- В бинарном формате для сохранения изображений(
jpg, png, gif,
...), документов(pdf, docx,
...), исполняемых файлов и архивов(exe, dmg, zip,
...) и любых других типов данных
Редактирование формата результата
Формат результата - позволяет форматировать результаты к нужному виду используя шаблоны, применяется для каждой комбинации запрос-результаты.
- Общий формат результата задается в поле
Формат результата
- Формат результата для каждого парсера отдельно можно задать в настройках парсера в
Result format
A-Parser поддерживает работу с несколькими парсерами в одном задании, в общем формате результатов необходимо указывать от какого парсера выводить результат:
$p1
- результаты от первого парсера(SE::Google на скриншоте),
$p2
- результаты от второго парсера(SE::Bing на скриншоте)
- Порядковый номер парсера отображается слева от поля выбора парсера
$p1.preset
и$p2.preset
подразумевает что необходимо взять значение формата результата из настроек соответствующих парсеров- В данном примере
$p1.preset
можно заменить на$p1.serp.format('$link\n')
что будет иметь одинаковый эффект, при этом формат результата из настроек уже использоваться не будет
Формат результата можно указывать в удобном многострочном редакторе кликнув по соответствующей иконке в поле редактирования:
В общем формате результатов доступны следующие переменные:
$query
- запрос после форматирования$query.*
- все переменные относящиеся к запросу, описаны в статье Шаблоны в запросах$p1, $p2, ...
- переменные для доступа к результатам парсинга для каждого парсера отдельно(Просмотр возможных результатов для каждого парсера)$p1.query, $p2.query, ...
- запросы после форматирования с учетом формата запроса указанного в настройках каждого парсера
Начальный и конечный текст
Для каждого файла результатов указывается отдельный Начальный/Конечный текст:
- Для формирования шапки CSV файла
- Для начальных и конечных тегов XML файла
- Для хедера, шапки и футера HTML файлов
- Для любых других вариантов применения
Чтобы активировать данную возможность необходимо кликнуть по кнопке в нижней части Редактора заданий
В начальном и конечном тексте поддерживается использование шаблонизатора Template Toolkit, доступные переменные:
$query
- запрос после форматирования$query.*
- все переменные относящиеся к запросу, описаны в статье Шаблоны в запросах
Важно! Данные переменные доступны только при сохранение каждого запроса в отдельный файл или при использовании этих же переменных в Формате имени файла результата.
Формат имени файла результатов
A-Parser позволяет использовать шаблоны также в именах результирующих файлов, что позволяет автоматически создавать файлы и папки на основе текущей даты, по порядковому номеру запроса, по самому запросу и в любом другом формате.
В поле Имя файла поддерживаются следующие переменные:
- Все переменные доступные для Общего формата результата
$queriesfile
- путь и имя файла с запросами, если запросы указаны через форму то будет содержать queries_from_text.txt$datefile
- объект плагина date шаблонизатора Template Toolkit, настроенный на формат даты%b-%d_%H-%M-%S
, при форматировании выдаёт текущее время и дату в виде May-08_20-08-38, формат возможно изменить в Дополнительных настройках
По умолчанию имя файла создаётся по дате и времени на момент старта задания
Комплексный пример
reports/$queriesfile/${query}.txt
- Будет создана папка reports
- Будет создана подпапка с именем файла запросов
- В подпапке будет создано столько файлов сколько запросов используется в задании, в качестве имени файла будет использоваться сам запрос с расширением .txt
Переменная $query записана в формате ${query} для того чтобы предотвратить интерполяцию расширения .txt как части переменной, подробнее в документации по шаблонизатору Template Toolkit
⏩ Видео. Именование файлов результатов
В этом видео приведем несколько примеров именования файла результата:
- Нумерация файла результата в соответствии с запросами.
- Нумерация файла результата + часть имени запроса.
- Именование файла результата по запросу, если запрос линк.
Просмотр доступных результатов
Каждый парсер имеет свой набор результатов, просмотреть список доступных результатов можно наведя на парсер указателем, в всплывающей подсказке будет отображен список простых результатов и массивов, со списком вложенных элементов:
- $query - запрос переданный парсеру после форматирования
- $query.orig - оригинальный запрос(в том виде как он был в файле или в поле ввода запросов)
- $query.first - первый запрос при использовании опций вложенного парсинга(Parse all results или Parse to level)
- $info.success - информация об успешности парсинга данного запроса
- $info.retries - количество использованных попыток для данного запроса
- $info.stats - статистика работы парсера для данного запроса
- $pages.$i.data - массив с необработанными ответами от сервера для возможности самостоятельного извлечения дополнительной информации

- $totalcount - количество результатов выдачи
- $misspell - есть ли в запросе ошибка
- $detected_geo - найденное гео
- $ads с элементами $link, $anchor, $visiblelink, $snippet, $position и $page - массив со списком объявлений
- $related.$i.key - массив со списком связанных ключевых слов
- $rich.$i.name - массив с расширенными сниппетами
- $serp с элементами $link, $anchor, $snippet, $amp - массив с основной выдачей поисковика
Обратите внимание что для массивов явно указывается переменная $i, означающая что элементов несколько и к ним можно обратиться по индексу(номеру позиции) или перебирать каждый элемент в цикле.
Результат $pages.$i.data автоматически будет изменен на $data для тех парсеров которые не "ходят по страницам" в размках одного запроса. Например как DeepL::Translator.
Представление результатов
A-Parser создавался для парсинга информации любых видов, для этого было введено 2 типа результатов:
- Простые результаты(Flat)
- Массивы результатов(Array)
Рассмотрим каждый тип на примере парсера SE::Google, скриншот выдачи:
Простые результаты
Простые результаты - когда одному запросу соответствует один результат, примеры:
- Количество результатов по запросу ($totalcount)
- Является ли запрос опечаткой($misspell, на скриншоте не представлен)
Другие примеры:
- Значение Alexa Rank($rank) в парсере
Rank::Alexa
- Значение переведённого текста($translated) в парсере
DeepL::Translator
- Количество ссылающихся доменов($domains), значение траста($trustflow), беклинков($backlinks) и т.д. в парсере
Rank::MajesticSEO
Одиночные результаты сохраняются в обычных переменных(префикс $
+ название на латинице)
Массивы результатов
Массивы результатов - когда одному запросу соответствует список результатов, каждый элемент списка в свою очередь может содержать несколько вложенных элементов. Разберем на примере выдачи Google - она представлена в парсере массивом $serp, для наглядности воспользуемся таблицей, запишем первые 5 результатов выдачи:
Ссылка($link) | Анкор($anchor) | Сниппет($snippet) |
---|---|---|
http://www.speedtest.net/ | Speedtest.net by Ookla - The Global Broadband Speed Test | Test your Internet connection bandwidth to locations around the world with this interactive broadband speed test from Ookla. |
http://en.wikipedia.org/wiki/Test_cricket | Test cricket - Wikipedia, the free encyclopedia | Test cricket is the longest form of the sport of cricket. Test matches are played between national representative teams with "Test status", as determined by the ... |
http://www.speakeasy.net/speedtest/ | Speakeasy Speed Test | Saturday 03-May 2014, 11:04:29 AM Your IP: The Speakeasy Speed Test requires Flash v7 or higher. Please update your browser. See Pricing Or Call Today |
http://www.humanmetrics.com/cgi-win/jtypes2.asp | Personality test based on C. Jung and I. Briggs Myers type theory | Humanmetrics Jung Typology Test™ instrument uses methodology, questionnaire, scoring and software that are proprietary to Humanmetrics, and shall not be ... |
http://test-ipv6.com/ | Test your IPv6. | This will test your browser and connection for IPv6 readiness, as well as show you your current IPV4 and IPv6 address. ... Test your IPv6 connectivity. JavaScript ... |
Каждая позиция выдачи записывается в массив с 3мя вложенными элементами - ссылка($link), анкор($anchor), сниппет($snippet)
Другой пример - список связанных ключевых слов, который сохраняется в массиве $related:
Кейворд($key) |
---|
test wwe |
depression test |
test my speed |
wonderlic test |
test personality |
act test |
jiggle test |
bipolar test |
Как видно в данном массиве всего один вложенный элемент - кейворд($key)
Нумерация элементов массивов начинается с 0, пример доступа к отдельным элементам массива:
- $serp.0.link - первая ссылка из выдачи
- $serp.3.anchor - четвертый анкор из выдачи
- $related.0.key - первый связанный кейворд
Более подробно про форматирование простых результатов и массивов будет описано ниже
Принципы форматирования
После того как парсер собрал данные в простых результатах и массивах, их необходимо отобразить(сохранить в файл) в нужном формате. Для удобства и функциональности в A-Parser'е используется Шаблонизатор Template Toolkit. Разберем часто используемые конструкции, для этого воспользуемся инструментом Тестирование шаблонов. Выберем проект для парсера SE::Google:
На скриншоте представлены 3 поля:
- JSON - внутреннее представление данных в парсере
- Шаблон - шаблон, по которому происходит форматирование результата
- Результат - непосредственно преобразованные данные по указанному шаблону, именно в таком виде результат будет записан в файл
Изменяя шаблон мы можем менять вид результата, рассмотрим следующий шаблон:
Текст в поле Шаблон:
Отчет по запросу: $query
Конкуренция: $totalcount
Список ссылок, анкоров и сниппетов:
$serp.format('$link $anchor\n$snippet\n\n')
Выделим основные правила:
- Обычный текст выводится в результат как есть, без изменений
- Для вывода простых результатов необходимо в нужном месте вывести переменную содержащую нужный результат с префиксом
$
- Для форматирования массивов используется метод
format
, о нем немного ниже \n
отвечает за перенос строки
Форматирование массивов
Форматирование массивов, разберем конструкцию:
$serp.format('$link $anchor\n$snippet\n\n')
Данная запись означает что для массива $serp
необходимо вызвать метод format
с параметром '$link $anchor\n$snippet\n\n'
. Метод format
соединяет в строку все элементы массива по шаблону, указанному в параметре, сам шаблон означает: для каждого элемента массива $serp
вывести ссылку и анкор через пробел, затем с новой строки вывести сниппет, после чего идет еще два переноса строки, в результате образующих пустую строку между результатами.
Использование шаблонизатора
Вывод переменных
Для использования шаблонизатора нужно вставить теги [% %]
, и внутри тегов ввести логику которую нужно выполнить.
Проход по массиву
Для вывода элементов массива нужно использовать конструкцию FOREACH
:
[%
FOREACH i IN p1.list;
i.cms _ "\n";
END
%]
Больше информации и примеров по шаблонизатору в Особенности работы шаблонов в A-Parser.
Примеры
Вывод конкуренции
Вывод конкуренции по запросу(количества результатов по запросу) для всех парсеров поисковых систем(SE::Google,
SE::Yandex...).
Формат результата (Result format):
$query: $totalcount\n
Результат:
test: 3910000000
viagra: 278000000
окна пвх: 3220000
...
Парсинг ссылок
Вывод ссылок с выдачи поисковых систем.
Формат результата (Result format):
$serp.format('$link\n')
Результат:
http://www.speedtest.net/
http://www.speakeasy.net/speedtest/
http://en.wikipedia.org/wiki/Test_cricket
http://www.humanmetrics.com/cgi-win/jtypes2.asp
http://html5test.com/
http://test-ipv6.com/
...
Парсинг подсказок
Вывод подсказок поисковых систем.
Формат результата (Result format):
$results.format('$suggest\n')
Результат:
тестовый сервер танки онлайн
тесты гиа по русскому языку
тесто для блинов рецепт
тестикула
тесто для пиццы на молоке
Вывод данных о запросе
В Net::HTTP и парсерах на его основе дополнительно доступен вывод:
$proxy
- прокси на котором выпонился запрос$headers
- заголовки ответа$code
- код ответа$reason
- статус ответа
Вывод значений переменных в JSON
$results.json
Метод .json
позволяет выводить данные в JSON формате:
Вывод всех редиректов запроса
Для этой задачи доступна переменная $response
, которая позволяет получать любые переменные запроса, включая все предыдущие редиректы.
Формат результата (Result format):
$response.Redirects.format('$URI\n--> ')$response.URI
Результат:
Вывод в JSON с использованием шаблонизатора для записи даты
В примере показан вывод результатов парсера Net::Whois в JSON формате.
В результате будет домен который проверяли, дата на момент проверки и результат проверки. Как видно в Формате результата, дату получаем с помощью шаблонизатора Template-Toolkit.
Формат результата (Result format):
{
"domain": "$query",
"date": "[% USE d = date(format = '%d.%m.20%y', locale = 'C');d.format() %]",
"expire": "$p1.expire_date",
},
Пример результата:
[{
"domain": "a-parser.com",
"date": "05.05.2021",
"expire": "25.02.2022",
},
]
Скачать пример
Как импортировать пример в А-Парсер
eJxtVG1v2jAQ/ivWCUQrZaxM2pdM+0BRkTYx6ErRPgQ0efWFeXXszHYYVZT/3nMS
EtruQyTf23P33EtK8Nw9uluLDr2DOCkhr98QwxJ9HP/4baRj79jNkWe5QjaBCHJu
HdrgnZw5kUFgygvlYbeLgFDo6ebGZjyglVvNGNuCMBmXegsxvQd/C7RPW4hONu6x
sSRDtlnfMME+s6C8SGsYkkZDMR5m4w9Xw6dRxJR54FQUqWejy09i3LhdXLLhrkfF
Yy5tizvIJ+NG/tkkI6eKPugKXvMD3hsqOJUKe/WcpCXPkAyDEBmsXbqxP3py5UJI
L43mqmEdOtR3YqMl0aV4bcg3MJfo5tZkfa66HaeOJW17gCCKOvZ7EwNxypXDCByV
OucUKl5bpEfLvbGrPNRD+hKMniq1wAOq3q3Gvy6kEjTOaUpBX9rA/7us3mBUHb3z
VAe0/yzVALG3BYHUwvXqWx8kzMLsibj4RbSVzKQn2c1MocOuXJHyETHvWrYMLcuM
xS5LA9zmpvXNUQtyTPqJTfNWV1Y7eEXkxWBeKh+MTuV+RRSsFHjyLPQ93clKz0y4
gsBMF0rRYBze9Qsyde0ggtC18E3wrE4R2Lf3EoE3Rrmva9KF+7KSFvBjKDCjXp5n
bSFp69XmbnFugbOlqrMnJ/F9c3Ku3tLAkNZ3b2ixiFq16865+weU50cdlxWN64+7
bZwCdK2MgDrkaBYQT6pnHsF5pA==
Проверка сайта на наличие в Гугл Новостях по кейворду
Формат результата (Result format):
[%
linksToOneString = p1.serp.format('$link. ');
matches = linksToOneString.match('.+?(' _ p1.query.domain _ ').+?');
IF matches.0;
p1.query.orig _';yes' _ "\n";
ELSE;
p1.query.orig _';no' _ "\n";
END
%]
Пример результата:
парсер гугл|a-parser.com;no
парсер гугл|forbes.ru;yes
Скачать пример
Как импортировать пример в А-Парсер
eJylVVFv2jAQ/iuR1YpWo1EQ7UuqaaIMpk6stKV9AoRccqQeju3aCQVR/vvOTkjS
ruNlEoq4u+++O9+dz1uSUrM0txoMpIaE4y1R7j8JyagXhj+kjDl4Z173GeZLL5IJ
ZcLDX2EQ8Go8WNNEcSBNoqg2oC3PuOaOhggWNOMpaW5JulGA7HIFWrPIGlmEsqIx
zGUmEENWlGeIae3+DccwqkIS8WrIATRnYmkUumCQGn9wwCXmNfr7x0Psz3Wozg4m
omtQTkU8O4xXWq43GlLNwNQ8W0EQkN102iTYLKyr6UudUNu08fFEuNM+yKGAETqK
2PvqqZZvK+YvHO6kcWQxvtc4vZwIVMyfwSDqo6PvTCcN/8u3k4Y3sywvGeiNX8zB
DAnQ5lg+CTvzJmSCFuLM132viOQHqCi5pGYIbVxuwDTeufQGo95nQCE/4G6+T8Tx
lJTFGNEVPEgsxoK54dvXCKUbmtj6HUU0BWvdF+TUT9d28mgUsZRJQXleUTvKVZUf
BXvJx00i1maFbelrmaAqBUfgUt13Y0yOnEyQInO+d7kPCReUG2gSg6n2KSYSlZZU
Z2hgKWiaSj1UNh1Ub4kUHc4HsAJe+Tv6q4zxCK9dZ4FO14Xj55DhXxy78nT1UDiG
rxpzKFmcdDX8VXlFciBjPHj0hMfmLGEpyqbrrnBIAlQuAVRZshtbskRqKMMUzEV0
XEEKhJ35qmMdVaneHcMtKiMzPbfUeY2b+ztk3PSNFGe2IQZwKeUFIW8WJG1f9i75
IJPprmpyLQYq51IsWDwsruV+HDLxgGtzKLrSLj5bJpFxjk02cF8NW8cUTbVCdd6P
zl0XwlZyvyQxScnNz1F+cqUZ5nxhE0ywMfWoBeWccv54P6hbSDWgKEyy4Ly9cN/A
fs/zb8tpLnKN54S2E9rV//bTGz3L97o/lwneuf/iwvv2hBsAt55NO4VYYh9sN939
CUkvf0vssoO1oiKCKL8SO9ej4oEp36tt/ZkJtzucy9/mNgfZqlsI6rB9BofOPil/
AGn6WSM=
Вывод timestamp значения в формате даты
Иногда бывает что в результатах нет обычной даты, но есть timestamp значение как в парсере Social::Instagram::Tag. Это значение можно представить в формате даты используя шаблонизатор Template-Toolkit.
Формат результата (Result format):
[%
USE date;
p1.query.orig _ ": total posts - " _ p1.postscount _ "\nPosts:\n";
FOREACH i IN p1.posts;
d = date.format(i.time, format => '%d.%m.20%y');
i.link _ " - " _ d _ ":\n";
i.text _ "\n";
END
%]
Пример результата:
sport: total posts - 96500663
Posts:
https://www.instagram.com/p/COfJHshAkeD/ - 05.05.2021:
Quelques exemples de notre nouvelle campagne de communication personnalisable avec le nom des clubs 😀
Vous préférez quel visuel : 1, 2, 3, 4, 5 ? 🤔
#clubnormand #tennis #padel #beachtennis #tenniscourt #padelcourt #beachtenniscourt #lnt #LigueNormandieTennis #🎾 #sport #normandie #normandietourisme
https://www.instagram.com/p/COfJG7olavg/ - 05.05.2021:
💥 Sau màn lật đổ “Bà già” thành công, Nửa xanh thành Milan chính thức vượt qua Nửa đỏ về số lần lên đỉnh nước Ý nhiều nhất lịch sử.
-----------------------------
➖ Website: https://webthethao247.com/
➖ https://g.page/webthethao247?share
#wtt247 #webthethao247 #thethao #sport #bongda #SerieA #InterMilan #Juventus #ACMilan
https://www.instagram.com/p/COfJG1Hg7ax/ - 05.05.2021:
Which Skill was better 1 or 2? 🤔👇
Follow @ftb4ll for more 💥
Follow @ftb4ll for more 💥
Follow @ftb4ll for more 💥
________________________________________
Leave a Like 👍🏽
Subscribe for more 🔔
Leave your thoughts in the Comments 💬
________________________________________
❌Ignore the Tags ❌
#football #soccer #fussball #futbol #fifa #championsleague #bundesliga #ucl #footballmemes #goal #transfer #sports #penalty #ultimateteam #pacybits #fut #ultras #laliga #freekick #referee #sport #calcio #messi #ronaldo #skills #premierleague #foul #footballseason
https://www.instagram.com/p/COfIlXqhfAa/ - 05.05.2021:
Be Fuckin’ Ready 🤣🤣🤣
Get ready to fly!!!! 🏐🏐🏐🏐
Follow - @crackonkings
#beachball #nalin&kane #trance #music #90s #onyerhead #festival #party #afterparty #love #summer #uk #happy #sesh #crackon #football #sport #festivaloutfit #festivalfashion #sun #dj #dancing #club #festivalgirl #house #techno #rave
...
Скачать пример
Как импортировать пример в А-Парсер
eJx1VNuO2jAQ/RXLAm1XotFupb6k2kosBZWKAuXyRFDlYoNcHDtrOxSE+PfOODfY
dvOUOZ6Zc+Zin6lnbu+mVjjhHY1XZ5qFfxrTudlIpuJ4qJ1nO8vSOF6wHXlPFjIV
AKUZ8YZw5gURR7CUoB2aMeuExUyrNxKAExdblitPO2fqT5kALnMQ1kqOGSQHe2ts
yjwoCW70wFSObqt2opfzfiD9lOhEZ4/RSy7sKTJW7shPktAYRHmmSGacdyA2oQCD
W7A3Jtc+uCWJniISw09CQ67BZNbv9r4SSYbjOgJPPCdPgTIqZL2TkYcWdEhhkqfP
5K7No3YafXhon+7uIYbAJyMl9T6wVTp4IbHiLLy8ONaaAtwff0l0e00v63WHFj1w
g0AFLWihsmJE9eGcHcTCYNtkGEIVA9aYpdi4FsrH06qE+8gfMQPjXHppNFMFA06u
YV1q+RIarw34YqelcANrUoBQdgmeKnUr2go2hRR5iP1RxNB4y5QTHepA6oCBEP76
RHphmTd2kqEewM/U6K5SI3EQqnEL+Z9zqTisWXcLQcMy8P8uk39yXOryrqlgAf9Y
0FBnCdbz5HsTxc3I7KBy/gvqVjKVHmzXw50C9AHAvRBZ3bMx9iw1VtQ0ZeaSHS5d
JjRuezOybtZAN2XcjOUW3Bi9lbtJeYMqz1wv4GZPdM/gzcS6dK4UjMWJWbMeXVeO
AY1G4OvgXqDA0qubS70xyn2bF1IzK2H9PqLAFDp5zVqm3DCllrPR9QltVgoMlxmL
eTewqDsDKwRlXNb1g1K/UOe3npX4fIEZ/XbTIgALQnfAoDMOBkDjx8tfNDez1Q==