JSON-ответ от повторения нескольких URL для хранения DataFrame - PullRequest
2 голосов
/ 05 марта 2019

У меня есть динамический URL-адрес API, в котором каждый URL-адрес получает данные в виде JSON, как показано ниже.

{
   "@type":"connection",
   "id":"001ZOZ0B00000000006Z",
   "orgId":"001ZOZ",
   "name":"WWW3",
   "description":"Test connection2",
   "createTime":"2018-07-20T18:28:05.000Z",
   "updateTime":"2018-07-20T18:28:53.000Z",
   "createdBy":"xx.xx@xx.com.dev",
   "updatedBy":"xx.xx@xx.com.dev",
   "agentId":"001ZOZ08000000000007",
   "runtimeEnvironmentId":"001ZOZ25000000000007",
   "instanceName":"ShareConsumer",
   "shortDescription":"Test connection2",
   "type":"TOOLKIT",
   "port":0,
   "majorUpdateTime":"2018-07-20T18:28:05.000Z",
   "timeout":60,
   "connParams":{
      "WSDL URL":"https://xxxservices1.work.com/xxx/service/xxport2/n5/Integration%20System/API__Data?wsdl",
      "Must Understand":"true",
      "DOMAIN":"n5",
      "agentId":"001ZOZ0800XXX0007",
      "agentGroupId":"001ZOZ25000XXX0007",
      "AUTHENTICATION_TYPE":"Auto",
      "HTTP Password":"********",
      "Encrypt password":"false",
      "orgId":"001Z9Z",
      "PRIVATE_KEY_FILE":"",
      "KEY_FILE_TYPE":"PEM",
      "mode":"UPDATE",
      "CERTIFICATE_FILE_PASSWORD":null,
      "CERTIFICATE_FILE":null,
      "TRUST_CERTIFICATES_FILE":null,
      "Username":"xxx@xxx",
      "CERTIFICATE_FILE_TYPE":"PEM",
      "KEY_PASSWORD":null,
      "TIMEOUT":"60",
      "Endpoint URL":"https://wxxservices1.xx.com/xxx/service/xxport2/n5/Integration%20System/API__Data",
      "connectionTypes":"NOAUTH",
      "HTTP Username":"API@n5",
      "Password":"********"
   }
}

Теперь уловим, что у меня есть около 50 URL, которые предоставляют данные этого типа в формате JSON. Я повторяю его, используя следующий код, но я не могу сохранить в панде данных Python как каждый ответ от каждого URL. Это будет либо последний ответ, сохраненный только там.

Я также хотел бы преобразовать весь этот массив данных в CSV.

Каков наилучший способ добавить ответ каждого результата ответа URL-адреса в информационный кадр, а затем преобразовать в CSV?

Код Python следующим образом:

import requests
from urllib.request import Request, urlopen
from urllib.request import urlopen, URLError, HTTPError
import urllib.error
import json
import pandas as pd
from pandas.io.json import json_normalize
import os
import csv

#This CSV file where we are getting ID and iterating over it for each url for get JSON data for the each URL
ConnID_data_read=pd.read_csv('ConnID.csv', delimiter = ',')
df = pd.DataFrame(ConnID_data_read)



user_iics_loginURL='https://xx-us.xxx.com/ma/api/v2/user/login'

headers = {
        'Content-Type': "application/json",
        'Accept': "application/json",
        'cache-control': "no-cache"

        }


payload = "{\r\n\"@type\": \"login\",\r\n\"username\": \"xx@xx.com.xx\",\r\n\"password\": \"xxxx\"\r\n}"

response = requests.request("POST", user_iics_loginURL, data=payload, headers=headers)
resp_obj = json.loads(response.text)
session_id = resp_obj['SessionId']
server_URL = resp_obj['serverUrl']
print(session_id)
Finaldf = pd.DataFrame()
for index, row in df.iterrows():

    api_ver="/api/v2/connection/"+row['id']
    #https://xx-us.xxx.com/saas/api/v2/connection/001ZOZ0B000000000066
    conndetails_url = server_URL+api_ver
    print(conndetails_url)
    act_headers = {
    'icSessionId': session_id,
    'Content-Type': "application/json",
    'cache-control': "no-cache",

    }
    act_response = requests.get(conndetails_url.strip(),headers=act_headers)
    print(act_response.text)
    print("Creating Data Frame on this***********************")
    act_json_data= json.loads(act_response.text)
    flat_json = json_normalize(act_json_data)
    print(flat_json)
    Conndf = pd.DataFrame(flat_json)

    Finaldf.append(Conndf)
Finaldf.to_csv('NewTest.csv')

1 Ответ

1 голос
/ 05 марта 2019

Первое, что я заметил, это:

flat_json = json_normalize(act_json_data)
print(flat_json)
Conndf = pd.DataFrame(flat_json)

, когда вы делаете flat_json = json_normalize(act_json_data), flat_json уже является фреймом данных.Выполнение Conndf = pd.DataFrame(flat_json) является ненужным и избыточным, хотя не должно вызывать проблем, просто вам не нужен дополнительный код.

Во-вторых, вот в чем проблема.Когда вы добавляете фрейм данных, вам нужно установить его равным себе.Так что измените:

Finaldf.append(Conndf)

на

Finaldf = Finaldf.append(Conndf)

Я бы также просто перестроил индекс, так как это просто моя привычка, когда я добавляю кадры данных:

Finaldf = Finaldf.append(Conndf).reset_index(drop=True)

Кроме этой 1 строки, она выглядит нормально, и вы должны получить полный кадр данных, сохраненный в csv с Finaldf.to_csv('NewTest.csv')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...