Вложенный цикл FOR с ответами JSON - PullRequest
0 голосов
/ 12 февраля 2019

Я впервые использую управляемый режим при задании нового вопроса, поэтому извиняюсь, если я что-то не так делаю здесь.По сути, я начинаю с извлечения всех моих подписчиков с помощью библиотеки запросов, которая возвращает JSON.Затем я хочу получить идентификаторы подписчиков и вставить один за другим в новый URL-адрес, который показывает мне каждую из их тренировок, а затем записать все идентификаторы тренировок в длинный список и просмотреть их по новому URL-адресу.подробности о тренировке и сохраните их в фрейме данных Pandas.

Я могу заставить все отдельные URL работать нормально, я могу даже заставить цикл FOR работать нормально и распечатать все идентификаторы.Однако, как только я начинаю их вкладывать, код полностью ломается.У меня также возникают проблемы с сохранением идентификаторов в каком-то видефрейме для вывода, но в конечном итоге это не так важно.

Именно так я вытащил и отобразил всех своих подписчиков (по крайней мере, их идентификаторы)

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

Так что теперь это то место, где он начинает разваливаться. Я хотел бы сделать еще один слойкоторый удаляет идентификаторы из списка тренировок, а затем запускает следующий URL для каждого из этих идентификаторов тренировок: Вот пример детали тренировки:

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

Итак, после того, как я получу список этих тренировокИдентификаторы. Мне нужно поместить их в 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: 'data'

Однако я знаю, что в результатах JSON есть ключ данных.Я что-то здесь упускаю?

Кроме того, я был бы готов сделать это по-другому, если есть лучший способ.Спасибо.

1 Ответ

0 голосов
/ 22 февраля 2019

Посмотрите здесь на этот репо, и вы сможете выяснить вашу проблему.У этого есть некоторые из документированных API, есть больше, чем это, однако я не хотел бы, чтобы Пелотон закрыл доступ к ним, находящимся на публике.

Это не открытый API, поэтому они могут изменить его поведение в любое время.

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

...