Перейти к основному содержимому

Представление и форматирование результатов

Доступные форматы для сохранения результатов

Для форматирования результатов в 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::GoogleSE::Google на скриншоте), $p2 - результаты от второго парсера (SE::BingSE::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

⏩ Видео. Именование файлов результатов

В этом видео приведем несколько примеров именования файла результата:

  1. Нумерация файла результата в соответствии с запросами.
  2. Нумерация файла результата + часть имени запроса.
  3. Именование файла результата по запросу, если запрос линк.

Просмотр доступных результатов

Каждый парсер имеет свой набор результатов, просмотреть список доступных результатов можно наведя на парсер указателем, в всплывающей подсказке будет отображен список простых результатов и массивов, со списком вложенных элементов:

Список доступных результатов во всплывающей подсказкеЖелтым отмечены результаты общие для всех парсеров:
  • $query - запрос переданный парсеру после форматирования
  • $query.orig - оригинальный запрос (в том виде как он был в файле или в поле ввода запросов)
  • $query.first - первый запрос при использовании опций вложенного парсинга (Parse all results или Parse to level)
  • $info.success - информация об успешности парсинга данного запроса
  • $info.retries - количество использованных попыток для данного запроса
  • $info.stats - статистика работы парсера для данного запроса
  • $pages.$i.data - массив с необработанными ответами от сервера для возможности самостоятельного извлечения дополнительной информации
Зеленым отмечены результаты доступные только для парсера SE::BingSE::Bing:
  • $totalcount - количество результатов выдачи
  • $ads с элементами $link, $anchor, $visiblelink, $snippet, $position и $page - массив со списком объявлений
  • $related.$i.key - массив со списком связанных ключевых слов
  • $serp с элементами $link, $anchor, $snippet, $cache - массив с основной выдачей поисковика
примечание

Обратите внимание что для массивов явно указывается переменная $i, означающая что элементов несколько и к ним можно обратиться по индексу (номеру позиции) или перебирать каждый элемент в цикле.

подсказка

Результат $pages.$i.data автоматически будет изменен на $data для тех парсеров, которые не "ходят по страницам" в рамках одного запроса. Например как DeepL::TranslatorDeepL::Translator.

Представление результатов

A-Parser создавался для парсинга информации любых видов, для этого было введено 2 типа результатов:

  • Простые результаты (Flat)
  • Массивы результатов (Array)

Рассмотрим каждый тип на примере парсера SE::GoogleSE::Google, скриншот выдачи:

Скриншот выдачи Google

Простые результаты

Простые результаты - когда одному запросу соответствует один результат, примеры:

  • Количество результатов по запросу ($totalcount)
  • Является ли запрос опечаткой ($misspell, на скриншоте не представлен)

Другие примеры:

  • Значение переведённого текста ($translated) в парсере DeepL::TranslatorDeepL::Translator
  • Количество ссылающихся доменов ($domains), значение траста ($trustflow), беклинков ($backlinks) и т.д. в парсере Rank::MajesticSEORank::MajesticSEO

Одиночные результаты сохраняются в обычных переменных (префикс $ + название на латинице)

Массивы результатов

Массивы результатов - когда одному запросу соответствует список результатов, каждый элемент списка в свою очередь может содержать несколько вложенных элементов. Разберем на примере выдачи Google - она представлена в парсере массивом $serp, для наглядности воспользуемся таблицей, запишем первые 5 результатов выдачи:

Ссылка ($link)Анкор ($anchor)Сниппет ($snippet)
http://www.speedtest.net/Speedtest.net by Ookla - The Global Broadband Speed TestTest your Internet connection bandwidth to locations around the world with this interactive broadband speed test from Ookla.
http://en.wikipedia.org/wiki/Test_cricketTest cricket - Wikipedia, the free encyclopediaTest 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 TestSaturday 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.aspPersonality test based on C. Jung and I. Briggs Myers type theoryHumanmetrics 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::GoogleSE::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 вывести ссылку и анкор через пробел, затем с новой строки вывести сниппет, после чего идет еще два переноса строки, в результате образующих пустую строку между результатами.

Использование шаблонизатора

Вывод переменных

Для использования шаблонизатора нужно вставить теги [% %], и внутри тегов ввести логику которую нужно выполнить.

Вывод CMS с использованием шаблонизатораРезультат вывода CMS с использованием шаблонизатора

Проход по массиву

Для вывода элементов массива нужно использовать конструкцию FOREACH:

[% FOREACH i IN p1.list;    
i.cms _ "\n";
END %]
подсказка

Больше информации и примеров по шаблонизатору в Особенности работы шаблонов в A-Parser.

Примеры

Вывод конкуренции

Вывод конкуренции по запросу (количества результатов по запросу) для всех парсеров поисковых систем (SE::GoogleSE::Google, SE::YandexSE::Yandex...).

Формат результата:

$query: $totalcount\n

Пример результата:

test: 3910000000
viagra: 278000000
окна пвх: 3220000
...

Вывод ссылок с выдачи поисковых систем.

Формат результата:

$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/
...

Парсинг подсказок

Вывод подсказок поисковых систем.

Формат результата:

$results.format('$suggest\n')

Пример результата:

тестовый сервер танки онлайн
тесты гиа по русскому языку
тесто для блинов рецепт
тестикула
тесто для пиццы на молоке

Вывод данных о запросе

В Net::HTTPNet::HTTP и парсерах на его основе дополнительно доступен вывод:

  • $proxy - прокси на котором выпонился запрос

  • $headers - заголовки ответа

  • $code - код ответа

  • $reason - статус ответа

Пример

Вывод значений переменных в JSON

Метод .json для обьектов

Вывод всех редиректов запроса

Для этой задачи доступна переменная $response, которая позволяет получать любые переменные запроса, включая все предыдущие редиректы.

Формат результата:

$response.Redirects.format('$URI\n--> ')$response.URI

Результат работы парсера:

Пример

Вывод в JSON с использованием шаблонизатора для записи даты

В примере показан вывод результатов парсера Net::WhoisNet::Whois в JSON-формате.

Пример

В результате будет домен который проверяли, дата на момент проверки и результат проверки. Как видно в Формате результата, дату получаем с помощью шаблонизатора Template Toolkit.

Формат результата:

{    
"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==

Проверка сайта на наличие в Гугл Новостях по кейворду

Пример проверки на наличие сайта в Гугл Новостях по кейворду

Формат результата:

[% 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::TagSocial::Instagram::Tag. Это значение можно представить в формате даты используя шаблонизатор Template-Toolkit.

Пример вывода timestamp значения в формате даты

Формат результата:

[% USE date;

query.orig _ ": total posts - " _ postscount _ "\nPosts:\n";

FOREACH i IN 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
...
Скачать пример

Как импортировать пример в А-Парсер

eJx1VNtuGjEQ/RXLCkoj0VVSqS9bpRKhoFJRNuXyxKLKxQa58dqO7aVBiH/vjPeW
pM0+7RzPzDlzsU80MP/g753wIniark/Uxn+a0oXZSqbSdKJ9YHvHijRdsj15T5ay
EAAVlgRDOAuCiCewlKB9apnzwmGm9RsJwImLHStVoP0TDUcrgMschHOSYwbJwd4Z
V7AASqIbPTBVotu6R1aLUeT8lOtcP5bCHRPj5J78JDlNQVBgiljjgwehOQU4GltT
6hB98lzfI5LCT05jlnE2Hw2GX4kkk1nljnDg5DYyJZWYdzIJUHifVCa5/Uwuezzp
FcmH697x8gpiCHwyUVI/RKpGAa/ENYSVVxBPraAIj2ZfSG9Dz5tNn1aF+3Fkgrov
7E1Sz6U9XLCDWBrslYydb2LAmrECu3WB6vG0qeAqCU+YgXEugzSaqYoBx9WxrrR8
jN3WBnyxxVL4sTMFQKi6Bo+NujW9iDaFFGWM/VHF0HTHlBd96kHqmIEQ/vpEBuFY
MC6zqAfwEzV6oNRUHITq3GL+u1IqDrs12EHQpA78v0v2T45zW95zKti6Pw40tFmi
dZd976K4mZo9VM5/Qd1KFjKA7Ye4T4BeA/gghG17NsOeFcaJlqbOXLPDTbNC44p3
IxvYDnpRxouxvAS3Ru/kPquvTeNZ6iVc50wPDV5HrEuXSsFYvJh36zHw9RjQ6AS+
Dh5GCiy9ua40GKP8t0Ul1ToJ6/cRBRbQyeesdcotU2o1nz4/wUAfjM30yLlX44uL
Qb01Drm2sLx7A2sFpZ037cvSPlWnt96X9HSGuf3291UAFonugEG3PAyFpjfnvwdy
t1Y=

Другие примеры

Примеры часто используемых шаблонов