16 августа 2021

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

ΠŸΠΈΡˆΡƒ ΠΎΠ± IT ΠΈ Π½Π° Python. kungurov.net
Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Python ΠΈ Selenium, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ всС плСйлисты ΠΈ Π°Π»ΡŒΠ±ΠΎΠΌΡ‹ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ, Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ spotipy пСрСнСсСм Ρ„ΠΎΠ½ΠΎΡ‚Π΅ΠΊΡƒ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ.
🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

ВозмоТности скрипта:

  • пСрСнос альбомов;
  • пСрСнос своих плСйлистов ΠΈ Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΈΠ· плСйлиста «МнС нравится»;
  • пСрСнос Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Ρ… плСйлистов.
ЕдинствСнноС условиС: Ρ„ΠΎΠ½ΠΎΡ‚Π΅ΠΊΠ° ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠΉ.
***

ΠŸΠ΅Ρ€Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡƒΡ‚ΠΈ ΠΌΡ‹ ΠΏΡ€ΠΎΠΉΠ΄Π΅ΠΌ ΠΎΠΊΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ: Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ откаТСмся ΠΎΡ‚ использования Π½Π΅ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ yandex-music-api ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ своими Ρ€ΡƒΠΊΠ°ΠΌΠΈ. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части ΠΏΡƒΡ‚ΠΈ ΠΊ Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° spotipy, которая пСрСнСсСт Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ всС Π»ΠΈΡ‡Π½Ρ‹Π΅ плСйлисты, Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈ Π°Π»ΡŒΠ±ΠΎΠΌΡ‹. ΠŸΠΎΠ΅Ρ…Π°Π»ΠΈ!

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Π°Π»ΡŒΠ±ΠΎΠΌΡ‹

Π£ ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ (ЯМ) Π½Π΅Ρ‚ API. БовсСм. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π°ΠΌ придСтся Π±Ρ€Π°Ρ‚ΡŒ со страниц ЯМ. ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° свою страницу ЯМ Π² Ρ€Π°Π·Π΄Π΅Π» Π°Π»ΡŒΠ±ΠΎΠΌΡ‹ ΠΈ Π½Π°Ρ‡Π½Π΅ΠΌ поиск ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΎΡ‚ΠΊΡ€Ρ‹Π² инструмСнты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° (Ctrl + Shift + i Π² Chrome ΠΈ FireFox).

Π’ Ρ‚Π΅Π»Π΅ страницы с альбомами Π΅ΡΡ‚ΡŒ JSON-массив Mu, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Π΄Π²ΡƒΡ… ΠΊΠ»ΡŽΡ‡Π°Ρ… содСрТит всС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎΠ± альбомС: Π΅Π³ΠΎ ID, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ имя исполнитСля:

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

C массивом Mu Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ постоянно, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΌ содСрТится самоС Ρ†Π΅Π½Π½ΠΎΠ΅ – ID альбомов, плСйлистов ΠΈ Ρ‚Ρ€Π΅ΠΊΠΎΠ², ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всю Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ID Π±ΡƒΠ΄Π΅Ρ‚ нашСй Ρ†Π΅Π»ΡŒΡŽ Π½Π° всСм ΠΏΡƒΡ‚ΠΈ слСдования.

  • ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ – albumIds – содСрТит ID всСх альбомов, Π½ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° страницу ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ альбома ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ имя исполнитСля ΠΈΠ· Ρ‚Π΅Π³ΠΎΠ².
  • Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΡŽΡ‡ – albums – сразу Π²Ρ‹Π΄Π°Π΅Ρ‚ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 150 ΠΏΠ°Ρ€ (это ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ распространяСтся Π½Π° плСйлисты Ρ‚ΠΎΠΆΠ΅).
JSON ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ
JSON ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ

ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСнСсти всС Π°Π»ΡŒΠ±ΠΎΠΌΡ‹.

Как вывСсти json Π² Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΊΠ°ΠΊ Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅ Π²Ρ‹ΡˆΠ΅?

Π§Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pprint:

        from pprint import pprint
pprint(json)
    

Как ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля?

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² ID, ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° страницу альбома https://music.yandex.ru/album/ID_альбома. Из Ρ‚Π΅Π³ΠΎΠ² ΡƒΠ·Π½Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля. Допустим, Π² нашСй Ρ„ΠΎΠ½ΠΎΡ‚Π΅ΠΊΠ΅ Π΅ΡΡ‚ΡŒ альбом Β«Greatest Hits In JapanΒ» – Queen. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ страницу альбома.

Π’ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π² инструмСнты Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ инструмСнт Π‘Π΅Π»Π΅ΠΊΡ‚ΠΎΡ€ (Ctrl + Shift + C):

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

И просто ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎ названию альбома Π½Π° страницС:

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

Π’Π΅Π³ <h1> с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ альбома найдСтся автоматичСски:

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

Π’Π΅Π³ <a> с ΠΈΠΌΠ΅Π½Π΅ΠΌ исполнитСля:

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

