Diggernaut позволяет легко и просто, работать с форматом JSON конвертируя его в XML. И сейчас я вам это продемонстрирую.
Для примера я нашел один из публичных JSON RestAPI.
Вот пример ответа сервера.
[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
},
...
...
...
...
]
Для начала создадим парсер (он же диггер), переведем его в режим отладки, и установим имя браузера как Firefox.
---
config:
debug: 2
agent: Firefox
Добавим блок do и запишем в него команду walk с адресом тестового RestAPI сервиса. Так же я покажу вам маленький трюк, который будет очень полезен в дальнейшем. Суть трюка в том что бы остановить выполнение в какой то нужный нам момент. Для этого добавим в блок do команду stop.
---
config:
debug: 2
agent: Firefox
do:
- walk:
to: http://jsonplaceholder.typicode.com/users
do:
- stop
Запустим парсер, и дождемся окончания его работы. Как и ожидалось, парсер закончил работу с ошибкой.
Перейдем в лог диггера и посмотрим почему это произошло.
Unsupported operator used: stop
Такая команда не поддерживается системой, это приводит к ошибке, и как следствие к прекращению работы диггера, так как диггер находится в дебаг режиме и количество ошибок не может быть больше 1.
Теперь посмотрим как ответ сервера был обработан диггером.
А так он будет выглядеть в текстовом редакторе.
<html>
<head></head>
<body>
<body_safe>
<element>
<address>
<city>Gwenborough</city>
<geo>
<lat>-37.3159</lat>
<lng>81.1496</lng>
</geo>
<street>Kulas Light</street>
<suite>Apt. 556</suite>
<zipcode>92998-3874</zipcode>
</address>
<company>
<bs>harness real-time e-markets</bs>
<catchphrase>Multi-layered client-server neural-net</catchphrase>
<name>Romaguera-Crona</name>
</company>
<email>Sincere@april.biz</email>
<id>1</id>
<name>Leanne Graham</name>
<phone>1-770-736-8031 x56442</phone>
<username>Bret</username>
<website>hildegard.org</website>
</element>
<element>
<address>
<city>Wisokyburgh</city>
<geo>
<lat>-43.9509</lat>
<lng>-34.4618</lng>
</geo>
<street>Victor Plains</street>
<suite>Suite 879</suite>
<zipcode>90566-7771</zipcode>
</address>
<company>
<bs>synergize scalable supply-chains</bs>
<catchphrase>Proactive didactic contingency</catchphrase>
<name>Deckow-Crist</name>
</company>
<email>Shanna@melissa.tv</email>
<id>2</id>
<name>Ervin Howell</name>
<phone>010-692-6593 x09125</phone>
<username>Antonette</username>
<website>anastasia.net</website>
</element>
...
...
...
...
...
...
...
...
...
</body_safe>
</body>
</html>
Удалим команду stop и зайдем в каждый тег element, что бы собрать с него данные. Все просто.
Сам процесс сбора данных не отличается от работы с HTML, поэтому я опишу его очень кратко — ввиде коментариев в коде.
Комментарии отмечены знаком #.
---
config:
debug: 2
agent: Firefox
do:
- walk:
to: http://jsonplaceholder.typicode.com/users
do:
#Создадим обьект для хранения всех наших данных
- object_new: APIService
#Перейдем в тег
- find:
path: element
do:
# Создадим обьект для хранения данных с каждой итерации по тегу
- object_new: user
# Собираем данные
# Мы не будем забирать все данные, а только их часть
- find:
path: id
do:
- parse
# Записываем поле id в обьект user(далее почти все операции сводятся к этому,в важных местах будут комментарии)
- object_field_set:
object: user
field: id
- find:
path: name
do:
- parse
- object_field_set:
object: user
field: name
- find:
path: username
do:
- parse
- object_field_set:
object: user
field: username
# Сделаем из адреса одну строку
- find:
path: address
do:
- find:
path: street
do:
- parse
- object_field_set:
object: user
field: address
- find:
path: suite
do:
- parse
- object_field_set:
object: user
field: address
joinby: ", "
- find:
path: city
do:
- parse
- object_field_set:
object: user
field: address
joinby: ", "
- find:
path: zipcode
do:
- parse
- object_field_set:
object: user
field: address
joinby: ", "
# Запишем обьект user в обьект APIService
- object_save:
name: user
to: APIService
# Запишем главный обьект
- object_save:
name: APIService
На этом построение конфига окончено, диггер можно перевести в активный режим и запустить.
По окончанию работы стоит выгрузить данные и проверить все ли у нас получилось.
Перейдем в раздел с данными и скачаем их в нужном нам формате. Допустим, в JSON.
В текстовом редакторе данные будут выглядеть вот так:
{
"data": [{
"user": [{
"username": "Bret",
"id": "1",
"name": "Leanne Graham",
"address": "Kulas Light, Apt. 556, Gwenborough, 92998-3874"
},
...
...
...
{
"username": "Moriah.Stanton",
"address": "Kattie Turnpike, Suite 198, Lebsackbury, 31428-2261",
"id": "10",
"name": "Clementina DuBuque"
}]
}],
"session": "session_595",
"digger": "digger_120"
}
На этом все, если у вас остались вопросы, пишите их в коментариях, я обязательно отвечу.