Kami menganalisis riwayat mendengarkan dalam Yandex.Music

Selama hampir satu tahun sekarang saya telah menggunakan layanan Musik Yandex dan semuanya cocok untuk saya. Tetapi ada satu halaman yang menarik dalam layanan ini - sejarah. Ini menyimpan semua trek yang telah didengarkan dalam urutan kronologis. Dan tentu saja, saya ingin mengunduhnya dan menganalisis apa yang saya dengar di sana sepanjang waktu.



Upaya pertama


Mulai berurusan dengan halaman ini, saya langsung mengalami masalah. Layanan ini tidak mengunduh semua trek sekaligus, tetapi hanya saat Anda menggulir. Saya tidak ingin mengunduh sniffer dan memahami lalu lintas, dan saya tidak memiliki keahlian dalam hal ini pada saat itu. Karena itu, saya memutuskan untuk bertindak lebih sederhana dengan meniru browser menggunakan selenium.


Naskah ditulis. Tetapi dia bekerja sangat tidak stabil dan untuk waktu yang lama. Tapi dia berhasil memuat cerita. Setelah analisis sederhana, saya meninggalkan script tanpa modifikasi, sampai setelah beberapa waktu saya tidak mau lagi mengunduh cerita. Berharap yang terbaik, saya meluncurkannya. Dan, tentu saja, dia memberikan kesalahan. Kemudian saya menyadari bahwa sudah waktunya untuk melakukan semuanya secara manusiawi.


Opsi kerja


Untuk analisis lalu lintas, saya memilih Fiddler untuk diri saya sendiri karena antarmuka yang lebih kuat untuk lalu lintas http, tidak seperti wireshark. Menjalankan sniffer, saya berharap melihat permintaan api dengan token. Tapi tidak. Tujuan kami adalah di music.yandex.ru/handlers/library.jsx . Dan permintaan untuk itu memerlukan otorisasi penuh di situs. Kami akan mulai dengannya.


Login


Tidak ada yang rumit di sini. Kami pergi ke passport.yandex.ru/auth , menemukan parameter untuk permintaan dan membuat dua permintaan untuk otorisasi.


 auth_page = self.get('/auth').text csrf_token, process_uuid = self.find_auth_data(auth_page) auth_login = self.post( '/registration-validations/auth/multi_step/start', data={'csrf_token': csrf_token, 'process_uuid': process_uuid, 'login': self.login} ).json() auth_password = self.post( '/registration-validations/auth/multi_step/commit_password', data={'csrf_token': csrf_token, 'track_id': auth_login['track_id'], 'password': self.password} ).json() 

Jadi kami masuk.


Unduh Riwayat


Selanjutnya kita pergi ke music.yandex.ru/user/<user>/history , di mana kami juga mengambil beberapa parameter yang berguna bagi kami ketika menerima informasi tentang trek. Sekarang kamu bisa mengunduh ceritanya. Kami mendapatkan music.yandex.ru/handlers/library.jsx di music.yandex.ru/handlers/library.jsx dengan parameter {'owner': <user>, 'filter': 'history', 'likeFilter': 'favorite', 'lang': 'ru', 'external-domain': 'music.yandex.ru', 'overembed': 'false', 'ncrnd': '0.9546193023464256'} . Saya tertarik pada parameter ncrnd di sini. Saat membuat permintaan, Yandex selalu memberikan nilai yang berbeda untuk parameter ini, tetapi semuanya berfungsi dengan sama. Kembali kita mendapatkan sejarah dalam bentuk trek id dan informasi rinci tentang sepuluh lagu teratas. Dari informasi trek terperinci, Anda dapat menyimpan banyak data menarik untuk dianalisis nanti. Misalnya, tahun rilis, durasi trek, dan genre. Informasi tentang sisa trek diperoleh dari music.yandex.ru/handlers/track-entries.jsx . Kami menyimpan semua bisnis ini di csv dan lolos analisis.


Analisis


Untuk analisis, kami menggunakan alat standar dalam bentuk panda dan matplotlib.


 import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('statistics.csv') df.head(3) 

Tidak.artisartis_idalbumalbum_idmelacaktrack_iddurasi_sectahungenre
0Coldplay671Viva La Vida - Edisi Maret Prospekt51399Kematian dan semua temannya4757393832008batu
1Coldplay671Dihipnotis4.175.645Dihipnotis340460753552017batu
2Coldplay671Kuning49292No More Menjaga Kaki Saya Di Tanah4689452712000batu

Ubah None python ke NaN dan buang mereka.


 df = df.replace('None', pd.np.nan).dropna() 

Mari kita mulai dengan yang sederhana. Mari kita lihat waktu yang kita habiskan untuk mendengarkan semua lagu


 duration_sec = df['duration_sec'].astype('int64').sum() ss = duration_sec % 60 m = duration_sec // 60 mm = m % 60 h = m // 60 hh = h % 60 f'{h // 24} {hh}:{mm}:{ss}' 

 '15 15:30:14' 

Tetapi di sini Anda dapat berdebat tentang keakuratan angka ini, karena tidak jelas bagian mana dari lagu yang perlu Anda dengarkan, Yandex menambahkannya ke dalam cerita.


Sekarang mari kita lihat distribusi lagu berdasarkan tahun rilis.


 plt.rcParams['figure.figsize'] = [15, 5] plt.hist(df['year'].sort_values(), bins=len(df['year'].unique())) plt.xticks(rotation='vertical') plt.show() 


Di sini, hal yang sama tidak begitu sederhana, karena beragam koleksi "Best Hits" akan memiliki tahun kemudian.


Statistik lain akan dibangun berdasarkan prinsip yang sangat mirip. Saya akan memberikan contoh lagu yang paling banyak didengarkan


 df.groupby(['track_id', 'artist','track'])['track_id'].count().sort_values(ascending=False).head() 

track_idartismelacak
170252Taman tautanApa yang telah saya lakukan32
28472574ColdplayAtas & atas31
3656360ColdplayCharlie coklat31
178529Taman tautanMati rasaTanggal 29
289675Tiga puluh detik menuju marsSERANGAN27

dan trek artis yang paling sering diputar


 artist_name = 'Coldplay' df.groupby([ 'artist_id', 'track_id', 'artist', 'track' ])['artist_id'].count().sort_values(ascending=False)[:,:,artist_name].head(5) 

artis_idtrack_idmelacak
67128472574Atas & atas31
3656360Charlie coklat31
340302Perbaiki kamu26
26285334Kepala penuh mimpi26
376949Kuning23

Kode lengkap dapat ditemukan di sini.

Source: https://habr.com/ru/post/id467863/


All Articles