Автоматизация получСния Π΄Π°Π½Π½Ρ‹Ρ…, Selenium

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Selenium ΡƒΠΌΠ΅Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠΌ ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ тСстирований. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium ΠΌΡ‹ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ дСйствия Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°: ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ страниц плСйлистов, альбомов ΠΈ Ρ‚Ρ€Π΅ΠΊΠΎΠ².

Установим Selenium:

        pip install selenium
    

Установим Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Chrome:

        sudo apt-get install chromium-chromedriver
    

Chromedriver установится Π² /usr/lib/chromium-browser/chromedriver

Алгоритм получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ± альбомС:

  1. Π—Π°ΠΉΡ‚ΠΈ Π½Π° страницу со своими/Ρ‡ΡƒΠΆΠΈΠΌΠΈ альбомами.
  2. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ID альбомов ΠΈΠ· массива Mu.
  3. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° страницу альбома ΠΈ Π½Π°ΠΉΡ‚ΠΈ Π² Ρ‚Π΅Π³Π°Ρ… Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠ°ΠΏΠΊΡƒ proglib, Π° Π² Π½Π΅ΠΉ Ρ„Π°ΠΉΠ» get_music_data.py.

Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Selenium ΠΈ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ run_driver(), Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΡƒΡŽ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€:

get_music_data.py
        from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
import re

# функция, Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‰Π°Ρ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€
def run_driver():
    # Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ управлСния опциями Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°
    chrome_options = Options()
    # Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ '--headless' запускаСт Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π±Π΅Π· Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°
    chrome_options.add_argument('--headless')
    # Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ '--log-level=3' скрываСт Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
    chrome_options.add_argument('--log-level=3')
    # запуск Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°
    driver = webdriver.Chrome('chromedriver', options=chrome_options)
    return driver

    

Π—Π΄Π΅ΡΡŒ:

  • 'chromedriver' – ΠΏΡƒΡ‚ΡŒ ΠΊ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρƒ. Π›ΠΈΠ±ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ: '/usr/lib/chromium-browser/chromedriver'.

Π”Π°Π»ΡŒΡˆΠ΅ ΠΈΠ΄Π΅Ρ‚ нСбольшой вСлосипСд. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Selenium ΠΏΡ€ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ массива Mu со страницы ЯМ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

        selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: stale element not found
    

ΠŸΠ°ΡƒΠ·Π° послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ страница Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»Π°ΡΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΈ листаниС Π² ΠΊΠΎΠ½Π΅Ρ† страницы Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ – Ρ‚ΠΎΠΆΠ΅. Оказалось, Ссли ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ страницу Π½Π° локальной машинС, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‚Π°Ρ‰ΠΈΡ‚ΡŒ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· массива Mu Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ это.

Алгоритм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

  1. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ страницС ЯМ.
  2. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ html-страницу ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π΅Π΅ содСрТимоС страницы ЯМ.
  3. Π˜Π·Π²Π»Π΅Ρ‡ΡŒ массив Mu.
  4. Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу.

НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ create_local_html_page(), которая создаСт Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ» ΠΈ заполняСт Π΅Π΅ содСрТимым страницы ΠΈΠ· ЯМ:

get_music_data.py
        # функция, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ»
def create_local_html_page(page_filename, page_source):
    with open(page_filename + '.html', 'w', encoding='UTF-8') as file:
        # запишСм Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ» содСрТимоС ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-страницы ЯМ (page_source)
        file.write(page_source)
    

Π—Π΄Π΅ΡΡŒ:

  • page_filename – Π½Π°Π·Π²Π°Π½ΠΈΠ΅ html-Ρ„Π°ΠΉΠ»Π°.
  • page_source – ΠΊΠΎΠ΄ страницы ЯМ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_local_html_page(), которая с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу:

get_music_data.py
        # функция, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ»
def get_local_html_page(yandex_username, page_filename, url):
    # запускаСм Π±Ρ€Π°ΡƒΠ·Π΅Ρ€
    driver = run_driver()
    # Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° страницу ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ
    driver.get(url)
    # создаСм Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ html-страницу с содСрТимым ΠΈΠ· страницы ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ
    create_local_html_page(page_filename, driver.page_source)
    # ΠΏΡƒΡ‚ΡŒ ΠΊ локальной html-страницС
    path_to_local_html_page = str('file://' + os.getcwd() + '/' + page_filename + '.html')
    # Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ html-страницу
    driver.get(path_to_local_html_page)
    return driver
    

Π—Π΄Π΅ΡΡŒ:

  • yandex_username – имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ЯМ.
  • page_filename – Π½Π°Π·Π²Π°Π½ΠΈΠ΅ html-Ρ„Π°ΠΉΠ»Π°.
  • url – ссылка Π½Π° ЯМ.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, функция delete_local_html_page() удаляСт Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу:

get_music_data.py
        # функция, ΡƒΠ΄Π°Π»ΡΡŽΡ‰Π°Ρ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ»
def delete_local_html_page(page_path):
    os.remove(page_path)
    

