调用API时在JSON中添加键值

时间:2018-07-16 11:38:34

标签: python json api dictionary

我正在调用API以获取属性列表。我在“列表”文件(https://api.nestoria.es/show_example?name=search_listings_es&syntax=1)中获取了json。

我正在使用邮政编码来查找每个属性,并且需要在每个属性中添加其邮政编码。最后,我将json转换为csv。我不知道如何将邮政编码添加到每个属性中(因此我需要为API调用的每个结果添加一个新的键值)...

谢谢!!!!!!!!!

这是代码:

from requests import get
import json
import pandas as pd
import time
import datetime
import csv

def get_nestoria(type):
#call the api
    api = 'http://api.nestoria.es/api?action=search_listings'
    place = '&place_name=' + area_name
    listing_type = '&listing_type=' + type
    json_es = '&encoding=json&pretty=1&country=es'
    page = '&page='

    api_input = api + place + listing_type + json_es
    response = get(api_input)

# Check if the API has worked
    if response.status_code == 200:
        print("API called successfully")
    elif response.status_code == 400:
        print("Wrong request for" + area_name + ". Chechk this area is searchable")
    elif response.status_code == 403:
        print("Forbidden API call. Maximum number of calls reached.")
else:
    print("Wrong code", response.status_code)

    content_as_string = response.content.decode()
    # Decode JSON
    content = json.loads(content_as_string)
    content_response = content['response']

    # Number of total web pages neded for the area
    web_pages = content_response['total_pages']
    print('Number of pages in that area: ', web_pages)

    print("Numer of total properties " + area_name, content_response['total_results'])

    #2nd call to the API
    homes = pd.DataFrame()
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.0; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0'}
    for i in range(1, web_pages+1):
        api_input = api + place + listing_type + json_es + page + str(i)
        response = get(api_input, headers=headers)
        content_as_string = response.content.decode()
        content = json.loads(content_as_string)
        content_response = content['response']

        listings = content_response['listings']

        listings = pd.DataFrame(listings)

        if i==1:
            homes = listings
        else:
            homes = homes.append(listings, sort=True)
        time.sleep(3)     

    if homes.empty:
        homes = homes
    else:
        homes = homes[['bathroom_number','bedroom_number','car_spaces','commission','construction_year','datasource_name', 'img_height','img_url','img_width', 'floor',
                   'keywords','latitude','lister_url','listing_type','location_accuracy','longitude','price','price_currency','price_formatted','price_high','price_low',
                   'property_type','room_number','size','size_type','size_unit','summary','thumb_height','thumb_url','thumb_width','title','updated_in_days','updated_in_days_formatted']]

    return homes

homes = pd.DataFrame()

codigos_postales = ['01008']


today=datetime.date.today() #to change the name of the file
for i in codigos_postales:
    area_name = i
    temp = get_nestoria('buy')

    if i == 0:
        homes =temp
    else:
        homes = homes.append(temp,sort=True)



print('Number of extracted properties ', len(homes))
print(homes.head())
homes.to_csv('D:\\a000Master Big Data\\Prácticas\\Web scrapping\\Nestoria\\GranadaVenta'+str(today)+'.csv')

1 个答案:

答案 0 :(得分:0)

data = response.json()

这里的数据是您从发送请求中获得的解析响应。

然后您可以像这样更新列表:

for i in data['listings']:
    i['ZipCode'] = zipcode
邮政编码是您要分配的邮政编码,即您在请求中发送的邮政编码。

您可以将数据对象转换为数据框,然后调用pd.to_csv或使用python内置的csv.writer

如果您没有邮政编码,则可以使用google maps API来获取

http://maps.googleapis.com/maps/api/geocode/json?address=valencia&sensor=true_or_false&key=YOUR_API_KEY

您必须先注册才能获取API密钥,然后才能从JSON响应中获取邮政编码。

更新:

这里是使用方法的示例。

api = 'http://api.nestoria.es/api?action=search_listings'
place = '&place_name=' + area_name
listing_type = '&listing_type=' + type
json_es = '&encoding=json&pretty=1&country=es'
page = '&page='

api_input = api + place + listing_type + json_es
response = get(api_input)
update = response.json()['response']['listings']
for i in update:
    i['Zipcode'] = zipcode