На этот раз мы подойдем к теме сбора данных с веб-сайтов с другой стороны, исследуя понятие веб-служб и возможности PowerShell для выполнения некоторых трудоемких задач извлечения информации.

В статье «Сбор данных из Интернета с помощью PowerShell и Invoke_WebRequest», опубликованной в предыдущем номере журнала, был предложен сценарий PowerShell для извлечения значений скорости и направления ветра, температуры воды, информации о приливах и отливах и вывода этих данных в виде небольшой таблицы. Конечно, можно было бы просто запустить браузер, зайти на несколько сайтов и найти нужные цифры, но наша цель состояла в том, чтобы заставить компьютер делать это автоматически. Задача была решена с помощью команды Invoke-WebRequest, загружавшей страницу с данными о температуре воды и скорости ветра, после чего путем несложных манипуляций с громоздким, но действенным регулярным выражением извлекались две цифры — температура по Фаренгейту. Этот путь, однако, показался слишком сложным. В итоге мы пришли к выводу, что необходимость такого «анализа экранных данных» обусловлена тем, что большинство веб-сайтов ориентированы на зрительное восприятие человеком, а не на опрос посредством сценария.

Веб-серфинг от компьютера к компьютеру

Поскольку наши потребности вышли за рамки простого анализа экранных данных, в отрасли были разработаны стандарты, упорядочивающие взаимодействие между компьютерами и веб-сервером и реализуемые в виде веб-служб. Помимо конкретных URL-адресов, по которым мы переходим из окна браузера, чтобы проверить состояние акций, посмотреть погоду, курс валюты и т. д., существуют и другие URL-адреса, позволяющие создавать хотя и неудобные для зрительного восприятия, но зато содержательные документы в формате XML, так что было бы ошибкой упустить возможность сбора данных с веб-страниц с помощью веб-служб.

Следует, однако, понимать, что для предмета поиска может и не существовать веб-службы. Возможно, бюджет владельца данного веб-ресурса не предусматривает построение удобных для чтения веб-страниц и соответствующих веб-служб.

SOAP или REST?

Каждая веб-служба реализует уникальную схему организации запросов, но обычно используются два варианта: простой протокол доступа к объектам Simple Object Access Protocol (SOAP) и передача репрезентативного состояния Representational State Transfer (REST). По сути, веб-служба — это реализация набора протоколов информационного обмена между компьютерами, подобно технологии Microsoft RPC. Однако веб-службы с самого начала ориентированы на независимость от платформы. К счастью, у первых конструкторов уже были службы TCP/IP, HTTP, DNS и т. д. Не было у них, однако, удобной конструкции, позволяющей компьютеру 1 послать компьютеру 2 запрос: «Могу ли я получить некие данные и в какой упаковке они будут доставлены?»

Самым первым ответом на этот вопрос стал стандарт упакованного в XML запроса-ответа, который получил название SOAP.

Минимальный запрос SOAP выглядит следующим образом:





EST


Запись выглядит громоздкой, но при внимательном рассмотрении видно, что данная воображаемая служба возвращает текущее время (запрашиваемый часовой пояс — EST, то есть североамериканское восточное время). Языку XML присущи иерархии, поэтому он способен манипулировать структурированными данными. Отвечает веб-служба также в стандарте SOAP. У большинства веб-служб на базе SOAP есть еще один файл XML, встроенный в язык описания веб-служб Web Service Description Language (WSDL). Этот файл содержит пояснение, как следует форматировать запросы и ответы SOAP для данной веб-службы. Поэтому мы проведем небольшое XML-исследование, что не должно вас пугать, так как существует команда New-WebServiceProxy, которая читает WSDL и несколько упрощает дело.

REST, который является альтернативой SOAP, позволяет запрашивать сервер с помощью простых URL-адресов. REST-версия рассмотренного выше примера запроса SOAP принимает вид простого URL-адреса:

http://timegetcurrentime.com/timezone/EST

Заметим, что этот запрос содержит запись timezone, а не gettimezone, поскольку REST глагольным формам предпочитает существительные. Результат, возвращаемый этой воображаемой веб-службой, может быть в формате XML, CSV либо в текстовом формате JavaScript Object Notation (JSON) — очередном формате представления иерархических структур данных.