Π₯ΠΎΡΠ΅ΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ IT-ΠΈΠ½ΡΠ΅ΡΠ²ΡΡ?

ΠΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡΡΡ: ΡΡΡΠ΅ΡΡ, Π°Π»Π³ΠΎΡΠΈΡΠΌΡ, Π²ΠΎΠΏΡΠΎΡΡ, ΠΎΡ ΠΊΠΎΡΠΎΡΡΡ Π³ΠΎΠ»ΠΎΠ²Π° ΠΈΠ΄ΡΡ ΠΊΡΡΠ³ΠΎΠΌ. ΠΠΎ Ρ AI ΡΡΠ΅Π½Π°ΠΆΡΡΠΎΠΌ Π²ΡΡ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠΎΡΠ΅.
💡 ΠΠΎΡΠ΅ΠΌΡ Π’1 ΡΡΠ΅Π½Π°ΠΆΡΡ β ΡΡΠΎ ΠΌΠ°ΡΡΡ ΡΠ²?
- ΠΠΎΠ»ΡΡΠΈΡΡ Π½Π°ΡΡΠΎΡΡΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ: Π³Π΄Π΅ Π·Π°ΡΡΠΊ, ΡΡΠΎ ΠΏΠΎΠ΄ΡΡΠ½ΡΡΡ ΠΈ ΠΊΠ°ΠΊ ΡΡΠ°ΡΡ Π»ΡΡΡΠ΅
- ΠΠ°ΡΡΠΈΡΡΡΡ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΡΠ°ΡΡ Π·Π°Π΄Π°ΡΠΈ, Π½ΠΎ ΠΈ ΠΎΠ±ΡΡΡΠ½ΡΡΡ ΡΠ²ΠΎΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΈΠ½ΡΠ΅ΡΠ²ΡΡΠ΅Ρ ΡΠΊΠ°Π·Π°Π»: "ΠΠ°Ρ!".
- ΠΡΠ²ΠΎΠΈΡΡ Π²ΡΠ΅ ΡΡΠ°ΠΏΡ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΡ, ΠΎΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΏΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌ Π΄ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³Π° ΠΎ ΡΠ²ΠΎΠΈΡ ΡΠ΅Π»ΡΡ .
ΠΠ°ΡΠ΅ΠΌ Π»ΠΈΡΡΠ°ΡΡ ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ ΡΡΡΠΎΡΠΈΠ°Π»ΠΎΠ²? ΠΡΠΎΡΡΠΎ Π·Π°ΠΉΠ΄ΠΈ Π² Π’1 ΡΡΠ΅Π½Π°ΠΆΡΡ, ΠΏΠΎΡΡΠ΅Π½ΠΈΡΡΠΉΡΡ ΠΈ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎ ΡΠ΄ΠΈΠ²ΠΈ ΠΈΠ½ΡΠ΅ΡΠ²ΡΡΠ΅ΡΠΎΠ². ΠΡ Π½Π΅ ΠΎΠ±Π΅ΡΠ°Π΅ΠΌ Π»ΡΠ³ΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ»ΠΊΠΈ, Π½ΠΎ ΠΎΠ±Π΅ΡΠ°Π΅ΠΌ, ΡΡΠΎ Π±ΡΠ΄Π΅ΡΡ Π³ΠΎΡΠΎΠ²!
Π Π΅ΠΊΠ»Π°ΠΌΠ°. ΠΠΠ Β«Π‘ΠΌΠ°ΡΡ ΠΠΈΠΊΠΎΒ», ΠΠΠ 7743264341. Erid 2VtzqwP8vqy
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΊΡΠΈΠΏΡΠ°:
- ΠΏΠ΅ΡΠ΅Π½ΠΎΡ Π°Π»ΡΠ±ΠΎΠΌΠΎΠ²;
- ΠΏΠ΅ΡΠ΅Π½ΠΎΡ ΡΠ²ΠΎΠΈΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ² ΠΈ ΡΡΠ΅ΠΊΠΎΠ² ΠΈΠ· ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠ° Β«ΠΠ½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡΒ»;
- ΠΏΠ΅ΡΠ΅Π½ΠΎΡ Π»Π°ΠΉΠΊΠ½ΡΡΡΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ².
ΠΠ΅ΡΠ²ΡΡ ΡΠ°ΡΡΡ ΠΏΡΡΠΈ ΠΌΡ ΠΏΡΠΎΠΉΠ΄Π΅ΠΌ ΠΎΠΊΠΎΠ»ΡΠ½ΡΠΌ ΠΏΡΡΠ΅ΠΌ: ΡΡΠΎΠ±Ρ ΡΠ΅ΠΌΡ-ΡΠΎ Π½Π°ΡΡΠΈΡΡΡΡ ΠΎΡΠΊΠ°ΠΆΠ΅ΠΌΡΡ ΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ yandex-music-api
ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄Π°Π½Π½ΡΠ΅ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΡΠΊΠ°ΠΌΠΈ. ΠΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΈ ΠΏΡΡΠΈ ΠΊ Π½Π°ΠΌ Π½Π° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΠ΄Π΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° spotipy, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅Ρ Π² Π‘ΠΏΠΎΡΠΈΡΠ°ΠΉ Π²ΡΠ΅ Π»ΠΈΡΠ½ΡΠ΅ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ, Π»Π°ΠΉΠΊΠ½ΡΡΡΠ΅ ΡΡΠ΅ΠΊΠΈ ΠΈ Π°Π»ΡΠ±ΠΎΠΌΡ. ΠΠΎΠ΅Ρ
Π°Π»ΠΈ!
ΠΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ Π°Π»ΡΠ±ΠΎΠΌΡ
Π£ Π―Π½Π΄Π΅ΠΊΡ.ΠΡΠ·ΡΠΊΠΈ (Π―Π) Π½Π΅Ρ API. Π‘ΠΎΠ²ΡΠ΅ΠΌ. ΠΠΎΡΡΠΎΠΌΡ Π΄Π°Π½Π½ΡΠ΅ Π½Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π±ΡΠ°ΡΡ ΡΠΎ ΡΡΡΠ°Π½ΠΈΡ Π―Π. ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π½Π° ΡΠ²ΠΎΡ ΡΡΡΠ°Π½ΠΈΡΡ Π―Π Π² ΡΠ°Π·Π΄Π΅Π» Π°Π»ΡΠ±ΠΎΠΌΡ ΠΈ Π½Π°ΡΠ½Π΅ΠΌ ΠΏΠΎΠΈΡΠΊ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ, ΠΎΡΠΊΡΡΠ² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (Ctrl + Shift + i
Π² Chrome ΠΈ FireFox).
Π ΡΠ΅Π»Π΅ ΡΡΡΠ°Π½ΠΈΡΡ Ρ Π°Π»ΡΠ±ΠΎΠΌΠ°ΠΌΠΈ Π΅ΡΡΡ JSON-ΠΌΠ°ΡΡΠΈΠ² Mu
, ΠΊΠΎΡΠΎΡΡΠΉ Π² Π΄Π²ΡΡ
ΠΊΠ»ΡΡΠ°Ρ
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΎΠ± Π°Π»ΡΠ±ΠΎΠΌΠ΅: Π΅Π³ΠΎ ID, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ:

C ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Mu
Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ ΡΠ°ΠΌΠΎΠ΅ ΡΠ΅Π½Π½ΠΎΠ΅ β ID Π°Π»ΡΠ±ΠΎΠΌΠΎΠ², ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ² ΠΈ ΡΡΠ΅ΠΊΠΎΠ², ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ ID Π±ΡΠ΄Π΅Ρ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π»ΡΡ Π½Π° Π²ΡΠ΅ΠΌ ΠΏΡΡΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ.
- ΠΠ΅ΡΠ²ΡΠΉ ΠΊΠ»ΡΡ β
albumIds
β ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ID Π²ΡΠ΅Ρ Π°Π»ΡΠ±ΠΎΠΌΠΎΠ², Π½ΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ ΠΈΠ· ΡΠ΅Π³ΠΎΠ². - ΠΡΠΎΡΠΎΠΉ ΠΊΠ»ΡΡ β
albums
β ΡΡΠ°Π·Ρ Π²ΡΠ΄Π°Π΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠ΅ 150 ΠΏΠ°Ρ (ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΡΡΡ Π½Π° ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ ΡΠΎΠΆΠ΅).

ΠΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΠ΅ΡΠ²ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π²ΡΠ΅ Π°Π»ΡΠ±ΠΎΠΌΡ.
ΠΠ°ΠΊ Π²ΡΠ²Π΅ΡΡΠΈ json Π² Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠ°Π΅ΠΌΠΎΠΌ Π²ΠΈΠ΄Π΅, ΠΊΠ°ΠΊ Π½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ΅ Π²ΡΡΠ΅?
Π§Π΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ pprint
:
from pprint import pprint
pprint(json)
ΠΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ?
ΠΠΎΠ»ΡΡΠΈΠ² ID, ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Π°Π»ΡΠ±ΠΎΠΌΠ° https://music.yandex.ru/album/ID_Π°Π»ΡΠ±ΠΎΠΌΠ°
. ΠΠ· ΡΠ΅Π³ΠΎΠ² ΡΠ·Π½Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ. ΠΠΎΠΏΡΡΡΠΈΠΌ, Π² Π½Π°ΡΠ΅ΠΉ ΡΠΎΠ½ΠΎΡΠ΅ΠΊΠ΅ Π΅ΡΡΡ Π°Π»ΡΠ±ΠΎΠΌ Β«Greatest Hits In JapanΒ» β Queen. ΠΡΠΊΡΠΎΠ΅ΠΌ ΡΡΡΠ°Π½ΠΈΡΡ Π°Π»ΡΠ±ΠΎΠΌΠ°.
Π Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΈ Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π‘Π΅Π»Π΅ΠΊΡΠΎΡ (Ctrl + Shift + C
):

