Импорт данных из API и запись ответа в файл CSV - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь импортировать данные из API и затем экспортировать их в файл CSV. Однако это не работает, и я получаю следующую ошибку:

expected string or buffer. 

Я даже пытался использовать json.dumps вместо json.load, я получаю следующую ошибку:

<response 200 is not json serializable. 

Пример кода:

import requests
from requests.auth import HTTPBasicAuth
import pandas as pd
import json
import csv


proxies = {
    'http': 'http://dummy.restapiexample.com/api/v1/employees
    'https': 'http://dummy.restapiexample.com/api/v1/employees
}

url = 'http://dummy.restapiexample.com/api/v1/employees' 
r = s.get(url=url, proxies=proxies,  auth=HTTPBasicAuth('user', 'pass'))
employee_parsed = json.loads(r) 
emp_data = employee_parsed['Employee ID']
employ_data = open('"Path" testname.csv', 'w') 
csvwriter = csv.writer(employ_data)
count = 0

for emp in emp_data:
      if count == 0:
             header = emp.keys()
             csvwriter.writerow(header)
             count += 1

      csvwriter.writerow(emp.values())

employ_data.close()

У кого-нибудь есть идеи, как я могу решить возникающие ошибки? Любые советы будут оценены или любое понимание или где искать / думать. Спасибо!

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Есть несколько проблем с вашим примером кода.Я исправил код, чтобы прочитать API и доставить CSV в качестве вывода.

import requests as s
from requests.auth import HTTPBasicAuth
import pandas as pd
import json
import csv

proxies = {
    'http': 'http://dummy.restapiexample.com/api/v1/employees',
    'https': 'http://dummy.restapiexample.com/api/v1/employees'
}

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
url = 'http://dummy.restapiexample.com/api/v1/employees' #get key

r = s.get(url=url, headers=headers)

employee_parsed = r.json();
emp_data = employee_parsed;

employ_data = open('testname.csv', 'w', encoding="utf-8") 

csvwriter = csv.writer(employ_data)

count = 0

for emp in emp_data:

      if count == 0:

             header = emp.keys()

             csvwriter.writerow(header)

             count += 1

      csvwriter.writerow(emp.values())

employ_data.close()

Вы можете использовать response.json (), чтобы напрямую получить ответ json, как показано в моем примере.Если вы хотите проанализировать ответ с помощью json.loads, вам нужно проанализировать только содержимое ответа.Это можно сделать следующим образом:

employee_parsed = json.loads(r.content) 

Основная проблема заключалась в том, что используемый API не возвращал правильный ответ, если пользовательский агент не подделан Python.Это решается путем вставки поддельного заголовка.

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
url = 'http://dummy.restapiexample.com/api/v1/employees' #get key

r = s.get(url=url, headers=headers)

В моем примере я импортировал запросы как s, чтобы гарантировать выполнение кода.

1 голос
/ 08 июля 2019

Вы должны извлечь текст из вашего ответа employee_parsed = json.loads(r.text) или просто employee_parsed = r.json()

1 голос
/ 07 июля 2019

Измените это:

employee_parsed = json.loads(r)

на это:

employee_parsed = json.load(r)

Проверьте этот ответ, который говорит о разнице между json.loads и json.load.

Редактировать:

Что касается @roganjosh, вы можете использовать встроенный декодер JSON, что-то вроде:

r = s.get(url=url, proxies=proxies, auth=HTTPBasicAuth('user', 'pass')).json()

Ознакомьтесь с описанием здесь .

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