Π—Π΄Π΅ΡΡŒ:

  • page_path – ΠΏΡƒΡ‚ΡŒ ΠΊ html-Ρ„Π°ΠΉΠ»Ρƒ.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_albums():

get_music_data.py
        # функция, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с названиями альбомов ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ исполнитСлСй
def get_albums(yandex_username):
    # создаСм ссылку Π½Π° альбом
    url = ''.join(['https://music.yandex.ru/users/', yandex_username, '/albums/'])
    # создадим ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу с альбомом ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° Β«Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΈΡΡŒ эти плСйлисты»
    driver = get_local_html_page(yandex_username, 'album_page', url)
    # ΠΏΡ€ΠΎΡ‡Ρ‚Π΅ΠΌ массив с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ плСйлистов
    json = driver.execute_script('return Mu')
    # создадим ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запишСм Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля
    albums_for_spotify = {}
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ альбомов
    all_albums_ids = json['pageData']['albumIds']
    
    

Π’ этом Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹:

  1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ссылку Π½Π° страницу альбомов ЯМ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
  2. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу всСх альбомов.
  3. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всю ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± Π°Π»ΡŒΠ±ΠΎΠΌΠ°Ρ… ΠΈΠ· массива Mu.
  4. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ID всСх альбомов.
  5. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ albums_for_spotify, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запишСм Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля.
get_music_data.py
            # Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ albums_for_spotify
    for i in range(len(all_albums_ids)):
        try:
            # ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° страницу альбома
            driver.get(''.join(['https://music.yandex.ru/album/', str(all_albums_ids[i])]))
            # создадим для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ альбома Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ
            albums_for_spotify[i] = {}
            # запишСм Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома
            albums_for_spotify[i]['album_title'] = driver.find_element_by_xpath(
                "//h1[@class='deco-typo']").text
            # запишСм Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ имя исполнитСля
            albums_for_spotify[i]['artist_name'] = driver.find_element_by_xpath(
                "//span[@class='d-artists']//a[@class='d-link deco-link']").text

        except:
            pass

    # ΡƒΠ΄Π°Π»ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ»
    delete_local_html_page('album_page.html')
    # Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€
    driver.quit()

    return albums_for_spotify

    

