从API导入数据并将答案写入CSV文件

时间:2019-07-07 20:28:45

标签: python json pandas csv request

我正在尝试从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 个答案:

答案 0 :(得分:1)

更改此:

employee_parsed = json.loads(r)

对此:

employee_parsed = json.load(r)

查看this的答案,它讨论json.loadsjson.load之间的区别。

  

编辑:

     

根据@roganjosh,您可以使用内置的json解码器,例如:

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

查看说明here

答案 1 :(得分:1)

您的示例代码有多个问题。我已更正代码以读取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形式导入了请求,以确保代码得以执行。

答案 2 :(得分:1)

您应该从回复中提取文字 employee_parsed = json.loads(r.text) 或只是employee_parsed = r.json()