Π ΠΏΡΠΎΡΡΠΎ ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ Π°Π»ΡΠ±ΠΎΠΌΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅:

Π’Π΅Π³ <h1>
Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π°Π»ΡΠ±ΠΎΠΌΠ° Π½Π°ΠΉΠ΄Π΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ:

Π’Π΅Π³ <a>
Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ:

ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ , Selenium
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Selenium ΡΠΌΠ΅Π΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠΌ ΠΈ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΉ. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ Selenium
ΠΌΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π±ΡΠ°ΡΠ·Π΅ΡΠ°: ΠΎΡΠΊΡΡΡΠΈΠ΅ ΡΡΡΠ°Π½ΠΈΡ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ², Π°Π»ΡΠ±ΠΎΠΌΠΎΠ² ΠΈ ΡΡΠ΅ΠΊΠΎΠ².
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Selenium
:
pip install selenium
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π΄ΡΠ°ΠΉΠ²Π΅Ρ Chrome:
sudo apt-get install chromium-chromedriver
Chromedriver ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π² /usr/lib/chromium-browser/chromedriver
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΎΠ± Π°Π»ΡΠ±ΠΎΠΌΠ΅:
- ΠΠ°ΠΉΡΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΎ ΡΠ²ΠΎΠΈΠΌΠΈ/ΡΡΠΆΠΈΠΌΠΈ Π°Π»ΡΠ±ΠΎΠΌΠ°ΠΌΠΈ.
- ΠΠΎΠ»ΡΡΠΈΡΡ ID Π°Π»ΡΠ±ΠΎΠΌΠΎΠ² ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°
Mu
. - ΠΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ Π½Π°ΠΉΡΠΈ Π² ΡΠ΅Π³Π°Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ.
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΠ°ΠΏΠΊΡ proglib
, Π° Π² Π½Π΅ΠΉ ΡΠ°ΠΉΠ» get_music_data.py
.
ΠΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Selenium ΠΈ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ run_driver()
, Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ:
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
Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎ.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
- ΠΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΡΡΡΠ°Π½ΠΈΡΠ΅ Π―Π.
- Π‘ΠΎΠ·Π΄Π°ΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ html-ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² Π½Π΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Π―Π.
- ΠΠ·Π²Π»Π΅ΡΡ ΠΌΠ°ΡΡΠΈΠ²
Mu
. - Π£Π΄Π°Π»ΠΈΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ.
ΠΠ°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ create_local_html_page()
, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ html-ΡΠ°ΠΉΠ» ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅Ρ Π΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈΠ· Π―Π:
# ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΎΠ·Π΄Π°ΡΡΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ 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
ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ:
# ΡΡΠ½ΠΊΡΠΈΡ, ΠΎΡΠΊΡΡΠ²Π°ΡΡΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ 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()
ΡΠ΄Π°Π»ΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ:
# ΡΡΠ½ΠΊΡΠΈΡ, ΡΠ΄Π°Π»ΡΡΡΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ html-ΡΠ°ΠΉΠ»
def delete_local_html_page(page_path):
os.remove(page_path)
ΠΠ΄Π΅ΡΡ:
page_path
β ΠΏΡΡΡ ΠΊ html-ΡΠ°ΠΉΠ»Ρ.
ΠΠΎΠ»ΡΡΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ get_albums()
:
# ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΎΠ·Π΄Π°ΡΡΠ°Ρ ΡΠ»ΠΎΠ²Π°ΡΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ Π°Π»ΡΠ±ΠΎΠΌΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΉ
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']
Π ΡΡΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΌΡ:
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Π°Π»ΡΠ±ΠΎΠΌΠΎΠ² Π―Π ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π²ΡΠ΅Ρ Π°Π»ΡΠ±ΠΎΠΌΠΎΠ².
- ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± Π°Π»ΡΠ±ΠΎΠΌΠ°Ρ
ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°
Mu
. - ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ID Π²ΡΠ΅Ρ Π°Π»ΡΠ±ΠΎΠΌΠΎΠ².
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ
albums_for_spotify
, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΠΈΡΠ΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ.
# Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ 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
ΠΠ΄Π΅ΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
- ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ Π°Π»ΡΠ±ΠΎΠΌΠ° Π―Π.
- Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Π»ΡΠ±ΠΎΠΌΠ°, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ.
- ΠΠ΅ΡΠΎΠ΄
xpath
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΊΠ°ΡΡ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π΄ΡΡΠ³ Π² Π΄ΡΡΠ³Π° ΡΠ΅Π³ΠΈ ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΠΈΠ· Π½ΠΈΡ ΡΠ΅ΠΊΡΡ. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π°ΠΉΠ΄Π΅ΠΌ Π² ΠΊΠΎΠ΄Π΅ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ΅Π³<h1>
Ρ ΠΊΠ»Π°ΡΡΠΎΠΌdeco-typo
. Π ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ΅ΠΊΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉΡΡ Π² ΡΠ΅Π³Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ.text
. - ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π² ΡΠ»ΠΎΠ²Π°ΡΡ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π°Π»ΡΠ±ΠΎΠΌΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ.
- Π£Π΄Π°Π»ΡΠ΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ Π°Π»ΡΠ±ΠΎΠΌΠ°ΠΌΠΈ Π―Π.
- ΠΠ°ΠΊΡΡΠ²Π°Π΅ΠΌ Π±ΡΠ°ΡΠ·Π΅Ρ
Π ΠΈΡΠΎΠ³Π΅ ΡΠ»ΠΎΠ²Π°ΡΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
{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
:

Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΠΏΠΎΠ»Ρ ΠΈ Π½Π°ΠΆΠΌΠ΅ΠΌ Create
:

ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎ Π½Π΅ΠΌΡ ΠΈ Π½Π°ΠΉΠ΄Π΅ΠΌ Client ID
ΠΈ Client Secret
:

ΠΠ°ΠΉΠ΄Π΅ΠΌ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:

ΠΈ Π²ΠΏΠΈΡΠ΅ΠΌ Π² ΠΏΠΎΠ»Π΅ Redirect URIs
Π°Π΄ΡΠ΅Ρ http://localhost:8888/callback/
:

Π‘ΠΎΡ ΡΠ°Π½ΠΈΠΌ ΠΈ Π·Π°ΠΊΡΠΎΠ΅ΠΌ.
ΠΠ°Π»ΡΡΠ΅ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π²ΡΠΎΡΠΎΠΉ ΡΠ°ΠΉΠ» transfer.py
Π΄Π»Ρ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Π² Spotify
ΡΠ΅ΡΠ΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ spotify
ΠΈ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° Π°Π»ΡΠ±ΠΎΠΌΠΎΠ² (Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ², Π½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ ΠΏΠΎΠ·ΠΆΠ΅).
ΠΠ°ΠΏΠΈΡΠ΅ΠΌ Π² 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 Π°Π»ΡΠ±ΠΎΠΌΠ°:
# ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠ°Ρ 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()
:
# ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° Π°Π»ΡΠ±ΠΎΠΌΠΎΠ²
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
), ΡΠΎ ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ ΠΈ Π½Π°ΡΠ°ΡΡ ΡΠ½Π°ΡΠ°Π»Π°.
ΠΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ
ΠΠ»Π΅ΠΉΠ»ΠΈΡΡΡ Π΄Π΅Π»ΡΡΡΡ Π½Π° Π΄Π²Π° Π²ΠΈΠ΄Π°:
- ΠΠ»Π΅ΠΉΠ»ΠΈΡΡ Β«ΠΠ½Π΅ ΠΏΠΎΠ½ΡΠ°Π²ΠΈΠ»ΠΎΡΡΒ» ΠΈ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ.
- ΠΠ°ΠΉΠΊΠ½ΡΡΡΠ΅ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ.
ΠΠΎΠΈ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ
ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
- ΠΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° ΡΡΡΠ°Π½ΡΡ Π²ΡΠ΅Ρ
ΠΏΠ»Π΅Π»ΠΈΡΡΠΎΠ² ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
https://music.yandex.ru/users/yandex_username/playlists/
. - ΠΠΎΠ»ΡΡΠΈΡΡ ID ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ² ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°
Mu
. - ΠΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠ° ΠΏΠΎ Π΅Π³ΠΎ ID.
- ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΎ ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠ° ID ΡΡΠ΅ΠΊΠΎΠ² ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°
Mu
. - ΠΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΡΠ΅ΠΊΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΡ Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈΠ· ΡΠ΅Π³ΠΎΠ².
ΠΠ΅ΡΠ½Π΅ΠΌΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ get_music_data.py
ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² Π½Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΡ get_my_playlists_id
Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ID Π°Π»ΡΠ±ΠΎΠΌΠΎΠ² Π½Π° Π―Π:
# ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠ°Ρ 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
Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° ΡΠ²ΠΎΠΈΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ²:
# ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΎΠ·Π΄Π°ΡΡΠ°Ρ ΡΠ»ΠΎΠ²Π°ΡΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ Π»ΠΈΡΠ½ΡΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ², ΡΡΠ΅ΠΊΠΎΠ² ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΉ
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 ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΡΠ΅ΠΊΠ° ΠΈ ΠΈΠΌΡ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Ρ:
# Π·Π°ΠΏΠΎΠ»Π½ΠΈΠΌ ΡΠ»ΠΎΠ²Π°ΡΡ 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 ΡΡΠ΅ΠΊΠ° Π² Π‘ΠΏΠΎΡΠΈΡΠ°ΠΉ:
# ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎΠ»ΡΡΠ°ΡΡΠ°Ρ 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
, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡ ΠΊΠ°ΠΊ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠ°ΠΊ ΠΈ Π»Π°ΠΉΠΊΠ½ΡΡΡΠ΅:
# ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡΡΠ°Ρ ΠΏΠ»Π΅Π»ΠΈΡΡΡ
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
β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ΅ΠΊΠΎΠ² Π² ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠ΅.
# Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ΅ΡΠ½ΠΈ Π² ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡ 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())
- ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΡΠ΅ΠΌ Π² Π‘ΠΏΠΎΡΠΈΡΠ°ΠΉ ΡΡΠ΅ΠΊΠΈ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΈΡ
ID ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠ° Π² ΡΠ»ΠΎΠ²Π°ΡΡ
new_spotify_playlist
. if all(query == '' for query in new_spotify_playlist.values())
β Π΅ΡΠ»ΠΈ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΏΡΡΡΡΠ΅, Π·Π½Π°ΡΠΈΡ ΡΡΠ΅ΠΊΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ Π‘ΠΏΠΎΡΠΈΡΠ°ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΠ΄ΠΊΠ°ΡΡΡ ΠΈΠ»ΠΈ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΠΈ.sp.user_playlist_unfollow(username, new_spotify_playlist_id)
β ΡΠ΄Π°Π»ΡΠ΅Ρ ΠΏΡΡΡΠΎΠΉ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡ ΠΈΠ· Π‘ΠΏΠΎΡΠΈΡΠ°ΠΉ.
ΠΠ°ΠΉΠΊΠ½ΡΡΡΠ΅ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ
ΠΠ°ΠΉΠΊΠ½ΡΡΡΠ΅ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π»ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ, Π½ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ
ΠΏΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΡΠ²ΠΎΠΈ ΠΏΠ»Π΅ΠΉΠ»ΡΡΡ. ΠΡΠΊΡΠΎΠ΅ΠΌ ΡΠ°ΠΉΠ» get_music_data
ΠΈ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ get_liked_playlists_data()
, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ»ΠΎΠ²Π°ΡΡ Ρ ID Π»Π°ΠΉΠΊΠ½ΡΡΡΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ², ΠΈΡ
Π½Π°Π·Π²Π°Π½ΠΈΡΠΌΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΡΠΎΠ·Π΄Π°Π²ΡΠΈΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡ.
# ΡΡΠ½ΠΊΡΠΈΡ, ΡΠΎΠ·Π΄Π°ΡΡΠ°Ρ ΡΠ»ΠΎΠ²Π°ΡΡ Ρ 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()
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠΊΡ Π»Π°ΠΉΠΊΠ½ΡΡΡΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΡΠ΅ΠΊΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΉ
# ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠΊΡ Π»Π°ΠΉΠΊΠ½ΡΡΡΡ
ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΡΠ΅ΠΊΠΎΠ² ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΉ
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']
Π ΡΡΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠ΄Π° ΠΌΡ:
- ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠ»Π΅ΠΉΠ»ΠΈΡΡΠ°.
- ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ID ΡΡΠ΅ΠΊΠΎΠ² Π² ΡΠΎΡΠΌΠ°ΡΠ΅
ID_ΡΡΠ΅ΠΊΠ°:ID_Π°Π»ΡΠ±ΠΎΠΌΠ°
.
# Π·Π°ΠΏΠΈΡΠ΅ΠΌ Π² ΡΠ»ΠΎΠ²Π°ΡΡ ΡΡΠ΅ΠΊΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΉ
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()
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠ΅ΡΠ΅Π½Π΅ΡΠ΅Ρ Π²ΡΡ ΡΠΎΠ½ΠΎΡΠ΅ΠΊΡ Π² Π‘ΠΏΠΎΡΠΈΡΠ°ΠΉ.
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)
ΠΠ»ΡΠ±ΠΎΠΌΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΡΡΡΡ ΡΠ°ΠΊ:

