2017-10-12 7 views
3

多忙なapiを使用して、2つの日付間の音楽イベント(コンサート)に関する情報を取得しようとしています。多忙なapiへのリクエストから空の配列を取得

オンラインで利用可能Pythonの例を使用して
- city 
- performer 
- country 
- latitude 
- longitude 
- genre 
- title 
- image 
- StarTime 

イムと上記のデータを得るためにそれを変更します。たとえば、私は20171013から20171012から、各公演に関する以下の情報を取得したいです。しかし、今のところそのは、この情報を取得することができるだけでイムを動作していない:

{'latitude': '40.4', 
    'longitude': '-3.68333', 
    'start_time': '2017-10-12 20:00:00', 
    'city_name': 'Madrid', 'title': 'Kim Waters & Maysa Smooth en Hot Jazz Festival'} 

しかし、パフォーマー、ジャンル国と画像のURLは、その動作していません。あなたはその情報を入手する方法を知っていますか?この情報を得るために以下のpythonの例を変更すると、空の配列が返されます。

Pythonの例の作業:(しかし、私は空の配列を取得event_featuresにtheese要素を追加した場合、演奏者、ジャンル、国や画像のURLを取得せずに)

import requests 
    import datetime 

def get_event(user_key, event_location , start_date, end_date, event_features, fname): 

    data_lst = [] # output 
    start_year = int(start_date[0:4]) 
    start_month = int(start_date[4:6]) 
    start_day = int(start_date[6:]) 

    end_year = int(end_date[0:4]) 
    end_month = int(end_date[4:6]) 
    end_day = int(end_date[6:]) 

    start_date = datetime.date(start_year, start_month, start_day) 
    end_date = datetime.date(end_year, end_month, end_day) 
    step = datetime.timedelta(days=1) 

    while start_date <= end_date: 

     date = str(start_date.year) 
     if start_date.month < 10: 
      date += '0' + str(start_date.month) 
     else: 
      date += str(start_date.month) 

     if start_date.day < 10: 
      date += '0' + str(start_date.day) 
     else: 
      date += str(start_date.day) 
     date += "00" 
     date += "-" + date 

     url = "http://api.eventful.com/json/events/search?" 
     url += "&app_key=" + user_key 
     url += "&location=" + event_location 
     url += "&date=" + date 
     url += "&page_size=250" 
     url += "&sort_order=popularity" 
     url += "&sort_direction=descending" 
     url += "&q=music" 
     url+= "&c=music" 

     data = requests.get(url).json() 

     try: 
      for i in range(len(data["events"]["event"])): 
       data_dict = {} 
       for feature in event_features: 
        data_dict[feature] = data["events"]["event"][i][feature] 
       data_lst.append(data_dict) 
     except: 
      pass 

     print(data_lst) 
     start_date += step 


def main(): 

    user_key = "" 
    event_location = "Madrid" 
    start_date = "20171012" 
    end_date = "20171013" 
    event_location = event_location.replace("-", " ") 
    start_date = start_date 
    end_date = end_date 
    event_features = ["latitude", "longitude", "start_time"] 
    event_features += ["city_name", "title"] 
    event_fname = "events.csv" 

    get_event(user_key, event_location, start_date, end_date, event_features, event_fname) 


if __name__ == '__main__': 
    main() 
+1

「event_features」リストには、これらの5つの要素しか含まれていません。 –

+0

あなたの答えをありがとう。私はちょうどその5つの要素をそのように働いているので、その要素を入れました。例えばパフォーマーを追加すると、空の配列が返されます。 – JonD

答えて

1

は、いくつかのことが明確である:国のために

  1. 、使用するフィールドがCOUNTRY_NAMEです。これはあなたの "event_features"リストにはありませんでした
  2. イベントごとに複数のパフォーマーが存在する可能性があります。すべての出演者を取得するには、あなたの "event_features"リストに "出演者"を追加する必要があります
  3. ジャンルはフィールドがありませんので、ジャンルは見つかりません
  4. "image"フィールドは常にNoneです。これは利用可能な画像がないことを意味します。

ここにコードが変更されています。うまくいけば、それははるかに良く機能し、あなたが前進するのを助けるでしょう。

import datetime 
import requests 

data_lst = [] # output 
event_features = ["latitude", "longitude", "start_time", "city_name", 
        "country_name", "title", "image", "performers"] 

