Avi
Avi

Reputation: 1845

API gives only the headers in Python but not the data

I am trying to access an API from this website. (https://www.eia.gov/opendata/qb.php?category=717234)

I am able to call the API but I am getting only headers. Not sure if I am doing correctly or any additions are needed.

Code:

import urllib
import requests
import urllib.request

locu_api = 'WebAPI'
def locu_search(query):
    api_key = locu_api
    url = 'https://api.eia.gov/category?api_key=' + api_key
    locality = query.replace(' ', '%20')
    response = urllib.request.urlopen(url).read()
    json_obj = str(response, 'utf-8')
    data = json.loads(json_obj)

When I try to print the results to see whats there in data:

data

I am getting only the headers in JSON output. Can any one help me figure out how to do extract the data instead of headers.

enter image description here

Upvotes: 0

Views: 361

Answers (2)

ipeternella
ipeternella

Reputation: 93

Avi!

Look, the data you posted seems to be an application/json response. I tried to reorganize your snippet a little bit so you could reuse it for other purposes later.

import requests

API_KEY = "insert_it_here"


def get_categories_data(api_key, category_id):
    """
    Makes a request to gov API and returns its JSON response
    as a python dict.
    """
    host = "https://api.eia.gov/"
    endpoint = "category"
    url = f"{host}/{endpoint}"

    qry_string_params = {"api_key": api_key, "category_id": category_id}

    response = requests.post(url, params=qry_string_params)

    return response.json()


print(get_categories_data(api_key=API_KEY, category_id="717234"))

As far as I can tell, the response contains some categories and their names. If that's not what you were expecting, maybe there's another endpoint that you should look for. I'm sure this snippet can help you if that's the case.

Side note: isn't your API key supposed to be private? Not sure if you should share that.

Update:

Thanks to Brad Solomon, I've changed the snippet to pass query string arguments to the requests.post function by using the params parameter which will take care of the URL encoding, if necessary.

Upvotes: 2

BoarGules
BoarGules

Reputation: 16941

You haven't presented all of the data. But what I see here is first a dict that associates category_id (a number) with a variable name. For example category_id 717252 is associated with variable name 'Import quantity'. Next I see a dict that associates category_id with a description, but you haven't presented the whole of that dict so 717252 does not appear. And after that I would expect to see a third dict, here entirely missing, associating a category_id with a value, something like {'category_id': 717252, 'value': 123.456}.

I think you are just unaccustomed to the way some APIs aggressively decompose their data into key/value pairs. Look more closely at the data. Can't help any further without being able to see the data for myself.

Upvotes: 0

Related Questions