ΠΡ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΠΊΡΠΈΠΏΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° Π²ΡΠ΅ΠΉ ΡΠΎΠ½ΠΎΡΠ΅ΠΊΠΈ ΠΈΠ· Π―Π½Π΄Π΅ΠΊΡ.ΠΡΠ·ΡΠΊΠΈ Π² Π‘ΠΏΠΎΡΠΈΡΠ°ΠΉ ΠΈ Π½Π°ΡΡΠΈΠ»ΠΈΡΡ:
- Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π±ΡΠ°ΡΠ·Π΅Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Selenium;
- ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ JavaScript ΠΈ ΠΈΠ· html-ΡΠ΅Π³ΠΎΠ²;
- Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ;
- ΠΏΡΠΎΠΊΠ°ΡΠ°Π»ΠΈ Π½Π°Π²ΡΠΊ ΡΠ°Π±ΠΎΡΡ ΡΠΎ ΡΠ»ΠΎΠ²Π°ΡΡΠΌΠΈ Python.
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»Ρ ΠΏΠΎ ΡΠ΅ΠΌΠ΅:
β ΠΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΠΏΠ°ΡΡΠΈΠ½Π³ ΡΠ°ΠΉΡΠ°: ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΡΡΡΠΎΡΠΈΠ°Π» Π½Π° Python
β ΠΠ΅Π±-ΡΠΊΡΠ°ΠΏΠΈΠ½Π³ ΠΏΠΎ ΡΠ°ΡΠΏΠΈΡΠ°Π½ΠΈΡ Ρ Django ΠΈ Heroku
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