Представление и форматирование результатов
Доступные форматы для сохранения результатов
Для форматирования результатов в 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
- количество результатов выдачи$ads
с элементами$link
,$anchor
,$visiblelink
,$snippet
,$position
и$page
- массив со списком объявлений$related.$i.key
- массив со списком связанных ключевых слов$serp
с элементами$link
,$anchor
,$snippet
,$cache
- массив с основной выдачей поисковика
Обратите внимание что для массивов явно указывается переменная $i
, означающая что элементов несколько и к ним можно обратиться по индексу (номеру позиции) или перебирать каждый элемент в цикле.
Результат $pages.$i.data
автоматически будет изменен на $data
для тех парсеров, которые не "ходят по страницам" в рамках одного запроса. Например как DeepL::Translator.
Представление результатов
A-Parser создавался для парсинга информации любых видов, для этого было введено 2 типа результатов:
- Простые результаты (Flat)
- Массивы результатов (Array)
Рассмотрим каждый тип на примере парсера SE::Google, скриншот выдачи:
Простые результаты
Простые результаты - когда одному запросу соответствует один результат, примеры:
- Количество результатов по запросу ($totalcount)
- Является ли запрос опечаткой ($misspell, на скриншоте не представлен)
Другие примеры:
- Значение переведённого текста ($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...).
Формат результата:
$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::HTTP и парсерах на его основе дополнительно доступен вывод:
$proxy
- прокси на котором выпонился запрос$headers
- заголовки ответа$code
- код ответа$reason
- статус ответа
Вывод значений переменных в JSON
Вывод всех редиректов запроса
Для этой задачи доступна переменная $response
, которая позволяет получать любые переменные запроса, включая все предыдущие редиректы.
Формат результата:
$response.Redirects.format('$URI\n--> ')$response.URI
Результат работы парсера:
Вывод в JSON с использованием шаблонизатора для записи даты
В примере показан вывод результатов парсера Net::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::Tag. Это значение можно представить в формате даты используя шаблонизатор Template-Toolkit.
Формат результата:
[% 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=