在您链接的页面上,实际上有一个关于如何获取数据的 Python 示例。它在 Python 2 中,但我将向您展示如何使其在 Python 3 中工作。
import urllib
import json # Used to load data into JSON format
from pprint import pprint # pretty-print
url = "https://data.sa.gov.au/data/api/3/action/datastore_search?resource_id=fec742c1-c846-4343-a9f1-91c729acd097&limit=5&q=title:jones"
response = urllib.request.urlopen(url)
print(response)
# Just an object: <http.client.HTTPResponse at 0x7f2618123e10>
我们使用以下read()方法获取文本数据:
text = response.read()
在这种情况下,响应是一个原始字符串。我们可以使用模块的json函数loads来加载一个字符串):
json_data = json.loads(text)
pprint(json_data)
返回以下 JSON 数据:
{'help': 'https://data.sa.gov.au/data/api/3/action/help_show?name=datastore_search',
'result': {'_links': {'next': '/api/3/action/datastore_search?q=title%3Ajones&offset=5&limit=5&resource_id=fec742c1-c846-4343-a9f1-91c729acd097',
'start': '/api/3/action/datastore_search?q=title%3Ajones&limit=5&resource_id=fec742c1-c846-4343-a9f1-91c729acd097'},
'fields': [{'id': '_id', 'type': 'int4'},
{'id': 'LGA Name', 'type': 'text'},
{'id': 'Tenure type', 'type': 'text'},
{'id': 'Very low income <$603 per wk', 'type': 'numeric'},
{'id': 'Low income $603-$964 per wk', 'type': 'numeric'},
{'id': 'Moderate income $965-$1446 per wk', 'type': 'numeric'},
{'id': 'Total', 'type': 'numeric'},
{'id': '_full_count', 'type': 'int8'},
{'id': 'rank', 'type': 'float4'}],
'limit': 5,
'q': 'title:jones',
'records': [],
'resource_id': 'fec742c1-c846-4343-a9f1-91c729acd097'},
'success': True}
我建议使用 Pandas,它可以非常轻松地为您完成很多繁琐的工作。它可以直接从 JSON 字符串中读取(我们text上面的)。问题是它会有点奇怪地解析它。
没有简单的方法可以直接将其写入 CSV 文件,因为存在嵌套结构:例如,在“结果”下有“字段”,然后是更多值,而 CSV 文件无法直接显示。你需要自己把结构弄平,也许决定什么是重要的,或者你想要什么可以省略。
您可以采用json_data上面格式化的 JSON 并手动解包,删除嵌套部分,这意味着查看响应并制作您自己的 Python 字典,只有单层,即没有嵌套。假设您这样做并有一个名为r. 完成后,您可以使用 Pandas 执行以下操作来编写 CSV 文件:
import pandas as pd
df = pd.read_json(r)
df.to_csv("output.csv")