为什么我只能从 Spotify 播放列表中获取一首歌曲而不是所有歌曲?

Why am I only getting one song from Spotify playlists isntead of all of them?

我是编程新手。我想使用 SpotiPy 和 PyLyrics 结合我的 Spotify 播放列表的音频特征分析进行情感分析。

我试图让这段代码正常工作,但我只设法将一首歌曲添加到我的 CSV 文件中,尽管我的播放列表要大得多。

from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
import json
import csv
import pylyrics3
from nltk.sentiment.vader import SentimentIntensityAnalyzer as SIA

client_credentials_manager = SpotifyClientCredentials(client_id='#########', client_secret='#########')

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

sentiment_analyzer = SIA()

def get_features(track_id):
    features_results = sp.audio_features(track_id)
    json_features = json.dumps(features_results)
    features_data = json.loads(json_features)
    features_list = list(features_data[0].values())
    return features_list

playlist_ids = [
    "6itzpx6OEo76NWSpy0f3fc",
    "3itylhqRqKPS4nOgWmU7lU",
    "63UBtWxXAtUIR6djuNhGj9",
    "6tZo11hLgEslYdMP5wu4q8",
    "3XXl0JH2uLXpmO5EbH6XPb"
]

# Audio features
feature_names = [
  "danceability",
  "energy",
  "key",
  "loudness",
  "mode",
  "speechiness",
  "acousticness",
  "instrumentalness",
  "liveness",
  "valence",
  "tempo",
  "type",
  "id",
  "uri",
  "track_href",
  "analysis_url",
  "duration_ms",
  "time_signature"
]

username = '#########'

# Write data to CSV file
data_file = open('data.csv','w')

writer = csv.writer(data_file)

# Write header
writer.writerow(['track_id', 'playlist_id', 'date_added', 'track_name', 'first_artist'] + feature_names + ['lyrics', 'neg', 'neu', 'pos', 'compound'])

for playlist_id in playlist_ids:
    print('Querying playlist: ' + str(playlist_id))

    repeat_query = True
    offset_n = 0
    for i in range(2):
        # Query Spotify API
        if i > 0:
            print('Repeating query')
            offset_n += 50
        results = sp.user_playlist_tracks(username, playlist_id, offset=offset_n)
        json_results = json.dumps(results)
        data = json.loads(json_results)

# Write rows

for track in data['items']:
                track_id = track['track']['id']
                date_added = track['added_at']
                track_name = track['track']['name']
                first_artist = track['track']['artists'][0]['name']

# Track features

features = get_features(track_id)

# Try to get lyrics, if available

lyrics = ''

try:
                lyrics = pylyrics3.get_song_lyrics(first_artist, track_name)

except:
                pass

# Sentiment Analysis

neg = None            
neu = None            
pos = None

compound = None

if lyrics:
                snt = sentiment_analyzer.polarity_scores(lyrics)
                neg = snt['neg']
                neu = snt['neu']
                pos = snt['pos']
                compound = snt['compound']

writer.writerow([track_id, playlist_id, date_added, track_name, first_artist] + features + [lyrics] + [neg, neu, pos, compound])

#if data['total'] < 50:
#           break           ????

print('Done querying')

data_file.close()

有谁知道这里出了什么问题以及如何将我的播放列表中的所有曲目转换为 csv?

from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
import json
import csv
import pylyrics3
from nltk.sentiment.vader import SentimentIntensityAnalyzer as SIA
import nltk
import spotipy.util as util


nltk.download('vader_lexicon')

client_credentials_manager = SpotifyClientCredentials(client_id='befa36b5832642fdbb2aa9062f167a7b', client_secret='6ae5e340ddb048839359f53a0bf9abb2')

sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

sentiment_analyzer = SIA()

def get_features(track_id):
    features_results = sp.audio_features(track_id)
    json_features = json.dumps(features_results)
    features_data = json.loads(json_features)
    features_list = list(features_data[0].values())
    return features_list

playlist_ids = [
    "6itzpx6OEo76NWSpy0f3fc",
    "3itylhqRqKPS4nOgWmU7lU",
    "63UBtWxXAtUIR6djuNhGj9",
    "6tZo11hLgEslYdMP5wu4q8",
    "3XXl0JH2uLXpmO5EbH6XPb",
    "5iNZJ2AZghsNgbZgNUngyv",
]




# Audio features
feature_names = [
  "danceability",
  "energy",
  "key",
  "loudness",
  "mode",
  "speechiness",
  "acousticness",
  "instrumentalness",
  "liveness",
  "valence",
  "tempo",
  "type",
  "id",
  "uri",
  "track_href",
  "analysis_url",
  "duration_ms",
  "time_signature"
]

username = 'h93pdaba60md5qbuazllf0mft'



# Write data to CSV file
data_file = open('data.csv','w')

writer = csv.writer(data_file)

# Write header
writer.writerow(['track_id', 'playlist_id', 'date_added', 'track_name', 'first_artist'] + feature_names + ['lyrics', 'neg', 'neu', 'pos', 'compound'])

for playlist_id in playlist_ids:
    print('Querying playlist: ' + str(playlist_id))

    repeat_query = True
    offset_n = 0
    for i in range(2):
        # Query Spotify API
        if i > 0:
            print('Repeating query')
            offset_n += 50
        results = sp.user_playlist_tracks(username, playlist_id, offset=offset_n)
        json_results = json.dumps(results)
        data = json.loads(json_results)

# Write rows

        for track in data['items']:
                        track_id = track['track']['id']
                        date_added = track['added_at']
                        track_name = track['track']['name']
                        first_artist = track['track']['artists'][0]['name']

# Track features

                        features = get_features(track_id)

# Try to get lyrics, if available

                        lyrics = ''

                        try:
                                        lyrics = pylyrics3.get_song_lyrics(first_artist, track_name)

                        except:
                                        pass

# Sentiment Analysis

                        neg = None
                        neu = None
                        pos = None

                        compound = None

                        if lyrics:
                                        snt = sentiment_analyzer.polarity_scores(lyrics)
                                        neg = snt['neg']
                                        neu = snt['neu']
                                        pos = snt['pos']
                                        compound = snt['compound']
                        try:
                            writer.writerow([track_id, playlist_id, date_added, track_name, first_artist] + features + [lyrics] + [neg, neu, pos, compound])
                        except:
                            print("error in csv writting")
                    #if data['total'] < 50:
                    #           break           ????

    print('Done querying')

data_file.close()