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.
Теперь посмотрим как ответ сервера был обработан диггером.
А так он будет выглядеть в текстовом редакторе.
Gwenborough
-37.3159
81.1496
Kulas Light
Apt. 556
92998-3874
harness real-time e-markets
Multi-layered client-server neural-net
Romaguera-Crona
Sincere@april.biz
1
Leanne Graham
1-770-736-8031 x56442
Bret
hildegard.org
Wisokyburgh
-43.9509
-34.4618
Victor Plains
Suite 879
90566-7771
synergize scalable supply-chains
Proactive didactic contingency
Deckow-Crist
Shanna@melissa.tv
2
Ervin Howell
010-692-6593 x09125
Antonette
anastasia.net
...
...
...
...
...
...
...
...
...
Удалим команду 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"
}
На этом все, если у вас остались вопросы, пишите их в коментариях, я обязательно отвечу.