带有JSON响应的嵌套FOR循环

时间:2019-02-12 16:53:23

标签: json python-3.x python-requests nested-loops

这是我第一次使用引导模式询问新问题,如果在这里做错了,我深表歉意。基本上,我首先使用请求库拉出我的所有关注者,该库返回JSON。然后,我想拉出“跟随者ID”并将其逐个插入新的URL,该URL向我显示他们的每个锻炼,然后我想将所有锻炼ID记录到一个长列表中,并在新的URL上循环遍历,锻炼细节并将其存储在熊猫数据框中。

我可以使所有单独的URL正常工作,甚至可以使FOR循环正常工作并打印所有ID。但是,一旦我开始嵌套它们,代码就会完全中断。我也很难将ID存储在某种数据帧中以进行输出,但是最终并不是那么重要。

这就是我拉动并显示所有关注者的方式(至少是他们的ID)

FollowersURL='https://api.onepeloton.com/api/user/935aa28d93794c1f862931de05900ace/followers?limit=5000'
FollowerResults=requests.get(FollowersURL,cookies=s.cookies).json()
for each in FollowerResults['data']:
    print (each['id'])

FollowerResults如下所示:

{
    'count': 9,
    'show_previous': False,
    'page_count': 1,
    'limit': 5000,
    'total_non_pending_followers': 9,
    'show_next': False,
    'total': 9,
    'data': [{
        'username': 'NoTimeForBasic',
        'authed_user_follows': False,
        'total_workouts': None,
        'relationship': {
            'me_to_user': 'follow_pending',
            'user_to_me': 'following'
        },
        'is_profile_private': True,
        'image_url': 'https://peloton-profile-images.s3.amazonaws.com/c85dac00603049628cd08fda7809d7f3ef35586a/1464367429578',
        'total_following': None,
        'total_followers': None,
        'category': 'others',
        'id': '079703c6a50a411089283c4500bdfae1',
        'location': '#fitfab40s El Cajon, CA'
    }, {
        'username': 'CWhynock',
        'authed_user_follows': True,
        'total_workouts': 29,
        'relationship': {
            'me_to_user': 'following',
            'user_to_me': 'following'
        },
        'is_profile_private': False,
        'image_url': 'https://s3.amazonaws.com/peloton-profile-images/f68874d97f5b06322be8213aedcb72f4d6d6b3cb/d16684f4b21542b499093adca1d8144c',
        'total_following': 7,
        'total_followers': 10,
        'category': 'following',
        'id': 'fa05ec2c901b4f78b87f783b6cf718d8',
        'location': 'GO PATS! '
    },

所以我想做的是使用以下URL提取这些用户的锻炼清单中的每一个。我想我已经用以下代码成功完成了此任务:

FollowersURL='https://api.onepeloton.com/api/user/935aa28d93794c1f862931de05900ace/followers?limit=5000'
FollowerResults=requests.get(FollowersURL,cookies=s.cookies).json()
print (FollowerResults)
for each in FollowerResults['data']:
    WorkoutListURL='https://api.onepeloton.com/api/user/'+each['id']+'/workouts?limit=5000'
    WorkoutList=requests.get(WorkoutListURL,cookies=s.cookies).json()
    print (WorkoutList)

JSON结果如下:

{
    'count': 389,
    'summary': {
        '2019-02': 8,
        '2018-09': 27,
        '2019-01': 37,
        '2018-08': 29,
        '2018-03': 45,
        '2018-02': 16,
        '2018-05': 53,
        '2018-04': 50,
        '2018-07': 35,
        '2018-06': 34,
        '2018-12': 27,
        '2018-10': 16,
        '2018-11': 12
    },
    'page_count': 1,
    'show_next': False,
    'sort_by': '-created_at,-pk',
    'show_previous': False,
    'limit': 5000,
    'aggregate_stats': [],
    'total': 389,
    'data': [{
        'workout_type': 'class',
        'total_work': 414080.72,
        'is_total_work_personal_record': False,
        'device_type': 'home_bike_v1',
        'has_pedaling_metrics': True,
        'id': '8aba8dcb693b46819f02217794f3a3a8',
        'fitbit_id': None,
        'peloton_id': '1bfa71c672a640d9bedae63d28b4b3be',
        'user_id': '145d2324238e4cd992651b57f8bf0c47',
        'title': None,
        'has_leaderboard_metrics': True,
        'device_time_created_at': 1549910418,
        'platform': 'commercial_bike',
        'metrics_type': 'cycling',
        'fitness_discipline': 'cycling',
        'status': 'COMPLETE',
        'start_time': 1549928479,
        'name': 'Cycling Workout',
        'strava_id': None,
        'created': 1549928418,
        'created_at': 1549928418,
        'end_time': 1549931177
    }, {
        'workout_type': 'freestyle',
        'total_work': 223051.5,
        'is_total_work_personal_record': False,
        'device_type': 'home_bike_v1',
        'has_pedaling_metrics': True,
        'id': '8dff473932d043ef9b9d066ca347e072',
        'fitbit_id': None,
        'peloton_id': None,
        'user_id': '145d2324238e4cd992651b57f8bf0c47',
        'title': '44 min 17 sec Just Ride',
        'has_leaderboard_metrics': False,
        'device_time_created_at': 1549571978,
        'platform': 'home_bike',
        'metrics_type': 'cycling',
        'fitness_discipline': 'cycling',
        'status': 'COMPLETE',
        'start_time': 1549589978,
        'name': 'Cycling Workout',
        'strava_id': None,
        'created': 1549589978,
        'created_at': 1549589978,
        'end_time': 1549592635,
        'ride': {
            'scheduled_start_time': 1549589978,
            'title': '44 min 17 sec Just Ride',
            'is_archived': False,
            'duration': 2657,
            'instructor': {
                'image_url': 'https://s3.amazonaws.com/peloton-ride-images/just-ride.png',
                'name': 'JUST RIDE'
            },

所以现在这是它开始崩溃的地方。我想做另一层,从锻炼列表中抓取ID,然后为每个锻炼ID运行以下URL:这是一个锻炼细节示例:

https://api.onepeloton.com/api/workout/c66d130f75ec4ec398954ebf6eb6e51e

因此,在获得这些ID的列表之后,我需要将它们放在上面的URL中,然后将结果存储在pandas数据框中。

当我尝试以下操作时,它不起作用:

FollowersURL='https://api.onepeloton.com/api/user/935aa28d93794c1f862931de05900ace/followers?limit=5000'
FollowerResults=requests.get(FollowersURL,cookies=s.cookies).json()
print (FollowerResults)
for each in FollowerResults['data']:
    WorkoutListURL='https://api.onepeloton.com/api/user/'+each['id']+'/workouts?limit=5000'
    WorkoutList=requests.get(WorkoutListURL,cookies=s.cookies).json()
    for each in WorkoutList['data']:
        print (each['id'])

错误:

KeyError:“数据”

但是,我知道JSON结果中有一个数据密钥。我在这里完全错过了什么吗?

此外,如果有更好的方法,我愿意采取另一种方法。谢谢。

1 个答案:

答案 0 :(得分:0)

在此处查看此仓库,您应该可以弄清楚问题所在。这里有一些文档化的API,还有比这更多的API,但是我不希望Peloton在公众眼中关闭对它们的访问。

这不是开放的API,因此他们可以随时更改其行为。

https://github.com/geudrik/peloton-api/blob/3ead4b04d0cdaeca129b94240bbeea5ecb235959/API_DOCS.md