2017-10-12 38 views
3

我试图使用事件API来获取有关两个日期之间只有音乐事件(音乐会)的信息。例如,我想获得每场音乐会以下信息从20171012到20171013:从请求到事件API获取一个空阵列

- city 
- performer 
- country 
- latitude 
- longitude 
- genre 
- title 
- image 
- StarTime 

即时通讯使用Python的例子可在网上,并改变它来获得上述数据。但现在它不能正常工作我只是能够得到这个信息:

{'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例子来获取这些信息时,它总是返回一个空数组。

蟒蛇例如工作:(但是,没有得到表演,流派,国家和图像的URL,如果我theese元素添加到event_features我得到一个空数组)

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'列表只包含这五个元素。 –

+0

谢谢你的回答。我只是把这5个元素放在一起,因为就像它的工作一样。例如,如果我添加执行者,它将返回一个空数组。 – JonD

回答

1

如果你看一下由eventful.com返回的数据,几件事情是清楚的:

  1. 对于国家,进行应用的领域是COUNTRY_NAME。这从您的“event_features”列表中缺失
  2. 每个事件可能有多个执行者。要获得所有表演者,您需要在“event_features”列表中添加“表演者”
  3. 没有名为类型的字段,因此您无法找到类型
  4. “图片”字段始终为“无”。这意味着没有可用的图像。

这是修改后的代码。希望它效果更好,它会帮助你前进。

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

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 

你会看到一个KeyError与丢失feature未出现在“行”的名称。您应该修复缺失的功能并阅读关于该服务的API的文档。与“city_name”类似,国家/地区特征可能是“country_name”。也许你应该设置“include”参数来指定更多的搜索细节部分,而不仅仅是默认值。


的普遍try: ... except: pass不应该使用,因为“错误不应该无声地传递。” (The Zen of Python

Handling Exceptions

...除了子句可以省略异常名(一个或多个)最后,作为通配符。请谨慎使用此功能,因为以这种方式很容易掩盖真正的编程错误! ...

可能出现意想不到的例外的更重要的命令是requests.get(url).json(),例如, TimeoutException异常。无论如何,如果出现问题,你不应该继续“while”循环。

+0

感谢您的解释。但在文件中出现国家如此肩负的工作。 – JonD

+0

当某些功能丢失而不是错误时,使用'row.get(feature)'获取'None'。 – Javier

+0

@Javier我同意这样做对生产有好处,但是在开发开始时,即使上游API还没有实现,最好是修正列名中的拼写错误,并考虑哪些列有时可能会丢失,以便除了空字符串之外,最终还没有一个未被注意的字符串“无”。 – hynekcer

1

我能够成功从performer,imagecountry字段的Eventful API中提取数据。但是,我不认为事件搜索API支持genre - 我没有看到它in their documentation。我想添加"country_name", "country_abbr"到你的event_features数组中。这增加了这些值所得到的JSON:

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

Performer也可以通过添加到"performers"event_features被检索。这将增加该给JSON输出:

'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' 
    } 
} 

要检索图像,添加imageevent_features阵列。请注意,并非所有事件都有图像。你要么看到'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' 
    } 
} 

祝你好运! :)