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

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

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

Для форматирования результатов в 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.* - все переменные относящиеся к запросу, описаны в статье Шаблоны в запросах
important

Важно! Данные переменные доступны только при сохранение каждого запроса в отдельный файл.

Формат имени файла результатов#

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
tip

Переменная $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::GoogleSE::Google:
  • $totalcount - количество результатов выдачи
  • $misspell - есть ли в запросе ошибка
  • $detected_geo - найденное гео
  • $ads с элементами $link, $anchor, $visiblelink, $snippet, $position и $page - массив со списком объявлений
  • $related.$i.key - массив со списком связанных ключевых слов
  • $rich.$i.name - массив с расширенными сниппетами
  • $serp с элементами $link, $anchor, $snippet, $amp - массив с основной выдачей поисковика
note

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

tip

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

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

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

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

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

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

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

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

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

  • Значение Alexa Rank($rank) в парсере Rank::AlexaRank::Alexa
  • Значение переведённого текста($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
%]
tip

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

Примеры#

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

Вывод конкуренции по запросу(количества результатов по запросу) для всех парсеров поисковых систем(SE::GoogleSE::Google, SE::YandexSE::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/
...

Парсинг подсказок [#parser-suggestions]#

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

Формат результата (Result format):

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

Результат:

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

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

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

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

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

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

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

пример вывода переменных

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

$results.json

Метод .json позволяет выводить данные в JSON формате: пример вывода значений переменных в JSON

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

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

Формат результата (Result format):

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

Результат: пример получения редиректов

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

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

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

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

Формат результата (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==

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

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

Последнее обновление