Время прочтения: 3 мин.

Популярным способом взаимодействия между информационными системами через web является SOAP. SOAP – один из протоколов WEB API сервиса. Данный протокол подразумевает обмен структурированными XML сообщениями при помощи одного из протоколов передачи, например, SMTP, FTP, HTTP, HTTPS. Гарантией успешного обмена является осуществление корректного обмена (создания и передачи, а также получения и интерпретации ответа) XML запросами.

Для того, чтобы создать оптимальный процесс обмена XML запросами предлагаю использовать Python библиотека zeep.

#Импортируем необходимые библиотеки
from zeep import Client
from zeep import helpers

Рассмотрим получение новостей SOAP сервера ЦБ РФ с января по апрель 2021 года, будем использовать метод NewsInfo(FromDate, ToDate). В аргументах данного метода передадим даты и окончания периода за который мы хотим получить новости (тип аргументов — System.DateTime).   

Вынесем параметры метода NewsInfo, а также ссылку на SOAP сервер ЦБ РФ в переменные для удобства.

#параметры для применения метода NewsInfo
FromDate=datetime(2021, 1, 1)
ToDate=datetime(2021,4,1)
#ссылка с которой происходит выгрузка
url = 'http://www.cbr.ru/dailyinfowebserv/dailyinfo.asmx?WSDL'

Выполним запрос SOAP серверу ЦБ РФ с применением метода получения новостей.

#запрашиваем данные из SOAP сервиса 
client = Client(url)
result = client.service.NewsInfo(FromDate, ToDate)

В результате выполнения запроса мы имеем XML файл в формате System.Data.Dataset. Данный документ содержит таблицу News, в которой находят столбцы:

Doc_id — ID документа

DocDate — Дата документа

Title — Заголовок

Url — URL документа

Используя одну из функций библиотеки zeep, преобразуем XML-документ в словарь.

#преобразуем полученные данные в dict
data = helpers.serialize_object(result, dict)

Просмотр результата запроса свидетельствует о том, что формат данных соответствует формату json. Для выполнения дальнейшего комфортного анализа преобразуем результирующую таблицу в pandas dataframe.

#формируем датафрейм с данным
import json
import pandas as pd 
data = data.get('_value_1')
df = pd.DataFrame.from_dict(data)
#преобразование датафрема к датафрейму из столбца '_value_1', а в строках News
df = pd.DataFrame(df['_value_1']
                  .apply(pd.Series))
#преобразование датафрема к необходимому виду
df = pd.DataFrame(df['News']
                  .apply(pd.Series))

Мы получили желаемый результат.

Но при просмотре информации о датафрейме, мы можем заметить, что столбец DocDate имеет тип object. Дальнейшая работа с этими данными может требовать анализа дат, поэтому необходимо выполнить преобразование типа данных столбца.

Преобразуем данные столбца DocDate к дате формата “YYYY-mm-dd”:

#Создаем столбец Date, который является конвертацией столбца DocDate в тип datetime64
#параметр utc=True указываем, чтобы избежать ошибок
df['Date'] = pd.to_datetime(df['DocDate'], utc=True)
#Приводим дату в необходимый формат
df['Date'] = df['Date'].dt.strftime('%Y-%m-%d')

Таким образом, у нас есть датафрейм с точной информацией от первоисточника ЦБ РФ. Мы можем с уверенностью демонстрировать результаты анализа, не сомневаясь в достоверности данных.

Надеюсь, моя статья была для вас полезной. Буду рада вашим репостам и всегда готова ответить на ваши вопросы!