def get_event(user_key, event_location, start_date, end_date): 

    start_year = int(start_date[0:4]) 
    start_month = int(start_date[4:6]) 
    start_day = int(start_date[6:]) 

    end_year = int(end_date[0:4]) 
    end_month = int(end_date[4:6]) 
    end_day = int(end_date[6:]) 

    start_date = datetime.date(start_year, start_month, start_day) 
    end_date = datetime.date(end_year, end_month, end_day) 
    step = datetime.timedelta(days=1) 

    while start_date <= end_date: 

     date = str(start_date.year) 
     if start_date.month < 10: 
      date += '0' + str(start_date.month) 
     else: 
      date += str(start_date.month) 

     if start_date.day < 10: 
      date += '0' + str(start_date.day) 
     else: 
      date += str(start_date.day) 
     date += "00" 
     date += "-" + date 

     url = "http://api.eventful.com/json/events/search?" 
     url += "&app_key=" + user_key 
     url += "&location=" + event_location 
     url += "&date=" + date 
     url += "&page_size=250" 
     url += "&sort_order=popularity" 
     url += "&sort_direction=descending" 
     url += "&q=music" 
     url += "&c=music" 

     data = requests.get(url).json() 
     print "==== Data Returned by eventful.com ====\n", data 

     try: 
      for i in range(len(data["events"]["event"])): 
       data_dict = {} 
       for feature in event_features: 
        data_dict[feature] = data["events"]["event"][i][feature] 
       data_lst.append(data_dict) 
     except IndexError: 
      pass 

     print "====================================" 
     print data_lst 
     start_date += step 


def main(): 

    user_key = "Enter Your Key Here" 
    event_location = "Madrid" 
    start_date = "20171012" 
    end_date = "20171013" 
    event_location = event_location.replace("-", " ") 
    start_date = start_date 
    end_date = end_date 
    #event_fname = "events.csv" 

    get_event(user_key, event_location, start_date, end_date) 


if __name__ == '__main__': 
    main() 
3

あなたはあなたの問題をデバッグする必要がありますし、 すべての例外を無視しないでください

によってラインtry: ... except: passを交換してください:あなたは「行」に存在していない行方不明featureの名前でKeyErrorが表示されます

data = requests.get(url).json() 
    if "event" in data.get("event", {}): 
     for row in data["events"]["event"]: 
      # print(row) # you can look here what are the available data, while debugging 
      data_dict = {feature: row[feature] for feature in features} 
      data_lst.append(data_dict) 
    else: 
     pass # a problem - you can do something here 

。不足している機能を修正し、そのサービスのAPIに関するドキュメントを読む必要があります。カントリー機能はおそらく "city_name"と同様に "country_name"です。おそらく、 "include"パラメータを設定して、検索の詳細の詳細セクションをデフォルトよりも指定する必要があります。 「エラーが黙って渡すことはありません。」ので


ユニバーサルtry: ... except: passは、使用してはいけません(The Zen of Python

読むHandling Exceptions

... except節の最後には、ワイルドカードとして機能するように、例外名(複数可)を省略することができます。この方法で実際のプログラミングエラーを簡単に隠すことができるので、これを慎重に使用してください。 ...

予想外の例外が可能なより重要なコマンドは、requests.get(url).json()です。 TimeoutException。とにかく問題がある場合は "while"ループを続けるべきではありません。

+0

説明をありがとう。しかし、ドキュメントでは、国がとてもうまくいくように見えます。 – JonD

+0

エラーではなく機能が欠落している場合は、 'row.get(feature)'を使用して 'None'を取得します。 – Javier

+0

@ Javierプロダクションではより良いと私は同意しますが、上流のAPIでさえ十分に実装されていない開発の冒頭では、列名の入力ミスを修正し、時には欠落する可能性がある列を考える方が良い最後に、空の文字列のほかに目立たない文字列 "None"がありません。 – hynekcer

1

performerimage、およびcountryフィールドのEventful APIからデータを正常に取得できました。しかし、私はEventful Search APIがgenreをサポートしているとは思わない - 私はそれを表示しないin their documentation

countryを取得するには、event_features配列に"country_name", "country_abbr"を追加しました。すなわち、得られたJSONにこれらの値を加算する:

'country_abbr': u'ESP', 
'country_name': u'Spain' 

Performerevent_features"performers"を添加することにより取得することができます。、画像を取得するには

'performers': { 
    u'performer': { 
     u'name': u'Kim Waters', 
     u'creator': u'evdb', 
     u'url': u'http://concerts.eventful.com/Kim-Waters?utm_source=apis&utm_medium=apim&utm_campaign=apic', 
     u'linker': u'evdb', 
     u'short_bio': u'Easy Listening/Electronic/Jazz', u'id': u'P0-001-000333271-4' 
    } 
} 

event_features配列にimageを追加します。それはJSON出力にこれを追加します。ただし、すべてのイベントにイメージがあるわけではありません。 'image': Noneまたは

'image': { 
    u'medium': { 
     u'url': u'http://d1marr3m5x4iac.cloudfront.net/store/skin/no_image/categories/128x128/other.jpg', 
     u'width': u'128', 
     u'height': u'128' 
    }, 
    u'thumb': { 
     u'url': u'http://d1marr3m5x4iac.cloudfront.net/store/skin/no_image/categories/48x48/other.jpg', 
     u'width': u'48', 
     u'height': u'48' 
    } 
} 

幸いです。 :)あなたがeventful.comによって返されたデータを見れば

関連する問題