Π—Π΄Π΅ΡΡŒ происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  1. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° страницу альбома ЯМ.
  2. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ альбома, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ записываСм Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля.
  3. ΠœΠ΅Ρ‚ΠΎΠ΄ xpath позволяСт ΠΈΡΠΊΠ°Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ Π² Π΄Ρ€ΡƒΠ³Π° Ρ‚Π΅Π³ΠΈ ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… тСкст. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π°ΠΉΠ΄Π΅ΠΌ Π² ΠΊΠΎΠ΄Π΅ страницы Ρ‚Π΅Π³ <h1> с классом deco-typo. И ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ тСкст, содСрТащийся Π² Ρ‚Π΅Π³Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .text.
  4. ЗаписываСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома ΠΈ имя исполнитСля.
  5. УдаляСм Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу со всСми альбомами ЯМ.
  6. Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ выглядит Ρ‚Π°ΠΊ:

        {0: {'album_title': 'The Essential Aerosmith', 'artist_name': 'Aerosmith'}, 1: {'album_title': 'Hyperion', 'artist_name': 'Gesaffelstein'}, ...


    

Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ ΠΈΡ… пСрСнСсти?

Π—Π° пСрСнос Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° spotipy. Установим Π΅Π΅:

        pip install spotipy
    

Для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ client_id ΠΈ client_secret. Π—Π°ΠΉΠ΄Π΅ΠΌ Π½Π° страницу developer.spotify.com/dashboard

И кликнСм на Create an app:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ прилоТСния Π² Spotify
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ прилоТСния Π² Spotify

заполним поля и наТмСм Create:

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

ПослС создания прилоТСния ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΈ Π½Π°ΠΉΠ΄Π΅ΠΌ Client ID ΠΈ Client Secret:

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Client ID ΠΈ Client Secret Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Spotify
ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Client ID ΠΈ Client Secret Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Spotify

Π—Π°ΠΉΠ΄Π΅ΠΌ Π² настройки прилоТСния:

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python

ΠΈ впишСм Π² ΠΏΠΎΠ»Π΅ Redirect URIs адрСс http://localhost:8888/callback/:

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ поля Redirect URIs Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Spotify
Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ поля Redirect URIs Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Spotify

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ ΠΈ Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ.

Π”Π°Π»ΡŒΡˆΠ΅ Π½Π°ΠΌ понадобится Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ» transfer.py для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Spotify Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ spotify ΠΈ для пСрСноса альбомов (Π° Ρ‚Π°ΠΊΠΆΠ΅ плСйлистов, Π½ΠΎ ΠΎΠ± этом ΠΏΠΎΠ·ΠΆΠ΅).

Π—Π°ΠΏΠΈΡˆΠ΅ΠΌ Π² transfer.py ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ строчки:

transfer.py
        import spotipy
from spotipy.oauth2 import SpotifyOAuth
from spotipy import oauth2
from get_music_data import get_my_playlists, get_liked_playlists, get_albums


# функция для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Spotify
def autorisation():
    client_id = ''
    client_secret = ''
    # Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нашСго прилоТСния
    scope = ('user-library-read, playlist-read-private, playlist-modify-private, playlist-modify-public, user-read-private, user-library-modify, user-library-read')
    # URL, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСадрСсуСтся Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ послС получСния ΠΏΡ€Π°Π² доступа ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΊΠ»ΡŽΡ‡Π° доступа
    redirect_uri = 'http://localhost:8888/callback/'
    sp_oauth = oauth2.SpotifyOAuth(client_id, client_secret, redirect_uri, scope=scope)
    code = sp_oauth.get_auth_response(open_browser=True)
    # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚ΠΎΠΊΠ΅Π½
    token = sp_oauth.get_access_token(code, as_dict=False)
    sp = spotipy.Spotify(auth=token)
    # id ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Spotify
    username = sp.current_user()['id']
    return sp, username
    

Π—Π΄Π΅ΡΡŒ:

  • scope – ΠΏΡ€Π°Π²Π° прилоТСния.
  • redirect_uri – ссылка, которая откроСтся (ΠΈ сразу закроСтся) Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΏΡ€Π°Π² доступа.
  • username – имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ.

НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_album_id(), которая ΠΈΡ‰Π΅Ρ‚ Π² спотифай ID альбома:

transfer.py
        # функция, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ id альбома
def get_album_id(query, sp):
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Π°Π»ΡŒΠ±ΠΎΠΌΡƒ ΠΈΠ· поискового запроса Π² Spotify
    album_id = sp.search(q=query, limit=1, type='album')
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id альбома
    # split() – Π΄Π΅Π»Π°Π΅Ρ‚ список, состоящий ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ строчки для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° current_user_saved_albums_add()
    return album_id['albums']['items'][0]['id'].split()
    

Π—Π΄Π΅ΡΡŒ:

  • sp.search(q=query, limit=1, type='album') – поисковый запрос query Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° Π°Π»ΡŒΠ±ΠΎΠΌΡ‹.
  • Π’ ΠΈΡ‚ΠΎΠ³Π΅ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ID альбома. А ΠΌΠ΅Ρ‚ΠΎΠ΄ split Π΄Π΅Π»Π°Π΅Ρ‚ ΠΈΠ· строки список, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ current_user_saved_albums_add(), Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ альбом ΠΏΠΎ ID, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ΅Π½Π½ΠΎ список.

ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΠ΅ΠΌ Π°Π»ΡŒΠ±ΠΎΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ transfer_albums():

transfer.py
        # функция для пСрСноса альбомов
def transfer_albums(yandex_username, albums_for_spotify):
    # авторизуСмся Π² Spotify
    sp, username = autorisation()
    # albums_for_spotify – Π°Π»ΡŒΠ±ΠΎΠΌΡ‹ для пСрСноса ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ
    # содСрТит Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ имя ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ
    for i in range(len(albums_for_spotify)):
        try:
            # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ альбома
            album_title = albums_for_spotify[i]['album_title']
            # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ имя исполнитСля
            artist_name = albums_for_spotify[i]['artist_name']
            # сформируСм поисковый запрос Π² Spotify
            query = ' '.join([artist_name,  album_title])
            # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id альбома Π² Spotify
            album_id = get_album_id(query, sp)
            # Π΄ΠΎΠ±Π°Π²ΠΈΠΌ альбом Π² свою Ρ„ΠΎΠ½ΠΎΡ‚Π΅ΠΊΡƒ
            sp.current_user_saved_albums_add(album_id)

        except:
            pass
    

Π—Π΄Π΅ΡΡŒ:

  • sp, username = autorisation() – авторизация Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ.
  • query = ' '.join([artist_name, album_title]) – Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ поисковый запрос ΠΈΠ· названия альбома ΠΈ ΠΈΠΌΠ΅Π½ΠΈ исполнитСля.
  • get_album_id(query, sp) – ΠΈΡ‰Π΅ΠΌ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ альбом ΠΏΠΎ ID.
  • sp.current_user_saved_albums_add(album_id) – добавляСм альбом Π² свою ΠΌΠ΅Π΄ΠΈΠ°Ρ‚Π΅ΠΊΡƒ.
  • except: pass – Ссли альбом Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ (функция get_album_id Π²Π΅Ρ€Π½Π΅Ρ‚ Π½Π°ΠΌ IndexError ΠΈΠ»ΠΈ KeyError), Ρ‚ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ сначала.

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ плСйлисты

ΠŸΠ»Π΅ΠΉΠ»ΠΈΡΡ‚Ρ‹ дСлятся Π½Π° Π΄Π²Π° Π²ΠΈΠ΄Π°:

  • ΠŸΠ»Π΅ΠΉΠ»ΠΈΡΡ‚ «МнС ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒΒ» ΠΈ созданныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ плСйлисты.
  • Π›Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Π΅ плСйлисты.

Мои плСйлисты

Алгоритм:

  1. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° странцу всСх плСлистов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ https://music.yandex.ru/users/yandex_username/playlists/.
  2. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ID плСйлистов ΠΈΠ· массива Mu.
  3. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° страницу плСйлиста ΠΏΠΎ Π΅Π³ΠΎ ID.
  4. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ со страницы плСйлиста ID Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΈΠ· массива Mu.
  5. ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° страницу ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… названия ΠΈ ΠΈΠΌΠ΅Π½Π° исполнитСлСй ΠΈΠ· Ρ‚Π΅Π³ΠΎΠ².

ВСрнСмся ΠΊ Ρ„Π°ΠΉΠ»Ρƒ get_music_data.py ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_my_playlists_id для получСния ID альбомов Π½Π° ЯМ:

get_music_data.py
        # функция, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ id плСйлистов
def get_my_playlists_id(yandex_username):
    # создадим ссылку Π½Π° плСйлист
    url = ''.join(['https://music.yandex.ru/users/', yandex_username, '/playlists/'])
    # создадим ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу плСйлиста
    driver = get_local_html_page(yandex_username, 'playlist_page', url)
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ массив с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ плСйлистов
    json = driver.execute_script('return Mu')
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id плСйлистов
    my_playlists_id = json['pageData']['playlistIds']

    return my_playlists_id
    

Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ с альбомами: ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° страницу всСх плСйлистов, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· массива Mu, Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊΠ»ΡŽΡ‡ playlistIds с ID всСх плСйлистов.

НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_my_playlists для пСрСноса своих плСйлистов:

get_music_data.py
        # функция, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с названиями Π»ΠΈΡ‡Π½Ρ‹Ρ… плСйлистов, Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ исполнитСлСй
def get_my_playlists(yandex_username):
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id плСйлистов
    my_playlists_id = get_my_playlists_id(yandex_username)
    # создадим ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запишСм Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлистов, Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½Π° исполнитСлСй
    my_playlists_for_spotify = {}
    # Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ my_playlists_for_spotify
    for i in range(len(my_playlists_id)):
        # создадим ссылку Π½Π° плСйлист
        my_playlist_url = ''.join(['https://music.yandex.ru/users/',
                                  yandex_username, '/playlists/', str(my_playlists_id[i])])
        # создадим ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу плСйлиста
        driver = get_local_html_page(yandex_username, 'my_playlist', my_playlist_url)
        # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ массив с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ плСйлистов
        json = driver.execute_script('return Mu')

        # создадим ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запишСм Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ имя исполнитСля
        my_playlists = {}
        # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΈΠ· json Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ id Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ id плСйлиста Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ track_id:playlist_id
        all_track_ids = json['pageData']['playlist']['trackIds']
        # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста
        playlist_name = json['pageData']['playlist']['title']
    

Π’ этой части ΠΊΠΎΠ΄Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ID всСх Π½Π°ΡˆΠΈΡ… плСйлистов ΠΈ записываСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ my_playlists, ΠΈΡ… ID ΠΈ названия.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ названия Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ имя исполнитСля:

get_music_data.py
                # Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ my_playlists
        for j in range(len(all_track_ids)):
            # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id Ρ‚Ρ€Π΅ΠΊΠ°
            track_id = re.findall(r'\d+(?=:)', all_track_ids[j])[0]
            # ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° страницу Ρ‚Ρ€Π΅ΠΊΠ°
            driver.get(''.join(['https://music.yandex.ru/track/', track_id]))
            # создадим Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ плСйлиста
            my_playlists[j] = {}
            # запишСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΊΠ°
            try:
                my_playlists[j]['track_name'] = driver.find_elements_by_xpath("//span[@class='']//a[@class='d-link deco-link']")[0].text
            except:
                my_playlists[j]['track_name'] = ['']
            # запишСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ имя исполнитСля
            try:
                my_playlists[j]['artist_name'] = driver.find_elements_by_xpath(
                "//span[@class='d-artists']//a[@class='d-link deco-link']")[0].text
            except:
                my_playlists[j]['track_name'] = ['']

        # запишСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста, Π΅Π³ΠΎ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° исполнитСлСй
        my_playlists_for_spotify[playlist_name] = my_playlists

        # ΡƒΠ΄Π°Π»ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ»
        delete_local_html_page('my_playlist.html')


    # Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€
    driver.quit()

    return my_playlists_for_spotify
    

Π—Π΄Π΅ΡΡŒ:

  • track_id = re.findall(r'\d+(?=:)', all_track_ids[j])[0] – all_track_ids ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ ID_Ρ‚Ρ€Π΅ΠΊΠ°:ID_плСйлиста. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС числа Π΄ΠΎ двоСточия – ID Ρ‚Ρ€Π΅ΠΊΠ°.
  • driver.find_elements_by_xpath("//span[@class='d-artists']//a[@class='d-link deco-link']")[0].text – Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт – имя ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ исполнитСля, Ссли ΠΈΡ… нСсколько ΠΈΠ»ΠΈ СдинствСнного, Ссли ΠΎΠ½ записал Ρ‚Ρ€Π΅ΠΊ соло.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ my_playlists_for_spotify выглядит Ρ‚Π°ΠΊ:

        {'МнС нравится': {0: {'track_name': 'Memory (From "Cats")', 'artist_name': 'London Theatre Orchestra'}, 1: {'track_name': 'The Show Must Go On', 'artist_name': 'Queen'}, ...
    

Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрСнСсСм плСйлисты Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ» transfer.py ΠΈ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_track_id() для поиска ID Ρ‚Ρ€Π΅ΠΊΠ° Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ:

transfer.py
        # функция, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π°Ρ id Ρ‚Ρ€Π΅ΠΊΠ°
def get_track_id(query, sp):
    # ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΌΡƒ Ρ‚Ρ€Π΅ΠΊΡƒ ΠΈΠ· поисковой Π²Ρ‹Π΄Π°Ρ‡ΠΈ Spotify
    track_id = sp.search(q=query, limit=1, type='track')
    # Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΉΠ΄Π΅ΠΌ id ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅ΠΊΠ° ΠΈΠ· поисковой Π²Ρ‹Π΄Π°Ρ‡ΠΈ.
    # ΠΌΠ΅Ρ‚ΠΎΠ΄ split() сдСлаСт список ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ строчки.eя
    # Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° playlist_add_items(), ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π΅Π³ΠΎ Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° список.
    return track_id['tracks']['items'][0]['id'].split()
    

sp.search(q=query, limit=1, type='track') – ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поискового запроса query.

НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ transfer_playlists, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ плСйлисты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚Π°ΠΊ ΠΈ Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Π΅:

transfer.py
        # функция, пСрСносящая плСлисты
def transfer_playlists(yandex_username, playlists_for_spotify):
    # авторизуСмся Π² Spotify
    sp, username = autorisation()
    # playlists_for_spotify – плСйлисты ΠΈΠ· ЯндСкс ΠœΡƒΠ·Ρ‹ΠΊΠΈ (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒ)
    # плСйлисты Π±Π΅Ρ€Π΅ΠΌ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ get_liked_playlists() ΠΈ get_my_playlists()
    # создадим плСйлисты
    for i in range(len(playlists_for_spotify)):
        # сдСлаСм список ΠΈΠ· ΠΊΠ»ΡŽΡ‡Π΅ΠΉ/Π½Π°Π·Π²Π°Π½ΠΈΠΉ плСйлистов
        playlist_name = list(playlists_for_spotify.keys())[i]
        # создадим Π² Spotify плСйлист с ΠΈΠΌΠ΅Π½Π΅ΠΌ (playlist_name)
        create_spotify_playlist = sp.user_playlist_create(username, playlist_name)
        # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id созданного плСйлиста
        new_spotify_playlist_id = create_spotify_playlist['id']
        # number_of_tracks – количСство Ρ‚Ρ€Π΅ΠΊΠΎΠ² Π² плСйлистС playlist_name
        number_of_tracks = range(len(playlists_for_spotify[playlist_name]))
        new_spotify_playlist = {}
    

create_spotify_playlist – создаСт пустой плСйлист Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ· ЯМ.

number_of_tracks – количСство Ρ‚Ρ€Π΅ΠΊΠΎΠ² Π² плСйлистС.

transfer.py
               # Π΄ΠΎΠ±Π°Π²ΠΈΠΌ пСсни Π² плСйлист Spotify
        for j in number_of_tracks:
            try:
                # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ имя исполнитСля
                artist_name = playlists_for_spotify[playlist_name][j]['artist_name']
                # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΊΠ°
                track_name = playlists_for_spotify[playlist_name][j]['track_name']
                # query – поисковый запрос Π² Spotify, состоящий ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ исполнитСля (artist_name), ΠΏΡ€ΠΎΠ±Π΅Π»Π° (' ') ΠΈ названия Ρ‚Ρ€Π΅ΠΊΠ° (track_name)
                query = ' '.join([artist_name,  track_name])
                # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅ΠΊΠ° Π² Spotify
                spotify_track_id = get_track_id(query, sp)
                # Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ id Ρ‚Ρ€Π΅ΠΊΠ° (ΠΊΠ»ΡŽΡ‡) ΠΈ id плСйлиста (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅)
                new_spotify_playlist[spotify_track_id[0]] = new_spotify_playlist_id
            except:
                pass

        # Ссли плСйлист пустой (Ρ‚Ρ€Π΅ΠΊΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Spotify), Ρ‚ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· Spotify
        if all(query == '' for query in new_spotify_playlist.values()):
            sp.user_playlist_unfollow(username, new_spotify_playlist_id)
            continue

        # Ссли Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π΅ΡΡ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ‚Ρ€Π΅ΠΊ, Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Ρ€Π΅ΠΊ(ΠΈ) Π² плСйлист Spotify
        else:
            for new_spotify_playlist_id, track_id in new_spotify_playlist.items():
                sp.playlist_add_items(track_id, new_spotify_playlist_id.split())
    
  1. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈ записываСм ΠΈΡ… ID ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ new_spotify_playlist.
  2. if all(query == '' for query in new_spotify_playlist.values()) – Ссли всС значСния словаря пустыС, Π·Π½Π°Ρ‡ΠΈΡ‚ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, подкасты ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ исполнитСли.
  3. sp.user_playlist_unfollow(username, new_spotify_playlist_id) – удаляСт пустой плСйлист ΠΈΠ· Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ.

Π›Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Π΅ плСйлисты

Π›Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Π΅ плСйлисты создали Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Π½ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ… пСрСнСсти Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ свои плСйлсты. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ» get_music_data ΠΈ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_liked_playlists_data(), которая создаСт ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ID Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Ρ… плСйлистов, ΠΈΡ… названиями ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡΠΎΠ·Π΄Π°Π²ΡˆΠΈΡ… плСйлист.

get_music_data.py
        # функция, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с id Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Ρ… плСйлистов, ΠΈΡ… названиями
# ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΡΠΎΠ·Π΄Π°Π²ΡˆΠΈΡ… плСйлист
def get_liked_playlists_data(yandex_username):
    # создадим ссылку Π½Π° плСйлист
    url = ''.join(['https://music.yandex.ru/users/', yandex_username, '/playlists/'])
    # создадим ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ страницу с плСйлистами ΠΈΠ· Ρ€Π°Π·Π΄Π΅Π»Π° Β«Π’Π°ΠΊΠΆΠ΅ Π²Π°ΠΌ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΈΡΡŒ эти плСйлисты»
    driver = get_local_html_page(yandex_username, 'playlist_page', url)
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ массив с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ плСйлистов
    json = driver.execute_script('return Mu')
    # создадим ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запишСм имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, создавшСго плСйлист, id ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста
    liked_playlists_data = {}
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ всС Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹Ρ… плСйлистах
    bookmarked_playlists_data = json['pageData']['bookmarks']
    # Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ liked_playlists_data
    for i in range(len(bookmarked_playlists_data)):
        try:
            # создадим Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ плСйлиста
            liked_playlists_data[i] = {}
            # запишСм Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ id плСйлиста
            liked_playlists_data[i]['id'] = bookmarked_playlists_data[i]['kind']
            # запишСм Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
            liked_playlists_data[i]['yandex_username'] = bookmarked_playlists_data[i]['owner']['login']
            # запишСм Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста
            liked_playlists_data[i]['playlist_title'] = bookmarked_playlists_data[i]['title']
        except:
            pass

    # ΡƒΠ΄Π°Π»ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ»
    delete_local_html_page('playlist_page.html')

    return liked_playlists_data
    

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° страницу своих плСйлистов, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ содСрТимоС ΠΈΠ· массива Mu ΠΈ создаСм ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ID плСйлиста, Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ создавшСго плСйлист.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ get_liked_playlists(), которая ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° страничку Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Ρ… плСйлистов ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ названия Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΈ исполнитСлСй

get_music_data.py
        # функция, которая ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° страничку Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Ρ… плСйлистов ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ названия Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΈ исполнитСлСй
def get_liked_playlists(yandex_username):
    # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ id плСйлистов, ΠΈΡ… названия ΠΈ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, создавшСго плСйлист
    liked_playlists_data = get_liked_playlists_data(yandex_username)
    # создадим ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запишСм Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста, Ρ‚Ρ€Π΅ΠΊΠΎΠ² ΠΈ имя исполнитСля
    liked_playlists_for_spotify = {}

    for key, value in liked_playlists_data.items():
        # ΠΊΠ»ΡŽΡ‡ – порядковый Π½ΠΎΠΌΠ΅Ρ€ плСйлиста Π² словарС liked_playlists_data, Π° значСния – имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ id плСйлиста
        # создадим ссылку Π½Π° плСйлист ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
        url = ''.join(['https://music.yandex.ru/users/',
                      str(value['yandex_username']), '/playlists/', str(value['id'])])
        # создадим ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ html-страницу плСйлиста
        driver = get_local_html_page(yandex_username, str(key), url)
        # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ массив с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ плСйлистов
        json = driver.execute_script('return Mu')
        # создадим ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запишСм Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈ имя исполнитСлСй
        liked_playlists = {}
        # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΈΠ· json Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ id Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ id альбома Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ track_id:album_id
        all_track_ids = json['pageData']['playlist']['trackIds']
        # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста
        playlist_name = json['pageData']['playlist']['title']

    

Π’ этом Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹:

  1. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° страницу плСйлиста.
  2. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ID Ρ‚Ρ€Π΅ΠΊΠΎΠ² Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ID_Ρ‚Ρ€Π΅ΠΊΠ°:ID_альбома.
get_music_data.py
                # запишСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° исполнитСлСй
        for i in range(len(all_track_ids)):
            try:
                # ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ id Ρ‚Ρ€Π΅ΠΊΠ°
                track_id = re.findall(r'\d+(?=:)', all_track_ids[i])[0]
                # ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° страницу Ρ‚Ρ€Π΅ΠΊΠ°
                driver.get(''.join(['https://music.yandex.ru/track/', track_id]))
                # создадим Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ плСйлиста
                liked_playlists[i] = {}

                # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΊΠ° ΠΈΠ· Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ
                try:
                    liked_playlists[i]['track_name'] = driver.find_elements_by_xpath("//span[@class='']//a[@class='d-link deco-link']")[0].text
                except:
                    liked_playlists[i]['track_name'] = ['']

                # ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ имя исполнитСля ΠΈΠ· Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ
                try:
                    liked_playlists[i]['artist_name'] = driver.find_elements_by_xpath(
                        "//span[@class='d-artists']//a[@class='d-link deco-link']")[0].text
                except:
                    liked_playlists[i]['artist_name'] = ['']

            except:
                pass

        # запишСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста, Π΅Π³ΠΎ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° исполнитСлСй
        liked_playlists_for_spotify[playlist_name] = liked_playlists
        # ΡƒΠ΄Π°Π»ΠΈΠΌ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ html-Ρ„Π°ΠΉΠ»
        delete_local_html_page(str(key) + '.html')

        # Π·Π°ΠΊΡ€ΠΎΠ΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€
        driver.quit()

    return liked_playlists_for_spotify
    

Π—Π΄Π΅ΡΡŒ:

  • Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСгулярного выраТСния ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ID Ρ‚Ρ€Π΅ΠΊΠ°.
  • ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π½Π° страницу Ρ‚Ρ€Π΅ΠΊΠ°.
  • ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€Π΅ΠΊΠ° ΠΈ имя исполнитСля.
  • ЗаписываСм Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ плСйлиста, Π΅Π³ΠΎ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° исполнитСлСй.

Π›Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Π΅ плСйлисты пСрСносим Ρ‡Π΅Ρ€Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ transfer_playlsits().

ЗапускаСм ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ ΠΌΡƒΠ·Ρ‹ΠΊΠΈ

Π’ ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π° transfer.py напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main(), которая пСрСнСсСт всю Ρ„ΠΎΠ½ΠΎΡ‚Π΅ΠΊΡƒ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ.

transfer.py
        def main(yandex_username):
    # пСрСнос плСйлиста «МнС нравится» ΠΈ Π»ΠΈΡ‡Π½Ρ‹Ρ… плСйлистов
    #transfer_playlists(yandex_username, get_my_playlists(yandex_username))
    # пСрСнос Π»Π°ΠΉΠΊΠ½ΡƒΡ‚Ρ‹Ρ… плСйлистов
    #transfer_playlists(yandex_username, get_liked_playlists(yandex_username))
    # пСрСнос альбомов
    transfer_albums(yandex_username, get_albums(yandex_username))


if __name__ == "__main__":
    yandex_username = 'имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ'
    main(yandex_username)
    
GitHub
Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π½Π° экран процСсса пСрСноса доступСн Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ yandex-music-to-spotify Π½Π° GitHub. ΠŸΠ»Π΅ΠΉΠ»ΠΈΡΡ‚Ρ‹ пСрСносятся Π΄ΠΎΠ»Π³ΠΎ, поэтому ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ сначала пСрСнСсти Π°Π»ΡŒΠ±ΠΎΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ скрипт.

ΠΠ»ΡŒΠ±ΠΎΠΌΡ‹ пСрСносятся Ρ‚Π°ΠΊ:

🎼 ΠŸΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌ Ρ‚Ρ€Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Spotify с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python
***

ΠœΡ‹ написали скрипт для пСрСноса всСй Ρ„ΠΎΠ½ΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ· ЯндСкс.ΠœΡƒΠ·Ρ‹ΠΊΠΈ Π² Π‘ΠΏΠΎΡ‚ΠΈΡ„Π°ΠΉ ΠΈ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ:

  • Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Selenium;
  • ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… JavaScript ΠΈ ΠΈΠ· html-Ρ‚Π΅Π³ΠΎΠ²;
  • Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс получСния Π΄Π°Π½Π½Ρ‹Ρ…;
  • ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Π»ΠΈ Π½Π°Π²Ρ‹ΠΊ Ρ€Π°Π±ΠΎΡ‚Ρ‹ со словарями Python.

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅:

– ОсваиваСм парсинг сайта: ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π» Π½Π° Python

– Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π΄Π°Ρ‚Π°-Турналиста #2: Π²Π΅Π±-скрапинг, парсинг ΠΈ визуализация Π΄Π°Π½Π½Ρ‹Ρ…

– Π’Π΅Π±-скрапинг ΠΏΠΎ Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ с Django ΠΈ Heroku

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Senior Java Developer
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования
Java Team Lead
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•